質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
HTTPS

HTTPS(Hypertext Transfer Protocol Secure)はHypertext Transfer プロトコルとSSL/TLS プロトコルを組み合わせたものです。WebサーバとWebブラウザの間の通信を暗号化させて、通信経路上での盗聴や第三者によるなりすましを防止します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

2545閲覧

Fuelでform-dataをPOSTしたい

CAIOS

総合スコア24

HTTPS

HTTPS(Hypertext Transfer Protocol Secure)はHypertext Transfer プロトコルとSSL/TLS プロトコルを組み合わせたものです。WebサーバとWebブラウザの間の通信を暗号化させて、通信経路上での盗聴や第三者によるなりすましを防止します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2020/08/23 16:45

###問題
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 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

お騒がせしました。自己解決いたしました。

Fuelでform-dataをPOSTするにはuploadを使えばいいことは理解していたのですが、今回のタイプではファイルをアップロードするわけではないため、ファイル無しではuploadを行えないものと思ってしまっていました。

ですが、実際は明示的にファイルなしのListを渡すことによってuploadを行うことができるようです。dataPartsに空のListを渡します。

Kotlin

1suspend fun login(userName: String, password: String) = suspendCoroutine<Boolean> { 2 try { 3 val (request, response, result) = "$OAUTH_HOST/auth/token".httpUpload(Method.POST, createLoginSession(userName, password)) 4 .header(createAPIHeader(getLocaleTime())) 5 .dataParts { _, _ -> listOf() } 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) = listOf( 21 "get_secure_url" to "1", 22 "client_id" to CLIENT_ID, 23 "client_secret" to CLIENT_SECRET, 24 "grant_type" to "password", 25 "username" to userName, 26 "password" to password 27 ) 28 29 private fun createAPIHeader(time: String): HashMap<String, String> { 30 return hashMapOf( 31 "User-Agent" to CLIENT_APP_NAME, 32 "X-Client-Time" to time, 33 "X-Client-Hash" to getHash(time + HASH_SECRET) 34 ) 35 }

投稿2020/08/23 16:59

CAIOS

総合スコア24

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問