如何使用 Retrofit 发送带值的 Hashmap

Win*_*lly 4 android callback android-networking retrofit retrofit2

我正在尝试通过 POST HashMap 和 API KEY 发送到 API,但我不能,因为我需要像发送 @Field("something") 一样发送它。所以我想要的是 @FieldMap("meta")

示例我如何使用字段:

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

我目前如何使用 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());
        }
    });
Run Code Online (Sandbox Code Playgroud)

方法所在的其他类:

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

编辑 1:

经过一番折腾,我设法让元数据被接受,但现在我在编码方面遇到了问题。当前API:

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

这是它发送的内容:

D/OkHttp: meta=%7Buser_id%3D431%7D
Run Code Online (Sandbox Code Playgroud)

我尝试使用 encoding=true 和 false 都得到相同的结果。这是它应该发送的

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

编辑 2: 我更改了 API,因此我发送了 @BODY,然后发送了 json 并且它可以工作。如果有人有解决首要问题的方法,我也会相信你。

小智 5

带有改造的 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;
    }
}
Run Code Online (Sandbox Code Playgroud)