![](/img/trans.png)
[英]Express: Remove charset=utf-8 from Content-Type "application/json; charset=utf-8"
[英]Content-type for application includes charset
我正在编写一段简单的 Java 代码,它调用 REST API 来模仿我使用 curl 所做的事情。 curl 命令向登录端点发送 POST 请求:
curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' -d '{
"username": "MicroStrategy",
"password": "MyPassword",
"loginMode": 1
}' 'https://env-792.customer.cloud.microstrategy.com/MicroStrategyLibrary/api/auth/login'
成功后,您将返回 204 HTTP 响应代码和作为 HTTP 标头的令牌。
现在,使用以下代码,我没有得到相同的结果,而是得到了 HTTP 200 并且没有令牌和正文。
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"username\": \"MicroStrategy\", \"password\": \"MyPassword\", \"loginMode\": 1}");
Request urlrequest = new Request.Builder()
.url("https://env-792.customer.cloud.microstrategy.com/MicroStrategyLibrary/api/auth/login")
.addHeader("accept", "application/json")
.post(body)
.build();
OkHttpClient client = new OkHttpClient();
Response urlresponse = client.newCall(urlrequest).execute();
在试图了解我做错了什么的过程中,我通过反向代理(我使用了“Charles”)运行了请求,并意识到 okhttp3 设置的内容类型包括 application/json 的字符集:
POST /MicroStrategyLibrary/api/auth/login HTTP/1.1
accept: application/json
Content-Type: application/json; charset=utf-8
Content-Length: 63
Connection: Keep-Alive
Accept-Encoding: gzip
User-Agent: okhttp/3.8.0
Host: env-792.customer.cloud.microstrategy.com
{"username": "MicroStrategy", "password": "MyPassword", "loginMode": 1}
我验证了匹配的 curl 语句也失败了
curl -X POST --header 'Content-Type: application/json; charset=utf-8' --header 'Accept: application/json' -d '{
"username": "MicroStrategy",
"password": "MyPassword",
"loginMode": 1
}' 'https://env-792.customer.cloud.microstrategy.com/MicroStrategyLibrary/api/auth/login'
这是一个已知的问题? (我的理解是内容类型的 RFC 只允许 text/* 内容类型的字符集;但我不是该领域的专家!)
我该怎么做才能覆盖 Content-Type 以删除字符集部分?
您正在使用 Java String
将 JSON 数据传递给RequestBody.create()
。 根据 OkHttp 文档:
\n公共静态 RequestBody 创建(@Nullable\n 媒体类型内容类型,\n 字符串内容)\n返回传输内容的新请求正文。 如果 contentType 为非空且缺少字符集,则将使用 UTF-8。
因此,您使用的方法有意强制使用 UTF-8,因此很可能会添加charset
属性以进行匹配。
尝试使用将byte[]
或okio.ByteString
作为输入而不是 Java String
的其他create()
方法之一。 它们没有被记录为强制使用 UTF-8,因为它们将原始字节作为输入,因此调用者有责任仅在实际需要时指定charset
:
RequestBody body = RequestBody.create(mediaType, "{\"username\": \"MicroStrategy\", \"password\": \"MyPassword\", \"loginMode\": 1}".getBytes(StandardCharsets.UTF_8));
RequestBody body = RequestBody.create(mediaType, okio.ByteString.encodeUtf8("{\"username\": \"MicroStrategy\", \"password\": \"MyPassword\", \"loginMode\": 1}"));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.