簡體   English   中英

應用程序的內容類型包括字符集

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM