Android Retrofit 2发布带有动态标题的原始JSON

时间:2019-06-07 15:55:45

标签: android json header retrofit2

我正在尝试使用Retrofit 2在Android请求中发布带有动态标头的原始JSON,其中包含以下标头和我尝试过的代码,但我无法理解出了什么问题。

标题

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

我要发布的原始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 个答案:

答案 0 :(得分:1)

有几种方法可以解决此问题。让我给你看一些

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一起使用,每个请求都将添加标头。