Aks*_*aru 19 android form-data retrofit2
我正在尝试使用Retrofit 2发出POST请求.请求类型form-data 不是 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);
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
我只是将身体变为空.它正在与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
Run Code Online (Sandbox Code Playgroud)
我只能添加从POSTMAN剪切的HTTP生成代码
ikh*_*san 32
在改造2.0中执行上述POST请求时,您应该像这样使用RequestBody类型作为参数.
@Multipart
@POST("XXXX")
Call<PlanResponse> myPlans(@Part(Constants.ACTION_ID) RequestBody actionId, @Part(Constants.OFFER_CODE) RequestBody offerCode);
Run Code Online (Sandbox Code Playgroud)
这里是如何从String获取requestBody.
String somevalue = "somevalue";
RequestBody body = RequestBody.create(MediaType.parse("text/plain"), somevalue);
Run Code Online (Sandbox Code Playgroud)
Mon*_*ain 26
这是使用请求正文的另一个解决方案:
RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("param1", param1)
.addFormDataPart("param2", param2)
.build();
apiInterface.somePostMethod(requestBody).enqueue(
//onResponse onFailure methods
);
Run Code Online (Sandbox Code Playgroud)
这是我的api接口POST方法
@POST("somePostMethod")
Call<ResponseBody> somePostMethod(@Body RequestBody body);
Run Code Online (Sandbox Code Playgroud)
希望能帮助到你.
我想将 id 数组传递给现有请求。
我在这里尝试了几种变体,Retrofit - Send request body as array or number,如何使用改造字符串和模型数组列表发送 PUT 请求,我需要使用 URL 编码,但它们不起作用。然后我尝试android Retrofit 将数组发送为 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>
Run Code Online (Sandbox Code Playgroud)
然后照常调用它(使用 Kotlin 协程):
api.sendIds("f0123abc", null, "description", listOf(1, 2, 3)).await()
Run Code Online (Sandbox Code Playgroud)
另请参阅是否可以使用 Postman Chrome 扩展发送数组?了解它在 Postman 中的样子。
肯定支持表单数据。我将使用典型注册流程的示例让您清楚地了解。首先添加一个标题
@FormUrlEncoded
在您的用户客户端中。使用
@FieldMap
而不是直接的对象。所以你的用户客户端代码将是这样的
@POST("signup/")
@FormUrlEncoded
Call<ResponseModel> signup(@FieldMap Map<String,String> params);
Run Code Online (Sandbox Code Playgroud)
现在在您的主要活动中,将所有数据创建一个哈希图,如下所示,
Map<String,String> params = new HashMap<String, String>();
params.put("fullname", fullname);
params.put("city", city);
params.put("state",state);
params.put("address",address);
params.put("email",email);
params.put("password1", password1);
params.put("password2", password2);
Run Code Online (Sandbox Code Playgroud)
现在简单地将这个哈希图传递到这样的方法中
Call<ResponseModel> call = service.signup(params);
call.enqueue(new Callback<ResponseModel>() {
@Override
public void onResponse(Call<ResponseModel> call, Response<ResponseModel> response) {
if (response.isSuccessful()) {
Toast.makeText(SignUp.this,response.body.getData,Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(SignUp.this, "Error : ", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<ResponseModel> call, Throwable t) {
t.printStackTrace();
Toast.makeText(SignUp.this, "Server Unavailable : "+t.toString(), Toast.LENGTH_SHORT).show();
}
});
Run Code Online (Sandbox Code Playgroud)