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

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)

希望能帮助到你.


Coo*_*ind 9

我想将 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 中的样子。


Nav*_*dav 5

肯定支持表单数据。我将使用典型注册流程的示例让您清楚地了解。首先添加一个标题

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