如何使用Retrofit发送带有值的Hashmap

时间:2016-08-02 10:19:48

标签: android callback retrofit retrofit2 android-networking

我正在尝试通过POST向HashMap和API KEY发送API,但我不能,因为我需要发送它,就像我做@Field(“某事”)一样。 所以我想要的是@FieldMap(“meta”)

示例我如何使用Field:

@FormUrlEncoded
@POST("/api")
Call<CallBackMethod> save(@Query("apikey") String api_key,
                          @Field("something") String test);

我目前如何使用FieldMap,但是字段映射没有被发送,因为API期望一个名为“meta”的数组,所以我从服务器获得错误响应在POST中不存在元数据。 API工作。 但我需要向它发送一个带有键和值的数组,这是一个Java中的Hashmap。

我正在调用这样的API:

  Map<String, String> meta = new HashMap<>();
        meta.put("user_id", user_id);
        final Api apiService = ApiClient.getAPI().create(Api.class);
        Call<OtherMethod> call = apiService.getOtherMethod(API_KEY, meta);
  call.enqueue(new Callback<OtherMethod>() {
        @Override
        public void onResponse(Call<OtherMethod> call, Response<OtherMethod> response) {
            Log.d("Response Raw", response.raw() + "");
            Log.d("Response Raw", response.isSuccessful() + "");

        }

        @Override
        public void onFailure(Call<OtherMethod> call, Throwable t) {
            Log.e("E: t.toString());
        }
    });

方法所在的其他类:

   @FromUrlEncoded
        @POST("/api")
        Call<OtherMethod> getOtherMethod(@Query("apikey") String api_key,
                                              @FieldMap Map<String, String> meta);

编辑1:

经过一番乱搞,我设法让meta被接受,但现在我遇到了编码问题。 目前的API:

   @FormUrlEncoded
    @POST("/api")
    Call<CallBackMethod> getSomething(@Query("apikey") String api_key,
                                  @FieldMap HashMap<String,HashMap<String,String>> meta);

这是它发送的内容:

D/OkHttp: meta=%7Buser_id%3D431%7D

我尝试使用encoding = true和false两个相同的结果。 这是应该发送的内容

meta={user_id=431} 有没有人知道如何禁用编码?

编辑2: 我更改了API,所以我发送了@BODY然后发送了json并且它有效。如果有人有解决最重要问题的解决方案,我也会给你信任。

4 个答案:

答案 0 :(得分:3)

带改造的HashMap:

 @FormUrlEncoded
    @POST("register.php")
    Call<ResponseBody> RegisterUser(@FieldMap Map<String, String> params);


 Map<String, String> params = new HashMap<>();

        params.put("userName", edt_uname.getText().toString());
        params.put("userEmail", edt_email.getText().toString());


ApiInterface apiService = ApiClient.getLogin().create(ApiInterface.class);
apiService.RegisterUser(params))


public class ApiClient {
    private static Retrofit retrofit = null;
    public static Retrofit getLogin() {

        if (retrofit==null) {
            retrofit = new Retrofit.Builder()
                    .baseUrl(GlobalConfig.Main_Url)
                    .addConverterFactory(GsonConverterFactory.create())

                    .build();
        }
        return retrofit;
    }
}

答案 1 :(得分:0)

数据字段

如果要发送多个数据字段,请使用@FieldMap Map<String, String>

查询参数

如果要添加多个查询参数,请使用@QueryMap Map<String, String>

答案 2 :(得分:0)

尝试使用hashmap在GET方法中的翻新api中查询地图函数。

 @GET("API-METHOD-NMAE")
 fun get_your_method_name(@QueryMap params: Map<String, String>): Call<Your_Class_Name>

并将gradle用作最新的一个,

// retrofit
implementation 'com.google.code.gson:gson:2.8.5'
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
implementation 'com.squareup.retrofit2:adapter-rxjava:2.1.0'

希望这很好!

答案 3 :(得分:-2)

使用以下代码spinnet:

public void makeStringReq_withparam(int PostType, String url, final Map<String, String> params1) {
   RequestQueue mRequestQueue;
        StringRequest strReq = new StringRequest(PostType,
                url, new Response.Listener<String>() {

            @Override
            public void onResponse(String response) {
                Log.d(TAG, response.toString());


            }
        }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                VolleyLog.d(TAG, "Error: " + error.getMessage());


            }
        }) {
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                Map<String, String> params = new HashMap<String, String>();
                params.putAll(params1);
                return params;
            }

        };


        mRequestQueue = Volley.newRequestQueue(context1);
        mRequestQueue.add(strReq);

    }