Получение данных POST с использованием Java - PullRequest
1 голос
/ 23 января 2011

Я пытаюсь создать сервер Java, который может принимать и возвращать данные, используя POST.До сих пор я пытался использовать nameValuePairs (хотя и другой метод подойдет) и сервер принимает подключения и принимает заголовок HTTP, но здесь я не могу понять, как получить какие-либо присоединенные данные.Следующий код распечатывает заголовок и отправляет ответ 100, как только клиент ожидает его - но как мне получить данные из сообщения?

        while(true){
        inputLine = clientInput.readLine();
        System.out.println("client-msg: " + inputLine);
        if("Expect:".equals(inputLine.split(" ")[0])){
            sendResponse(100, "Continue");
            break;
        }

Вот что отправляет клиент (android java),Я пытаюсь вывести пару имен на стороне сервера

            ArrayList<NameValuePair> postParams = new ArrayList<NameValuePair>();
        postParams.add(new BasicNameValuePair("field", "data here"));
        UrlEncodedFormEntity uefe = new UrlEncodedFormEntity(
                postParams);
        request.setEntity(uefe);
        HttpResponse response = client.execute(request);

Возможно, это довольно просто, но я не могу найти какие-либо учебники, не связанные с PHP, для POST.

Ответы [ 3 ]

2 голосов
/ 23 января 2011

Если вам действительно нужно сделать это вручную, вам следует прочитать HTTP RFC , потому что это потенциально даже сложнее, чем то, что вы пытаетесь сделать сейчас.Если то, что вам действительно нужно, это способ встроить небольшой веб-сервер Java во что-то, проверьте Jetty . * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 100 *

* * * * * * * * * * * * * * * 1007]

1 голос
/ 23 января 2011

Насколько я понимаю, из вашего кода вы подходите к открытию сокета сервера и построчному чтению.
Что вы должны здесь сделать, это найти заголовок "Content-length".
Thisзаголовок показывает размер тела, переносимого в запросе POST.
По вашему вопросу, я думаю, что вы получаете запрос POST, подобный следующему:

POST /path HTTP/1.1
From: myUser
User-Agent: java
Content-Length: 32

name1=value1&name2=value2

Обратите внимание на дополнительную новую строку (т.е.'\n') между заголовками HTTP и фактическими данными.
Следует использовать длину содержимого и тот факт, что вы уже знаете, где находятся данные, относящиеся к заголовкам HTTP, внутри запроса HTTP, чтобы проанализировать его и извлечь значения
Так что в конечном итоге вы получите name1=value1&name2=value2.
Если вы просто хотите сделать это как упражнение, продолжайте.
Это сложнее, чем вы думаете, и вы должны смотреть наRFC немного.
Например, я не помню, это на самом деле '\n' или '\r\n' или что-то подобное.
Также я не помню, будет ли всегда длина контента(например, в ответах он может отсутствовать, и http-сервер может отправлять ответ в кодированных блоках).
Если вам нужно сделать это хотя бы серьезно, то вам следует использовать реализацию http-сервера.
Уже естьреализация http-сервера поставляется в java, или вы можете использовать apache.
Не пытайтесь заново изобретать колесо, если вы не заняты ради образования или развлечения.

0 голосов
/ 23 января 2011

Из контекста выглядит так, как будто вы должны изучить использование сервлетов и запустить их на облегченной платформе сервлетов, такой как Jetty.

Необходимо переопределить метод doPost в классе сервлетов.В объекте HttpServletResponse используйте getParameterNames (), чтобы получить все загруженные имена параметров, и getParameter (), чтобы получить их значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...