Пример Java HttpURLConnection App Engine для запроса POST не работает

Я пытаюсь выполнить запрос POST, используя urfetch в приложении движка приложения.

Я следовал инструкциям (и коду), извлеченным из простого примера из документации App Engine (здесь https://developers.google.com/appengine/docs/java/urlfetch/usingjavanet) в разделе "Использование HttpURLConnection".

import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.OutputStreamWriter;

    String message = URLEncoder.encode("my message", "UTF-8");

    try {
        URL url = new URL("http://httpbin.org/post");
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setDoOutput(true);
        connection.setRequestMethod("POST");

        OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream());
        writer.write("message=" + message);
        writer.close();

        if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
            // OK
        } else {
            // Server returned HTTP error code.
        }
    } catch (MalformedURLException e) {
        // ...
    } catch (IOException e) {
        // ...
    }

Чтобы проверить этот запрос POST, я использую следующий веб-сайт "http://httpbin.org/post" .

Выборка и соединение работают, однако соединение отправляется как GET, а не как POST.

Вот ответ, который я получаю на этот запрос:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>405 Method Not Allowed</title>
<h1>Method Not Allowed</h1><p>The method GET is not allowed for the requested URL.</p>

Кто-нибудь сталкивался с этой проблемой?

Любая помощь приветствуется.


person Marcio Cabral    schedule 06.04.2013    source источник
comment
Этот образец кода отлично работает для меня, я перехожу к части // OK   -  person Jon Lin    schedule 07.04.2013
comment
Я тоже - однако в ответе написано 405: метод не разрешен. Это означает, что HttpURLConnection отправил GET вместо POST. Я хочу знать, почему он отправляет запрос GET вместо запроса POST.   -  person Marcio Cabral    schedule 07.04.2013
comment
Я до сих пор не знаю, почему этот пример из документации App Engine не работает. В итоге я использовал подход, представленный здесь (ссылка), чтобы иметь возможность выполнять запрос POST.   -  person Marcio Cabral    schedule 07.04.2013


Ответы (3)


Поскольку спустя 3 года этот вопрос все еще получает значительное количество просмотров, я подтвержу здесь, что метод, приведенный в образце документации, отлично работает для выполнения POST-запроса к заданному URL-адресу и остается неизменным с тех пор, как этот вопрос был впервые опубликован. Пример рабочего кода выглядит следующим образом:

String message = URLEncoder.encode("my message", "UTF-8");

URL url = new URL("http://httpbin.org/post");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setRequestMethod("POST");

OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream());
writer.write("message=" + message);
writer.close();

StringBuffer responseString = new StringBuffer();
String line;

BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
while ((line = reader.readLine()) != null) {
    responseString.append(line);
}
reader.close();

Был получен следующий ответ:

Code: 200, message: { "args": {}, "data": "", "files": {}, "form": {
"message": "my message" }, "headers": { "Accept-Encoding": 
"gzip,deflate,br", "Content-Length": "18", "Content-Type": 
"application/x-www-form-urlencoded", "Host": "httpbin.org", "User-Agent": 
"AppEngine-Google; (+http://code.google.com/appengine; appid: s~ 
<redacted>)", "X-Cloud-Trace-Context": ",<redacted>" }, "json": null, 
"origin": "107.178.194.113", "url": "http://httpbin.org/post"}
person Adam    schedule 17.02.2017

Вы пытались вызвать метод flush() для OutputStreamWriter?

person eimmer    schedule 21.08.2013
comment
Это делает флеш при закрытии. Большинство потоков делает. - person JIV; 10.10.2016

Возможно, вы должны установить свойство запроса типа контента:

connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
person mkxqiu    schedule 17.09.2014