Модификация Android 2 пост сырой JSON с динамическими заголовками - PullRequest
0 голосов
/ 07 июня 2019

Я пытаюсь опубликовать необработанный JSON с использованием Retrofit 2 с динамическими заголовками в запросе Android, содержит несколько заголовков, которые находятся ниже, и код, который я пробовал, но я не могу понять, что идет не так.

Заголовки

Accept:text/csv
x-api-key:{{api_key}}
x-session-key:{{session_token}}
x-location:-10,10
x-version:1.0
x-client-id:15
Content-Type:application/json

raw JSON, которые я хочу опубликовать

 {
    "commands":[
        {
                "command":"check_in",
                "sale_content_id": 1,
                "event_id": 3,
                "value": true
        }
    ]
}

ниже мойкод

@Headers({"Accept: text/csv", "Content-Type: application/json"})
@POST(CHECKIN_DATA_SCANNER)
Call<CheckIn> sendCheckinDataRequest(@Body JSONObject locationPost);

Как я могу сделать модернизированный вызов в классе своей деятельности

private void sendCheckinDataRequest() {

        String mSessionToken = mContext.getSessionToken();
        String mAPIkey = "staging_api_key";
        String mClientId = "15";

        RestInterface service = CheckInServiceGenerator.createService(RestInterface.class, mSessionToken, mAPIkey, mClientId);
        Call<CheckIn> call = service.sendCheckinDataRequest(mRawJson);
        call.enqueue(new Callback<CheckIn>() {
            @Override
            public void onResponse(Call<CheckIn> call, Response<CheckIn> response) {

                Log.e(TAG, "POST RESPONSE : " + new Gson().toJson(response));

            }

            @Override
            public void onFailure(Call<CheckIn> call, Throwable t) {
                // something went completely south (like no internet connection)

                Log.d("Error", t.getMessage());
            }
        });

    }

Я получаю ошибку 400 неверных запросов.Я что-то упустил?

1 Ответ

1 голос
/ 09 июня 2019

Есть несколько способов справиться с этим.Позвольте мне показать вам

1.Использование HeaderMap Модернизация фактически позволяет посылать произвольное количество заголовков.Это может быть достигнуто с помощью @HeaderMap.

@Headers({"Accept: text/csv", "Content-Type: application/json"})
@POST(CHECKIN_DATA_SCANNER)
Call<CheckIn> sendCheckinDataRequest(
         @Body JSONObject locationPost, 
         @HeaderMap Map<String, String> headers);

, который можно назвать как:

 Map<String, String> headers = HashMap<>();
 // Populate map with headers
 service.sendCheckinDataRequest(mRawJson, headers);

2.Использование отдельных параметров Если у вас есть только несколько динамических заголовков, то вы можете просто использовать обычные параметры:

@Headers({"Accept: text/csv", "Content-Type: application/json"})
@POST(CHECKIN_DATA_SCANNER)
Call<CheckIn> sendCheckinDataRequest(
         @Body JSONObject locationPost, 
         @Header("x-api-key") String apiKey,
         @Header("x-session-key") String sessionKey);

Можно назвать так:

 service.sendCheckinDataRequest(mRawJson, apiKey, sessionKey);

3.Использование перехватчиков Если вы хотите использовать эти заголовки для всех запросов, то, возможно, проще всего использовать перехватчик:

OkHttpClient.Builder httpClient = new OkHttpClient.Builder();  
httpClient.addInterceptor(new Interceptor() {  
  @Override
  public Response intercept(Interceptor.Chain chain) throws IOException {
    Request original = chain.request();

    Request request = original.newBuilder()
        .header("x-api-key", <apiKey>)
        .header("x-session-key", <sessionKey>)
        .method(original.method(), original.body())
        .build();

    return chain.proceed(request);
  }
}

Используйте этот клиент okhttp с Retrofit, и к каждому запросу будут добавлены заголовки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...