我正在尝试通过 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/