我正在尝试使用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-data
和application/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生成的代码片段
在改造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);
这是使用请求正文的另一个解决方案:
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);
希望能帮助到你。
我想将一组id传递给现有的请求。
我从这里尝试了几个变种,Retrofit - Send request body as array or number,How 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中的样子。