来自 Java 代码的 "Content-Type" 无效,但在 Postman 中有效

Invalid "Content-Type" from Java code but works in Postman

我正在尝试向特定 URL 发送 POST 请求,下面是我的 Java 代码...

            OkHttpClient httpClient = new OkHttpClient().newBuilder().build();
            
            MediaType JSON = MediaType.parse("application/json; charset=utf-8");
            
            RequestBody body = RequestBody.create("<JSON_AS_STRING>", JSON);
            
            Request request = new Request.Builder()
              .url(url)
              .method("POST", body)
              .addHeader("Authorization", getToken())
              .addHeader("Content-Type", "application/json; charset=utf-8")
              .build();

            Response response = httpClient.newCall(request).execute()

执行请求时,我收到错误代码 100 下的“无效内容类型”。我将 JSON Body 存储在一个字符串中并使用它并定义媒体类型以创建一个body.

但是当我从 Postman 发送相同的请求时,我收到成功代码 204。

在 Postman 中我选择了 body 作为 JSON 并在 body 中传递 JSON 并设置 URL 和其他 header 就像授权一样,当我发送请求时,我收到 204。

但是当我将其更改为文本时,我会收到与 Java 代码相同的错误“无效内容类型”。我正在为客户端、请求和响应使用 OkHttp3 库。我的 java 代码怎么没有将媒体类型设为 application/json。我什至尝试在 header 中使用 application/json 传递“charset=utf-8”,但仍然无法正常工作。

任何可能出错的建议,这不是我第一次创建 okhttp3 请求,但第一次看到这样的东西......

我什至尝试复制 java 代码片段,您可以使用邮递员创建它...仍然无法正常工作。

您能否在服务器上记录整个传入请求(header 和负载)?这样你就会看到它们是否有任何不同。我尝试的另一件事是使用 low-level 工具(例如 cURL 而不是 Postman)发送请求。

(礼貌:How do I POST JSON data with cURL?

curl  http://localhost:8080/api/login  -H "content-type: application/json"  -d "{\"email\": \"user@admin.com\", \"password\": \"123456\"}"

您也可以从 Postman 本身提取 cURL 命令

我发现了问题,当您设置 MediaType 时,添加了“charset=utf-8”,这导致了我提到的错误。所以我手动删除了“charset=utf-8”并尝试发送请求,这次我使用 fiddler 来侦听从 eclipse 发送的请求,事实证明,无论您是否传递该字符集,MediaType 都会附加它,所以我尝试将 MediaType.parse() 上的第二个参数设置为 null,然后将内容类型为 application/json 的 header 传递给它,它就像一个魅力。