400使用java.net.HTTPClient接收到错误请求,但在相同的URL和body上与SpringRestTemplate和Postman工作正常

xesrikrc  于 2023-04-06  发布在  Spring
关注(0)|答案(1)|浏览(295)

我尝试在Springboot应用程序中使用HTTPClient向URL发送JSON POST请求,但我从服务器收到400状态响应。然而,当我使用Postman发送相同的请求时,我从服务器收到所需的响应。
下面是我的代码:

// some dummy url:
String url = "http://88.22.199.111:5000/detect";

JSONObject json1 = new JSONObject();
json1.put("From", "Sawan");
json1.put("to", "Mohan");
json1.put("message", "is API working?");
json1.put("check_list", 1);

HttpClient httpClient = HttpClient.newBuilder().build();

HttpRequest httpRequest = HttpRequest.newBuilder()
        .uri(URI.create(url))
        .header("Content-Type", "application/json")
        .POST(HttpRequest.BodyPublishers.ofString(json1.toString()))
        .build();

System.out.println(json1.toString());
HttpResponse<String> httpResponse = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString());

System.out.println(httpResponse.statusCode());
System.out.println(httpResponse.body());

这是控制台上的输出:

{"check_list":1,"From":"Sawan","to":"Mohan","message":"is API working?"}
400
{"message": "The browser (or proxy) sent a request that this server could not understand."}

当我通过Postman点击相同的URL并输入以下详细信息时,我会从服务器获得所需的响应:
申请类型:POST
URL:与上面的URL相同
网址:

curl --location 'http://88.22.199.111:5000/detect' \
--header 'Content-Type: application/json' \
--data '{
    "From":"Sawan"
    ,"to":"Mohan"
    ,"message":"is API working?"
    ,"check_list":1
} '

预期输出:

{
    "status": 200,
    "message": "Success",
    "timestamp": "2023-03-31 05:20:33.455868 +0000",
    "data": {
        "Message": "is API working?",
        "MessageTimeUTC": "Fri, 31 Mar 2023 05:20:33 GMT",
        "Message_By": "sawan",
        "Message_To": "mohan",
        "Message_Intended_For": "mohan",
        "Sentences": []
}

另外,当我使用RestTemplate类时,它工作得很好,我在控制台上获得了所需的输出,但在实际应用程序中,我不能使用springboot的RestTemplate类,所以我需要帮助。
我的代码有什么问题吗?我需要在我的请求中包括任何额外的头吗?任何帮助都将不胜感激。

osh3o9ms

osh3o9ms1#

希望这能让你更近一步。我没有进入你服务器的权限。
我已经比较了java .NET.http.HttpClient发送的内容和Postman/cURL发送的内容。我能看到的唯一区别是AcceptUpgradeHttp2-Settings头,我已经将它们添加到下面的代码中。User-Agent头并不重要。这应该不会有什么不同,但也许你正在调用的服务器非常特殊,例如它不能做http 2。
对于这类问题,我发现在httpbin.org上发出请求非常有用。

import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

import org.json.JSONObject;

public class App 
{
    public static void main( String[] args ) throws IOException, InterruptedException
    {
        String url = "http://88.22.199.111:5000/detect";
        // or url = "http://httpbin.org/post"; // this is very helpful

        JSONObject json1 = new JSONObject();
        json1.put("From", "Sawan");
        json1.put("to", "Mohan");
        json1.put("message", "is API working?");
        json1.put("check_list", 1);

        HttpClient httpClient = HttpClient
            .newBuilder()
            .version(Version.HTTP_1_1) // added this
            .build();

        HttpRequest httpRequest = HttpRequest.newBuilder()
                .uri(URI.create(url))
                .header("Content-Type", "application/json")
                .header("Accept", "*/*") // added this
                .POST(HttpRequest.BodyPublishers.ofString(json1.toString()))
                .build();

        System.out.println(json1.toString());
        HttpResponse<String> httpResponse = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString());

        System.out.println(httpResponse.statusCode());
        System.out.println(httpResponse.body());
    }
}

也许还可以尝试RestTemplate来比较工作的头部和有效负载与失败的头部和有效负载。

相关问题