###問題
OkHttpで書いていたコードをFuelに移植したいのですが、form-dataをPOSTすることがどうしてもうまくいきません。こちらのサイトを参考に以下のコードで実装してみたのですが、どうもうまく行っていないようです。具体的には400 Bad Requestが返されてしまうので、form-dataで乗せるデータがきちんと伝わっていないのだと思います。
OkHttpで実装し、うまく動いているコードを載せますので、どの箇所が間違っているのかご指摘いただけたら幸いです。よろしくお願いいたします。
###コード
Fuelで書いてみたコード
Kotlin
1suspend fun login(userName: String, password: String) = suspendCoroutine<Boolean> { 2 try { 3 val (request, response, result) = "$OAUTH_HOST/auth/token".httpPost() 4 .header(createAPIHeader(getLocaleTime())) 5 .body(createLoginSession(userName, password)) 6 .response() 7 8 Log.d(TAG, "login: $request") 9 Log.d(TAG, "login: $response") 10 Log.d(TAG, "login: $result") 11 12 it.resume(response.statusCode == 200) 13 14 } 15 catch (e: Throwable) { 16 it.resume(false) 17 } 18 } 19 20 private fun createLoginSession(userName: String, password: String) = gson.toJson( 21 mapOf( 22 "get_secure_url" to "1", 23 "client_id" to CLIENT_ID, 24 "client_secret" to CLIENT_SECRET, 25 "grant_type" to "password", 26 "username" to userName, 27 "password" to password 28 ) 29 ) 30 31 private fun createAPIHeader(time: String): HashMap<String, String> { 32 return hashMapOf( 33 "User-Agent" to CLIENT_APP_NAME, 34 "X-Client-Time" to time, 35 "X-Client-Hash" to getHash(time + HASH_SECRET) 36 ) 37 }
OkHttpで実装し、うまく動いているコード
Kotlin
1suspend fun login(userName: String, password: String) = suspendCoroutine<Boolean> { 2 try { 3 val client = OkHttpClient().newBuilder().build() 4 val body: RequestBody = createLoginSession(userName, password) 5 val request: Request = createAPIHeader("$OAUTH_HOST/auth/token", body, getLocaleTime()) 6 val response: Response = client.newCall(request).execute() 7 8 Log.d(TAG, "login: ${response.body.toString()}") 9 10 it.resume(response.code == 200) 11 } 12 catch (e: Throwable) { 13 it.resume(false) 14 } 15 } 16 17 private fun createLoginSession(userName: String, password: String): RequestBody { 18 return MultipartBody.Builder() 19 .setType(MultipartBody.FORM) 20 .addFormDataPart("get_secure_url", "1") 21 .addFormDataPart("client_id", CLIENT_ID) 22 .addFormDataPart("client_secret", CLIENT_SECRET) 23 .addFormDataPart("grant_type", "password") 24 .addFormDataPart("username", userName) 25 .addFormDataPart("password", password) 26 .build() 27 } 28 29 private fun createAPIHeader(url: String, body: RequestBody, time: String): Request { 30 return Request.Builder() 31 .url(url) 32 .method("POST", body) 33 .addHeader("User-Agent", CLIENT_APP_NAME) 34 .addHeader("X-Client-Time", time) 35 .addHeader("X-Client-Hash", getHash(time + HASH_SECRET)) 36 .build() 37 }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。