HttpServletRequest не получить параметры из моего httppost

1

У меня только вопрос любопытства. У меня есть запрос 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? Почему сервлет может видеть параметры, если я делаю их сущностью?

Теги:
servlets
tomcat

1 ответ

2
Лучший ответ

В 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.

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

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

  • 0
    Это действительно хорошее объяснение! Спасибо, это именно то, что я хотел.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню