2017-09-25 125 views
2

我正在編寫一段簡單的Java代碼,它調用一個REST API來模仿我用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(); 

在試圖理解我在做什麼錯的過程中,我遇到過一個反向代理(我使用「查爾斯」)的要求,實現了內容類型由okhttp3設置了包括字符集應用程序/ 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 -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的內容類型只允許字符集的文本/ *內容類型,但我不是那方面的專家!)

我該怎麼做才能覆蓋內容類型以刪除charset部分?

回答

1

您正在使用Java String將您的JSON數據傳遞到RequestBody.create()。每OkHttp文檔:

 
public static RequestBody create(@Nullable 
           MediaType contentType, 
           String content) 

返回傳送內容的新請求主體。 如果contentType非空並且缺少字符集,則將使用UTF-8。

所以,你正在使用故意方法強制UTF-8,所以它很可能添加charset屬性相匹配。

嘗試使用其他create()方法中的一個將byte[]okio.ByteString作爲輸入,而不是Java String。他們沒有記錄爲強制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}")); 
+0

我確認使用帶'byte []'輸入的'create()'工作。我不喜歡使用解決方法,但在這一點上對我來說已經足夠了! :) –

相關問題