пятница, 14 сентября 2012 г.

Java ME. Проблемы при установке соединения при использовании JSON.

 Недавно кодила небольшой проект для сотовых телефонов. Это был простой мидлет, который отправлял определенный запрос на сервер, получал ответ и показывал его пользователю. Я несколько лет уже писала небольшие программы для телефонов. И написать эту программу быстро, мне не составило труда. Отличие этой программы от других моих программ, в которых тоже были соединения с сервером - стало использование JSON. Написав приложение, провела тесты на своем стареньком, но замечательном телефоне Sony Ericsson. Программа заработала! Все было бы замечательно, если бы эта программа должна работать только на этом телефоне. После проведения тестовых запусков на других моделях телефона, я расстроилась. На них приложение ни в какую не устанавливало соединение. Обычно, при установке соединения, в телефоне появляется соответствующий значок - глобус, буква Е и т.д. Эти значки говорят о том, что телефон устанавливает интернет-соединение. А тут какая-то чертовщина. Телефон выдавал запрос на подтверждение выхода в интернет, я ему разрешала и он в ответ писал "Нет соединения. error in http operation". Перерыла весь интернет в поисках ответа. Все что смогла найти, это рекомендации по настройки точки доступа правильно. Я могла бы с этим согласиться, если бы не одно но! Другие приложения на этих "тестовых" телефонах спокойно выходили в интернет. На некоторое время я забыла про эту проблему, возникло много другой работы. Но пришло время, когда проект надо было показать. Поэтому пришлось заново взяться за эту задачу. Начала "установку соединения" с нуля. Попробовала отправку как обычно отправляла, все работает. Но стоило отправлять данные в формате JSON и все просто валилось. Привожу код, который крушил все мои надежды на то, что приложение установить соединение с сервером (кто-то может уже увидит ошибку=) ):
public class Connect {
...
public String Request(String url_str){
        String sBuff = null;
        String url = url_str;
        try{
            ErrorConnectMessage = "";
            con = (HttpConnection)Connector.open(url);
            con.setRequestMethod(HttpConnection.GET);//GET
            con.setRequestProperty("User-Agent","Profile/MIDP-2.0 Confirguration/CLDC-1.0");
            con.setRequestProperty("Accept_Language","en-US");
            con.setRequestProperty("Content-Type","//text plain;charset=windows-1251");
            //con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            con.setRequestProperty("Connection", "close");
            in = con.openInputStream();
            ErrorConnect = con.getResponseCode();
            if (ErrorConnect == 200){
                StringBuffer sb = new StringBuffer(); 
                int chr;
                while ((chr = in.read()) != -1)
                      sb.append((char ) ((chr >= 0xc0 && chr <= 0xFF) ? (chr + 0x350) : chr));
                sBuff =  sb.toString();          
 
                if (sBuff.equals("access denided")){
                    ErrorConnectMessage = sBuff;
                    sBuff = "";
                }
                else if (sBuff.equals("") || (sBuff == null)){
                    ErrorConnectMessage = "empty";
                    sBuff = "";
                }
                else 
                    ErrorConnectMessage = "";
            }else {
                String res = new ListOfConnectionErrors().GetErrorText(ErrorConnect);
                ErrorConnectMessage = "error."+res;
                sBuff = "";
            }
        }catch ( IllegalArgumentException e ) {
            ErrorConnectMessage = "error. Неверный URL. "+e.getMessage();
            sBuff = "";
            return sBuff;
        }catch(IOException e){
            ErrorConnectMessage="error. Нет соединения. "+e.getMessage();
            sBuff = "";
            return sBuff;
        }catch ( Exception e ) {
            ErrorConnectMessage="error. Cервер не ответил. "+e.getMessage();
            sBuff = "";
            return sBuff;
        }finally {
            nullSafeClose(in);
            nullSafeClose(con);
            System.out.println("close");
            return sBuff;
        }
    }
 
 Строка, которую передавала в функцию
 
String Value = "12аа23456789"; //символы русские
String sURL = "http://.../myrequests/?json="+"{"key":""+urlEncode(Value)+""}";

 В итоге потеряв еще полчаса до меня дошло, не без помощи моего коллеги, что я совершила "орфографическую" ошибку в своем коде. Вот так всегда бывает, пишешь приложение и глаз замыливается на столько, что банальных ошибок уже не видно. И помогает только взгляд со стороны. Я оказывается в URL обертку брала только сам параметр, который передавала на сервер и никак не задумывалась о строчке JSON с такими красивыми символами как наклонная черта, фигурные скобки. А ведь из-за них мое приложение вылетало в ошибку. Поколдовав еще 5 минут над строкой, привела ее к такому виду:
String Value = "12аа23456789"; //символы русские
String sURL = "http://.../myrequests/?json="+urlEncode("{"key":""+Value+""}");
 
 И после такого изменения в коде все телефоны, которые были в шаговой доступности от меня успешно установили соединение с сервером. Так что совет мне и всем, будьте внимательны, если в обычное, добавляете немного необычного.Проверьте еще все раз и если все безуспешно, то дайте кому-нибудь глянуть ваш код со стороны. Это очень помогает)))

Комментариев нет:

Отправить комментарий