2017-09-25 9 views
2

が含まれていました。カールと同じようにREST APIを呼び出す単純なJavaコードを記述していました。 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がtext/* content-typesの文字セットのみを許可していますが、私はその分野の専門家ではありません!)

削除するContent-Typeを上書きするにはどうすればよいですか文字セット部分?

答えて

1

Java Stringを使用してJSONデータをRequestBody.create()に渡しています。

 
public static RequestBody create(@Nullable 
           MediaType contentType, 
           String content) 
コンテンツを伝送する新しいリクエストボディを返し

:OkHttpドキュメントあたり。 contentTypeがnullでなく、文字セットが欠けている場合、これはUTF-8を使用します。

だから、あなたが意図的に使用している方法は、UTF-8を強制的に、それはおそらく一致するcharset属性を追加しています。

またはokio.ByteStringをJava Stringの代わりに入力すると、他のcreate()メソッドのいずれかを試してみてください。彼らは、入力として生のバイトを取っているので、1が実際に必要とされている場合にのみcharsetを指定するには、呼び出し側の責任ですので、彼らは、UTF-8を強制として記載されていません。

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()'を使うことを確認してください。回避策を使用するのは嫌いですが、これで十分です。 :) –

関連する問題