Http Post не публикует данные - PullRequest
       55

Http Post не публикует данные

1 голос
/ 26 августа 2011

Я пытаюсь опубликовать некоторые данные из клиента Java с помощью сокетов.Он говорит с localhost, выполняющим код php, который просто выплевывает отправленные ему параметры записи.

Вот клиент Java:

 public static void main(String[] args) throws Exception {

       Socket socket = new Socket("localhost", 8888);
       String reqStr = "testString";

        String urlParameters = URLEncoder.encode("myparam="+reqStr, "UTF-8");
        System.out.println("Params: " + urlParameters);

        try {
            Writer out = new OutputStreamWriter(socket.getOutputStream(), "UTF-8");
            out.write("POST /post3.php HTTP/1.1\r\n");  
            out.write("Host: localhost:8888\r\n"); 
            out.write("Content-Length: " + Integer.toString(urlParameters.getBytes().length) + "\r\n");
            out.write("Content-Type: text/html\r\n\n");
            out.write(urlParameters);  
            out.write("\r\n");  
            out.flush();

            InputStream inputstream = socket.getInputStream();
            InputStreamReader inputstreamreader = new InputStreamReader(inputstream);
            BufferedReader bufferedreader = new BufferedReader(inputstreamreader);

            String string = null;
            while ((string = bufferedreader.readLine()) != null) {
               System.out.println("Received " + string);
            }

       } catch(Exception e) {
           e.printStackTrace();
       } finally {
         socket.close(); 
       }
 }

Вот так выглядит post3.php:

<?php

$post = $_REQUEST;

echo print_r($post, true);
?>

Я ожидаю увидеть массив (myparams => "testString") в качестве ответа.Но это не передача сообщений на сервер.Вот вывод:

Received HTTP/1.1 200 OK
Received Date: Thu, 25 Aug 2011 20:25:56 GMT
Received Server: Apache/2.2.17 (Unix) mod_ssl/2.2.17 OpenSSL/0.9.8r DAV/2 PHP/5.3.6
Received X-Powered-By: PHP/5.3.6
Received Content-Length: 10
Received Content-Type: text/html
Received 
Received Array
Received (
Received )

Просто для справки, эта установка работает для запросов GET.

Есть идеи, что здесь происходит?

Ответы [ 3 ]

1 голос
/ 26 августа 2011

Как справедливо отмечают Йохен и Чеслес, вы используете неправильный заголовок Content-Type: - он действительно должен быть application/x-www-form-urlencoded.Однако есть и несколько других проблем ...

  • Последний заголовок должен быть отделен от тела пустой строкой между заголовками и телом.Это должен быть полный CRLF (\r\n), в вашем коде это просто новая строка (\n).Это прямое нарушение протокола, и я немного удивлен, что вы не только что вернули 400 Bad Request с сервера, хотя Apache может быть довольно щадящим в этом отношении.
  • Вы должны указать Connection: closeчтобы гарантировать, что вы не будете бездельничать с открытыми сокетами, сервер закроет соединение, как только запрос будет выполнен.
  • Конечная последовательность CRLF не требуется.PHP достаточно умен, чтобы разобраться в этом сам, но другие серверные языки и реализации могут не быть ...

Если вы работаете с любым стандартизированным протоколом в его сыром состоянии, вы всегда должны начинать схотя бы сканирование по RFC .

Также, пожалуйста, научитесь обезопасить ваши установки Apache ...

0 голосов
/ 26 августа 2011

Используйте взамен

out.write("Content-Type: application/x-www-form-urlencoded\n\n");

.Как эта страница гласит:

Заголовки Content-Length и Content-Type имеют решающее значение, поскольку они сообщают веб-серверу, сколько байтов данных ожидать и какого типа они определены.по типу MIME.

Для отправки данных формы, т.е. данных в формате key=value&key2=value2, используйте application/x-www-form-urlencoded.Не имеет значения, содержит ли value HTML, XML или другие данные;сервер интерпретирует его для вас, и вы сможете получать данные, как обычно, в массивах $_POST или $_REQUEST на стороне PHP.

В качестве альтернативы вы можете отправлять данные в виде необработанного HTML, XML и т. Д., Используя соответствующий заголовок Content-Type, но затем вам нужно извлечь данные вручную в PHP , прочитав специальный файл php://input:

<?php
echo file_get_contents("php://input");
?>

КакКроме того, если вы используете это для чего-то достаточно сложного, я настоятельно рекомендую использовать клиентскую библиотеку HTTP, такую ​​как HTTPClient .

0 голосов
/ 26 августа 2011

Похоже, вы пытаетесь отправить данные в формате application / x-www-form-urlencoded, но вы устанавливаете Content-Type на text / html.

...