HttpServletRequest не получить параметры из моего httppost - PullRequest
1 голос
/ 18 июля 2011

У меня просто вопрос из любопытства. У меня есть запрос HttpPost в Android, который выглядит примерно так:

HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost(getString(R.string.url));

//This code does not work
HttpParams params = new BasicHttpParams();
params.setParameter("type", "20");
post.setParams(params);

try {
    HttpResponse response = client.execute(post);
} catch (ClientProtocolException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

На моем сервере у меня есть сервлет, который прослушивает запросы и анализирует параметры:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    Enumeration en = request.getParameterNames();
    while (en.hasMoreElements()){
        System.out.println(en.nextElement());
    }
} 

Когда я выполняю этот код, сервлет вообще не видит никаких параметров. Но если я заменю весь блок «параметра» на этот код:

//This code works
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(5);
nameValuePairs.add(new BasicNameValuePair("type", "20"));

try {
    post.setEntity(new UrlEncodedFormEntity(nameValuePairs));
} catch (UnsupportedEncodingException e1) {
// TODO Auto-generated catch block
    e1.printStackTrace();
}

Мой сервлет может анализировать параметры. Это не проблема, я просто собираюсь использовать сущность, но мой вопрос: почему мой сервлет не может получить параметры из первого куска кода? Что не так с setParams? Почему сервлет может видеть параметры, если я делаю их сущностью?

1 Ответ

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

В HTML, когда у нас есть что-то вроде "http://host/path?user=uname&passwd=pass",, мы называем деталь (user = uname & passwd = pass) после вопросительного знака" данные формы "." Данные формы "могут быть прикреплены к концу URL после знак вопроса (как указано выше) для запросов GET или для отправки на сервер отдельной строкой для запросов POST. «Данные формы» разделяются на параметры. Параметры разделяются символом &, когда мы используем GET.

В нашем случае классы HttpPost и HttpGet расширяют AbstractHttpMessage, который реализует метод setParams. Этот метод одинаков для GET и POST, но выполняет работу только для GET! В случае GET параметры помещаются в URL. В случае POST необходимо установить сущность для параметров на «отдельной строке».

На стороне сервера при использовании сервлетов getParameters достаточно умен, чтобы найти параметры для GET и POST.

Вот почему на стороне сервера нам не нужно менять код для получения параметров!

Надеюсь, я помог!

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