2016-08-02 2 views
1

Я пытаюсь отправить API через POST HashMap и API KEY, но я не могу, потому что мне нужно отправить его, как я делаю @Field («что-то») , Так что я хочу @FieldMap («мета»)Как отправить Hashmap со значением с Retrofit

Пример, как я использую поле:

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

Как я в настоящее время используют FieldMap, но карта поле не получает отправить, потому что API ожидает массив с именем «meta», поэтому я получаю сообщение об ошибке с сервера. Метаданные не существуют в POST. API работает. Но мне нужно отправить массив с ключами и значениями, то есть Hashmap в Java.

Я звоню этот 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); 

EDIT 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 

Я попытался с кодирования = истинным и ложным и тем же результатом. Это то, что он должен отправить

meta={user_id=431} Кто-нибудь знает, как отключить кодировку?

EDIT 2: Я изменил API, поэтому я отправляю @BODY, а затем json, и он работает. Если у кого-то есть решение для главной проблемы, я тоже дам кредит.

+0

что вопрос с '@ FieldMap'? – Blackbelt

+0

'@ FieldMap' должен работать, если ваш сервер ожидает значение« Карта ». –

+0

Проблема в том, что я не могу установить имя FieldMap, как я могу в поле. Сервер ожидает массив с именем meta, но я не могу установить его имя в мета. Если я отправлю его как поле, то это не карта, это строка. – WinterChilly

ответ

-2

Использование ниже кода Спиннет:

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); 

    } 
+1

Это с Volley и не отвечает на вопрос. – WinterChilly

2

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; 
    } 
} 
+0

Что делать, если я должен предоставить ключ Api с полевой картой? – WinterChilly

+0

params.put ("apikey", yourkey); – ViramP

+0

Я попробую сразу же, дайте мне минуту – WinterChilly

Смежные вопросы