web-dev-qa-db-ja.com

フォームデータのみを使用するRetrofit 2

POST Retrofit 2を使用してリクエストを作成しようとしています。リクエストタイプはform-data[〜#〜] not [〜#〜]application/x-www-form-urlencoded

リクエスト内のファイルではなくデータのみを投稿しており、レスポンスはJSON形式です。

@FormUrlEncoded, @Multipartを試しましたが、機能しません。

私は次のリクエストを試みました

1。最初の試行

@FormUrlEncoded
@POST("XXXX")
Call<PlanResponse> getPlanName(@Field(Constants.ACTION_ID) String actionId, @Field(Constants.OFFER_CODE) String offerCode);

2。2回目の試行

@Headers({"Content-Type: multipart/form-data","Content-Type: text/plain"})
@FormUrlEncoded
@POST("XXXX")
Call<PlanResponse> getPlans(@Body @FieldMap(encoded = false) Map<String, String> data);

。3回目の試行

@Headers("Content-Type: multipart/form-data")
@Multipart
@POST("XXXX")
Call<PlanResponse> myPlans(@Part(Constants.ACTION_ID) String actionId, @Part(Constants.OFFER_CODE) String offerCode);

ボディはnullとしてのみ取得しています。 POSTMANと連携しています。

form-dataapplication/x-www-form-urlencodedについても検索しましたが、データがバイナリの場合はform-dataを使用し、データがASCIIの場合はapplication/x-www-form-urlencoded

私は見つけようとしていますフォームデータはレトロフィットでサポートされていませんか?

郵便配達員のリクエスト

Cache-Control: no-cache
Postman-Token: XXXXXXXXXXXX-XXXXXXXXXXXX-XXXXXXXXXXXX-XXXXXXXXXXXX-XXXXXXXXXXXX
Content-Type: multipart/form-data; boundary=----    WebKitFormBoundaryXXXXXXXXXXXX


 ----WebKitFormBoundaryXXXXXXXXXXXX
Content-Disposition: form-data; name="actionId"

1000
 ----WebKitFormBoundaryXXXXXXXXXXXX
Content-Disposition: form-data; name="offerCode"

MYCODE
----WebKitFormBoundaryXXXXXXXXXXXX

POSTMANから取得したHTTP生成コードのみを追加できます

17
Akshay Taru

上記のようなPOSTリクエストを実行するためのレトロフィット2.0では、このようにパラメーターにRequestBodyタイプを使用する必要があります。

@Multipart
@POST("XXXX")
Call<PlanResponse> myPlans(@Part(Constants.ACTION_ID) RequestBody actionId, @Part(Constants.OFFER_CODE) RequestBody offerCode);

ここで、StringからrequestBodyを取得する方法。

String somevalue = "somevalue";
RequestBody body = RequestBody.create(MediaType.parse("text/plain"), somevalue);
30
ikhsan

リクエスト本文を使用した別のソリューションを次に示します。

RequestBody requestBody = new MultipartBody.Builder()
        .setType(MultipartBody.FORM)
        .addFormDataPart("param1", param1)
        .addFormDataPart("param2", param2)
        .build();

apiInterface.somePostMethod(requestBody).enqueue(
    //onResponse onFailure methods
);

ここに私のAPIインターフェイスPOSTメソッド

@POST("somePostMethod")
Call<ResponseBody> somePostMethod(@Body RequestBody body);

それが役に立てば幸い。

21
Monster Brain

IDの配列を既存のリクエストに渡したいと思いました。

ここからいくつかのバリエーションを試しました Retrofit-リクエストボディを配列または数値として送信レトロフィット文字列とURLエンコードされたモデルを使用する必要があるモデルの配列リストでPUTリクエストを送信する方法 、しかし、彼らは働きませんでした。それから Androidレトロフィットx-www-form-urlencodedとして配列を送信 を試しました。

追加した []をリストパラメーターに、Listをタイプに:

@FormUrlEncoded
@POST("your_request/")
fun sendIds(
    @Field("token") token: String,
    @Field("city_id") cityId: Int?,
    @Field("description") description: String,
    @Field("ids[]") ids: List<Int>? // Add '[]' here.
): Deferred<YourResponse>

それからいつものようにそれを呼び出しました(コトリンコルーチンを使用):

api.sendIds("f0123abc", null, "description", listOf(1, 2, 3)).await()

Postmanでどのように見えるかを理解するために、Postman Chrome extension? で配列を送信することは可能ですか?.

0
CoolMind