Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java ME (J2ME) > Ошибка 411 (PHP+J2ME+POST)


Автор: Anton Vatchenko 1.7.2006, 12:25
Недавно решил один свой проект перенести из GET в POST. Долго отлаживал все на компьютере (стоит Апач+ПХП и Виндовс ХР), заработало. Выложил на бесплатный хостинг jino-net.ru - при каждом обращении стало слетать с ошибкой 411. Вычитал, что это сервер хочет увидеть длину запроса, но я же ее передаю!
Кусок кода на J2ME:

c = (HttpConnection)Connector.open(url);
c.setRequestMethod(HttpConnection.POST);
int len=data.length;
c.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
c.setRequestProperty("Content-Length", ""+len);
os = c.openOutputStream();
os.write(data);
os.flush();
int rc = c.getResponseCode();//Вот здесь 411

PHP-код не привожу, так как до него дело не доходит. Помогите исправить. 

Автор: nagliyvred 17.7.2006, 09:37
Посмотрите логи сервера - какой запрос приходит - есть ли там Content-Length ? Как вариант, попробуйте обойтись без os.flush(). 

Автор: Dancer 17.7.2006, 11:07
http://forum.vingrad.ru/index.php?showtopic=104207 

Автор: AndriyTyurnikov 12.8.2006, 21:06
Как вариант причины бага - использование WAP-GPRS вместо INTERNET-GPRS, но это врядли.
Посему есть только 2 идеи
1) какое значение URL
2) проверь, всe ли в порядке с data


и nagliyvred говорит дело - попробуй без flush();

Автор: Lamer_Phn 19.8.2007, 20:45
Была такая же ситуация с отправкой изображения на сервер через HTTP POST. ПРишлось вместо HTTPConnection использовать SocketConnection. Заработало, но только на эмуляторе, так как Siemens CX65 мой не разрешал использовать 80 порт для Socketов, а для других портов работало нормально.
Привожу пример тела сообщения:
Код

try {
            sc = (SocketConnection)Connector.open("socket://localhost:80");

            String rn = "\r\n";
            String host = "localhost";
            String http = "http://localhost/";
            String jpgString = new String(tsnap);

            try{
            is = sc.openInputStream();
            os = sc.openOutputStream();
            String message = "POST /myup.php? HTTP/1.1"+rn+"Accept: */*"+rn+"Accept-Language: ru"+rn+"Content-Type: multipart/form-data; boundary=---------------------------7d73991305de"+rn+"Accept-Encoding: gzip, deflate"+rn+"User-Agent: Superproga"+rn+"Host: "+host+rn+"Content-Length: "+Integer.toString(tsnap.length+100)+rn+"Connection: Keep-Alive"+rn+"Cache-Control: no-cache"+rn+rn+"-----------------------------7d73991305de"+rn+"Content-Disposition: form-data; name=\"myfile\"; filename=\"c:setup.log\""+rn+"Content-Type: application/octet-stream"+rn+rn+jpgString+rn+rn+"-----------------------------7d73991305de--"+rn;
            byte[] data = message.getBytes();
             

             // Старт потока передачи сообщения
            os.write(data);
   
            } finally {
            sc.close();
            os.close();
            }               

            } catch(IOException ioe) {
            ioe.printStackTrace();
            }



причем длину сообщения подбирал: Integer.toString(tsnap.length+100). Странно, но без 100 обрабатывающий скрипт запускался, а вот данные не приходили

Автор: roman_savelev 20.6.2009, 05:15
Дело в том, что в J2ME реализация HTTP протокола такова, что размер буфера отправки данных ограничен 2 kb (в новых моделях это ограничение убрали). В случае если мидлет пытается послать более 2 kb, то HttpConnection автоматически переключается в режим отправки порциями (Transfer-Encoding: chunked) и если сервер умеет такое принимать то всё нормально передастся, иначе обычно ругается на что-то типа отсутствует поле Content Length или ещё что-нибудь. Кстати к примеру ngnix не умеет принимать порциями. Apache умеет, но на некоторых хостингах в кофигурации это отключено. В общем проблема на стороне сервере. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)