在使用 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 给你。