HTTP POST запрос, как рассчитать длину контента - PullRequest
4 голосов
/ 10 декабря 2011

Я делаю HTTP-запрос POST к серверу и создаю тело сообщения вручную. Я думаю, что я делаю некоторую ошибку с заголовком content-length, потому что на стороне сервера, когда я получаю ответ http в начале, я вижу заголовки с ответом http 200, а затем, когда в моем php-скрипте я печатаю параметры записи и имена файлов Я получаю правильные значения, но вместе с некоторыми ненужными байтами. Вот тело моего http сообщения:

StringBuffer str = new StringBuffer();
str.append("POST /tst/query.php HTTP/1.1\r\n"
        + "Host: myhost.com\r\n"
        + "User-Agent: sampleAgent\r\n"
        + "Content-type: multipart/form-data, boundary=AaB03x\r\n" 
        + "Content-Length: 172\r\n\r\n"
        + "--AaB03x\r\n"
        + "content-disposition: form-data; name=\"asd\"\r\n\r\n123\r\n--AaB03x\r\n"
        + "content-disposition: form-data; name=\"pics\"; filename=\"file1.txt\"\r\n"
        + "Content-Type: text/plain\r\n\r\n555\r\n"
        + "--AaB03x--"
);

Вот вывод с сервера (игнорировать [0.0] - он приходит с консоли, где я печатаю результат)

[0.0] HTTP/1.1 200 OK

[0.0] Date: Sat, 10 Dec 2011 11:53:11 GMT

[0.0] Server: Apache

[0.0] Transfer-Encoding: chunked

[0.0] Content-Type: text/html

[0.0] 

[0.0] 6

[0.0] Array
[0.0] 

[0.0] 2

[0.0] (
[0.0] 

[0.0] 1

[0.0]  

[0.0] 1

[0.0]  

[0.0] 1

[0.0]  

[0.0] 1

[0.0]  

[0.0] 1

[0.0] [

[0.0] 3

[0.0] asd

[0.0] 5

[0.0] ] => 

3
123
1
2
)
0

И скрипт php на сервере, который так прост, как вы можете себе представить:

<?php 
    print_r($_POST) ;
?>

Ответы [ 2 ]

2 голосов
/ 10 декабря 2011
String boundary = "AaB03x";
String body = "--" + boundary + "\r\n"
            + "Content-Disposition: form-data; name=\"asd\"\r\n"
            + "\r\n"
            + "123\r\n"
            + "--" + boundary + "\r\n"
            + "Content-Disposition: form-data; name=\"pics\"; filename=\"file1.txt\"\r\n"
            + "Content-Type: text/plain\r\n"
            + "\r\n"
            + "555\r\n"
            + "--" + boundary + "--";

StringBuffer str = new StringBuffer();
str.append("POST /tst/query.php HTTP/1.1\r\n"
         + "Host: myhost.com\r\n"
         + "User-Agent: sampleAgent\r\n"
         + "Content-type: multipart/form-data, boundary=\"" + boundary + "\"\r\n" 
         + "Content-Length: " + body.length() + "\r\n"
         + "\r\n"
         + body
);

... Я бы сказал, как это должно быть сделано

2 голосов
/ 10 декабря 2011

Из HTTP RFC ( RFC2626, 14.3 )

Поле заголовка объекта Content-Length указывает размер тела объекта в десятичном числе OCTET,отправлено получателю или, в случае метода HEAD, размер тела объекта, который был бы отправлен, если бы запрос был GET.

Другими словами, вы должны посчитать числобайтов (octets), поэтому \r\n следует рассматривать как 2 октета / байта.

...