android - 如何使用 Retrofit 发送带值的 Hashmap

标签 android callback retrofit retrofit2 android-networking

我正在尝试通过 POST 将 HashMap 和 API KEY 发送到 API,但我不能,因为我需要像发送 @Field("something") 一样发送它。 所以我想要的是@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:

经过一番折腾,我设法让元数据被接受,但现在我遇到了编码问题。 当前 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,它起作用了。如果有人有解决最重要问题的方法,我也会赞扬你。

最佳答案

改造后的 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;
    }
}

关于android - 如何使用 Retrofit 发送带值的 Hashmap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38717754/

相关文章:

javascript - 如何进行正确的 Node.js 错误回调?

java - 在 android 中设置时日期不正确

c# - 在回调请求上保留 ViewState

rust - 从 Rust 中的回调访问全局状态

android - 发送 2 个对象模型作为 @body 改造的输入

java - 当 JSON 只有对象时创建 POJO 列表

所有 Android 项目中的 Android 启动错误

android - 我应该为我的 compileSdkVersion 设置什么?

android - Gradle 依赖项更新问题后,Cordova Android 构建中断

java - Retrofit & Gson - 防止 gson 将 Long 转换为科学记数法