2010-03-26 2 views
3

Я использую много HTTP-запросов в приложении, которое я пишу, которое использует OAuth. В настоящее время я отправляю свои запросы GET и POST одинаково:Http-запросы POST vs GET

HttpConnection connection = (HttpConnection) Connector.open(url 
        + connectionParameters); 

      connection.setRequestMethod(method); 
      connection.setRequestProperty("WWW-Authenticate", 
        "OAuth realm=api.netflix.com"); 

      int responseCode = connection.getResponseCode(); 

И это прекрасно работает. Я успешно выполняю POSTING и GETing. Тем не менее, я беспокоюсь, что не делаю POST правильно. Нужно ли включать в указанный код следующий if-statement?

if (method.equals("POST") && postData != null) { 
        connection.setRequestProperty("Content-type", 
          "application/x-www-form-urlencoded"); 
        connection.setRequestProperty("Content-Length", Integer 
          .toString(postData.length)); 
        OutputStream requestOutput = connection.openOutputStream(); 
        requestOutput.write(postData); 
        requestOutput.close(); 
       } 

Если да, то почему? Какая разница? Буду признателен за любые отзывы.

Спасибо!

ответ

4
connection.setRequestProperty("Content-type", "application/x-www-form-urlencoded"); 

Тип Содержание должно соответствовать реальному формат postData в . Тип контента application/x-www-form-urlencoded необходим только в том случае, если тип содержимого фактически равен url encoded. Например. вы кодирование данных POST следующим образом:

String data = "param1=" + URLEncoder.encode(param1, "UTF-8") 
      + "&param2=" + URLEncoder.encode(param2, "UTF-8"); 

Таким образом, другая сторона будет иметь возможность анализировать данные, согласно указанному формату, не нарушая его.

И

connection.setRequestProperty("Content-Length", Integer.toString(postData.length)); 

Это является предпочтительным, чтобы обеспечить надежную передачу данных. Если вы опустите это, и соединение каким-то образом сломается, то другая сторона никогда не сможет определить, полностью ли потоковеден контент.

Тем не менее, приведение к HttpUrlConnection является необходимым, если вы знаете, тот факт, что метод запроса будет «автоматически» будет установлен в POST, если вы:

connection.setDoOutput(true); 

или в вашем случае больше подходит:

connection.setDoOutput("POST".equals(method)); 
+0

Спасибо, BalusC, это было очень полезное объяснение. – littleK

3

Из HTML спецификации документа:

Если обработка формы является идемпотентными (т.е. она не имеет прочного заметного влияния на состоянии мира), то метод формы должна быть ПОЛУЧИТЬ. Многие поисковые запросы не имеют видимых побочных эффектов и делают идеальные приложения форм запросов. - -

If the service associated with the processing of a form has side effects 

(например, модификация базы данных или подписки на службы), метод должен быть POST.

Они почти одинаковы, цель - основное различие.

3

Вам необходимо установить заголовок типа контента, если он необходим адресуемому HTTP-серверу. Мы не знаем, действительно ли это или нет.

Заголовок длины контента должен быть рассчитан и установлен автоматически, если вы его не задали явно, но поскольку вы все равно знаете это заранее, я бы установил его так, чтобы ваш контент не был излишне буферизирован HttpConnection, прежде чем отправлять данные.

2

Используйте POST для запросов, которые что-то изменяют, GET для запросов, которые выполняют поиск или просто получают документы. Разница в стороне браузера заключается в том, что браузеры избегают случайного выполнения запроса POST снова, например. путем запроса пользователя для подтверждения.

При обработке запроса POST никогда не отвечайте на документ, но вместо этого перенаправляйте пользователя на запрос GET, содержащий «предоставленную форму» или любой другой ответ, который вы хотите дать. Это позволяет избежать проблем с кнопками браузера/вперед, потому что в противном случае просмотр страницы ответа потребует повторной отправки запроса POST.