Http запрашивает POST против GET - PullRequest
3 голосов
/ 26 марта 2010

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

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

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

            int responseCode = connection.getResponseCode();

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

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 ]

4 голосов
/ 26 марта 2010
connection.setRequestProperty("Content-type", "application/x-www-form-urlencoded");

Тип содержимого должен соответствовать фактическому формату postData. Тип содержимого application/x-www-form-urlencoded необходим только в том случае, если тип содержимого действительно url-кодированный . Например. Вы кодируете данные 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));
3 голосов
/ 26 марта 2010

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

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

3 голосов
/ 26 марта 2010

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

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

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

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

Они во многом одинаковы, но главное - главное.

2 голосов
/ 26 марта 2010

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

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

...