在使用 com.google.api.client.http.HttpRequest 的 POST 请求上需要帮助
Need help on POST request using com.google.api.client.http.HttpRequest
我正在尝试使用 com.google.api.client.http.HttpRequest
发送 post 请求,请求正文中包含数据,但出现错误 com.google.api.client.http.HttpResponseException: 400 Bad Request
我需要发送请求 "application/x-www-form-urlencoded"
这是我的样本:
public static void sendMessage(String url1, String params){
try {
String urlParameters = "{\"name\":\"myname\",\"age\":\"20\"}" ;
byte[] postData = urlParameters.getBytes( StandardCharsets.UTF_8 );
HttpRequestFactory requestFactory = HTTP_TRANSPORT.createRequestFactory();
GenericUrl url = new GenericUrl(url1);
HttpContent content = new ByteArrayContent("application/x-www-form-urlencoded", postData);
HttpRequest request = requestFactory.buildPostRequest(url, content);
com.google.api.client.http.HttpResponse response = request.execute();
System.out.println("Sent parameters: " + urlParameters + " - Received response: " + response.getStatusMessage());
System.out.println("Response content: " + CharStreams.toString(new InputStreamReader(response.getContent())));
} catch (IOException e) {
throw Throwables.propagate(e);
}
}
我认为您的问题不是使用此特定 class 发送请求。但是编码参数本身。这让服务器很难解析您的请求,并在 return 中给您 400 响应。
您的版本似乎模仿 JSON,但这不是您在 HTTP 中编码参数的方式。
正确的方法如下:
name=myname&age=20
此外,请记住您需要 url 对要添加到参数中的所有数据进行编码。否则服务器将无法理解您的请求,您将再次遇到同样的问题。
这里:https://www.baeldung.com/java-url-encoding-decoding#encode-the-url,你有一些很好的例子,说明如何用 Java.
进行 URL 编码
编辑:添加示例
以下代码有效:
String urlParameters = "name=Cezary&age=99" ;
byte[] postData = urlParameters.getBytes( StandardCharsets.UTF_8 );
HttpTransport transport = new NetHttpTransport();
HttpRequestFactory requestFactory = transport.createRequestFactory();
GenericUrl url = new GenericUrl("http://localhost:8080/greeting");
HttpContent content = new ByteArrayContent("application/x-www-form-urlencoded", postData);
HttpRequest request = requestFactory.buildPostRequest(url, content);
com.google.api.client.http.HttpResponse response = request.execute();
您可以使用 UrlEncodedContent
为您处理 url 编码,而不是使用 ByteArrayContent
和自己编码参数。
Map<String, Object> params = new HashMap<>();
params.put("name", "Cezary");
params.put("age", 99);
HttpContent content = new UrlEncodedContent(params);
上面提到的代码是在接受 HTTP POST 的服务器上测试的,主体内有 url 编码参数。如果它仍然不适合你。如果服务器使用的是 curl/postman 或其他实用程序,则应进行验证。如果不是,那很正常 returns 400 给你。
我正在尝试使用 com.google.api.client.http.HttpRequest
发送 post 请求,请求正文中包含数据,但出现错误 com.google.api.client.http.HttpResponseException: 400 Bad Request
我需要发送请求 "application/x-www-form-urlencoded"
这是我的样本:
public static void sendMessage(String url1, String params){
try {
String urlParameters = "{\"name\":\"myname\",\"age\":\"20\"}" ;
byte[] postData = urlParameters.getBytes( StandardCharsets.UTF_8 );
HttpRequestFactory requestFactory = HTTP_TRANSPORT.createRequestFactory();
GenericUrl url = new GenericUrl(url1);
HttpContent content = new ByteArrayContent("application/x-www-form-urlencoded", postData);
HttpRequest request = requestFactory.buildPostRequest(url, content);
com.google.api.client.http.HttpResponse response = request.execute();
System.out.println("Sent parameters: " + urlParameters + " - Received response: " + response.getStatusMessage());
System.out.println("Response content: " + CharStreams.toString(new InputStreamReader(response.getContent())));
} catch (IOException e) {
throw Throwables.propagate(e);
}
}
我认为您的问题不是使用此特定 class 发送请求。但是编码参数本身。这让服务器很难解析您的请求,并在 return 中给您 400 响应。
您的版本似乎模仿 JSON,但这不是您在 HTTP 中编码参数的方式。 正确的方法如下:
name=myname&age=20
此外,请记住您需要 url 对要添加到参数中的所有数据进行编码。否则服务器将无法理解您的请求,您将再次遇到同样的问题。
这里:https://www.baeldung.com/java-url-encoding-decoding#encode-the-url,你有一些很好的例子,说明如何用 Java.
进行 URL 编码编辑:添加示例
以下代码有效:
String urlParameters = "name=Cezary&age=99" ;
byte[] postData = urlParameters.getBytes( StandardCharsets.UTF_8 );
HttpTransport transport = new NetHttpTransport();
HttpRequestFactory requestFactory = transport.createRequestFactory();
GenericUrl url = new GenericUrl("http://localhost:8080/greeting");
HttpContent content = new ByteArrayContent("application/x-www-form-urlencoded", postData);
HttpRequest request = requestFactory.buildPostRequest(url, content);
com.google.api.client.http.HttpResponse response = request.execute();
您可以使用 UrlEncodedContent
为您处理 url 编码,而不是使用 ByteArrayContent
和自己编码参数。
Map<String, Object> params = new HashMap<>();
params.put("name", "Cezary");
params.put("age", 99);
HttpContent content = new UrlEncodedContent(params);
上面提到的代码是在接受 HTTP POST 的服务器上测试的,主体内有 url 编码参数。如果它仍然不适合你。如果服务器使用的是 curl/postman 或其他实用程序,则应进行验证。如果不是,那很正常 returns 400 给你。