Запрос httpPost с Android на java сервер (пристань): параметры теряются? - PullRequest
0 голосов
/ 27 апреля 2011

Я отправляю довольно простой запрос httpPost, следуя вот как . (Это на немецком языке, но вы можете взглянуть на пример HTTP POST). Вот что я получил:

HttpPost httpPost = new HttpPost(params[0]);

HttpParams httpParams = new BasicHttpParams();
httpParams.setParameter("title", "message");

//... setting some other parameters like http timeout, which I checked and which work 

httpPost.setParams(httpParams);

//HttpEntity myEntity = new StringEntity(messageBody);
//httpPost.setEntity(myEntity);

response = httpClient.execute(httpPost);

(прокомментированную часть я тоже попробовал, но безрезультатно).

Код сервера выглядит следующим образом:

public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
{
    response.setContentType("text/plain;charset=utf-8");
    if (target.contentEquals("/postKdm"))
    {
        String title = request.getParameter("title");

        InputStream instream = request.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(instream));
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null)
        {
            sb.append(line);
        }

        System.out.println(title);

        response.setStatus(HttpServletResponse.SC_OK);
    }
}

Где и заголовок String, и InputStream имеют значение null / empty. Я отладил и проверил объект запроса, но не смог найти ничего похожего на мой параметр.

Также я нашел что-то похожее на мою проблему здесь , но ответ мне не очень помог, так как я не работаю с Apache Camel и поэтому не могу использовать класс Exchange.

О, и подобный запрос GET работает отлично, но здесь я только что застрял. : /

Буду признателен за любую помощь!

С уважением, медузы

1 Ответ

2 голосов
/ 28 апреля 2011

Я до сих пор не знаю, почему «setParams» не работает. Но я использовал Wireshark, чтобы проверить свой исходящий запрос, и после этого я нашел решение, использующее HttpEntity (как в прокомментированной части выше):

HttpEntity myEntity = new StringEntity(message);
httpPost.setEntity(myEntity);

response = httpClient.execute(httpPost);

Серверная сторона, которую я узнал благодаря Крису , только то, что я, конечно, заменил буфер байтов на буфер символов, как здесь :

private String getInputString() throws IOException
{
    InputStream is = request.getInputStream();
    if (is != null)
    {

        Writer writer = new StringWriter();

        char[] buffer = new char[request.getContentLength()];

        try
        {
            Reader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));

            int n;
            while ((n = reader.read(buffer)) != -1)
            {
                writer.write(buffer, 0, n);
            }
        }
        finally
        {
            is.close();
        }
        return writer.toString();
    }
    else
    {
        return "";
    }
}
...