我正在尝试通过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并且它有效。如果有人有解决最重要问题的解决方案,我也会给你信任。
答案 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);
}