仅使用表单数据进行改造2

问题描述 投票:14回答:3

我正在尝试使用Retrofit 2发出POST请求。请求类型是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.第二次尝试

@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);

我只是将身体变为空。它正在与POSTMAN合作。

我也搜索了form-dataapplication/x-www-form-urlencoded,发现如果数据是二进制的,那么使用form-data,如果数据是ASCII则使用application/x-www-form-urlencoded

我正在尝试查找改造不支持表单数据吗?

POSTMAN请求

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生成的代码片段

android retrofit2 form-data
3个回答
28
投票

在改造2.0中执行上述POST请求时,您应该像这样使用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);

16
投票

这是使用请求正文的另一个解决方案:

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);

希望能帮助到你。


0
投票

我想将一组id传递给现有的请求。

我从这里尝试了几个变种,Retrofit - Send request body as array or numberHow to send PUT request with retrofit string and array list of model I need to use URL encoded,但它们没有用。然后我尝试了android retrofit send array as x-www-form-urlencoded

我将[]添加到list参数并将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>

然后像往常一样调用它(使用Kotlin协同程序):

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

另请参阅Is it possible to send an array with the Postman Chrome extension?以了解它在Postman中的样子。

© www.soinside.com 2019 - 2024. All rights reserved.