Приложение J2ME не отправляет POST-запросы - PullRequest
2 голосов
/ 17 сентября 2011

Я сейчас немного запутался.

У меня есть приложение J2ME, которое отправляет запросы POST сервлету.Это работало до тех пор, пока этим утром не прекратилось чудо.Это просто не отправит данные POST.Он свяжется с сервером, но данные запроса будут пустыми.

System.out.println(request.getParameterMap());

Всегда возвращается

{}

Я пытался проверить сетевой монитор с помощью эмулятора и увидел это

sq~wLhttp://localhost:80802xѬ2xѬ????????xsq~wLhttp://localhost:80802xѬ2xѭ????????xsq~z?http://localhost:80802xѬK2xѬ????????1316274753996
POST /amw/synch HTTP/1.1
User-Agent: Profile/MIDP-1.0 Confirguration/CLDC-1.0 UNTRUSTED/1.0
Accept_Language: en-US
Content-Type: application/x-www-form-urlencoded
Host: localhost:8080
Transfer-Encoding: chunked

56
&action=recover&email=trinisoftinc@gmail.com&password=1011001&api-key=oalkuisnetgauyno
0

xsq~z?http://localhost:80802xѬD2xѭ????????1316274754009
HTTP/1.1 200 OK
X-Powered-By: Servlet/3.0 JSP/2.2 (GlassFish Server Open Source Edition 3.1 Java/Apple Inc./1.6)
Server: GlassFish Server Open Source Edition 3.1
Content-Type: text/html;charset=UTF-8
Content-Length: 46
Date: Sat, 17 Sep 2011 15:52:33 GMT

{"message":"Server Error: null","status":500}

Я не знал, что делатьсделать это действительно.

Пожалуйста, мне нужна помощь.

Код отправки запроса ниже

public String post(String url, String query, String optionalParameters) throws IOException {
    if (optionalParameters != null) {
        url += optionalParameters;
    }

    query += "&api-key=" + APIKey;
    Echo.outln(url + ", " + query.getBytes().length);
    Echo.outln(query);
    HttpConnection connection;
    connection = (HttpConnection) Connector.open(url);

    connection.setRequestMethod(HttpConnection.POST);
    connection.setRequestProperty("User-Agent", "Profile/MIDP-1.0 Confirguration/CLDC-1.0");
    connection.setRequestProperty("Accept_Language", "en-US");
    connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
    connection.setRequestProperty("Content-Length", String.valueOf(query.getBytes().length));
    //connection.setRequestProperty("api-key", APIKey);

    OutputStream os = connection.openDataOutputStream();
    os.write(query.getBytes());
    os.flush();
    if (connection.getResponseCode() == HttpConnection.HTTP_OK) {
        InputStream is = connection.openInputStream();
        int ch;
        StringBuffer buffer = new StringBuffer();

        while((ch = is.read()) != -1) {
            buffer.append((char) ch);
        }            

        try {
            is.close();
            connection.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return buffer.toString();
    } else {
        String retval = connection.getResponseMessage() + " : " + connection.getResponseCode();
        try {
            connection.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return retval;
    }
}

Спасибо.

Примечание: у меня естьприложение для iPhone, которое вызывает тот же сервлет и прекрасно работает.

Ответы [ 4 ]

2 голосов
/ 21 сентября 2011

Так что дело имеет значение. Этот пост Http пост от J2ME спас мне жизнь.

Оскорбительная строка

connection.setRequestProperty("Content-Length", "" + query.getBytes().length);

Вместо

connection.setRequestProperty("Content-length", "" + query.getBytes().length);

ПРИМЕЧАНИЕ: строчная буква l, а не заглавная буква L.

После этого изменения мир снова выглядит прекрасным

0 голосов
/ 17 сентября 2011

Глядя на ваш код, я действительно не вижу, что с ним не так.Я смог использовать этот фрагмент (см. Ниже), чтобы сделать запрос POST из приложения J2ME в серверную часть Java, и все работало хорошо.Я надеюсь, что это работает для вас.Всего наилучшего.

         HttpConnection httpConn = null;

        String url = "http://your_resource";        


        InputStream is = null;
        OutputStream os = null;
        String phonenumber ="080380012";
        String data = "Post data";
        try {



                httpConn = (HttpConnection) Connector.open(url);                     
                httpConn.setRequestMethod(HttpConnection.POST);
                httpConn.setRequestProperty("User-Agent",
                                "Profile/MIDP-1.0 Confirguration/CLDC-1.0");
                httpConn.setRequestProperty("Accept_Language", "en-US");                                    

                httpConn.setRequestProperty("Content-Type",
                                "application/x-www-form-urlencoded");          

                os = httpConn.openOutputStream();       
                String params;
                params = "URL=" + data;
                params += "&Phone=" + phonenumber;

                os.write(params.getBytes());


                os.flush();
    ///parsing the xml response.... this part depends on what you are returning from the server
                    XmlParser parser = new XmlParser(new InputStreamReader(httpConn.openInputStream()));
                org.kxml.kdom.Document doc = new org.kxml.kdom.Document();
                doc.parse(parser);
                   /// work with the parsed data
                }
                catch (Exception ex)
        {
                System.out.println(ex.getMessage()+ "exception Ex");

        }      

        finally {
                if (is != null)
                        is.close();
                if (os != null)
                        os.close();
                if (httpConn != null)
                        httpConn.close();
        }
0 голосов
/ 19 сентября 2011

Лучший из известных мне способов публикации на URL-адресе - использовать этот учебник на HttpMultipart .Попробуй!

0 голосов
/ 17 сентября 2011

Прежде всего, я думаю, что мы можем видеть POST с некоторыми странными символами (xѬ2xѬ ??).Может быть полезно увидеть правильные.

Следующий пункт - POST, похоже, отправлен, но ответ от сервера плохой (посмотрите на сообщение «Ошибка сервера: ноль» со статусом 500).Итак, вы тестировали отправку того же поста из браузера, используя, например, простую форму HTML?А что с сервером?Вы проанализировали трассировку стека с ошибкой?В процессе запроса на сервере, похоже, что-то не так.

...