【问题标题】:Android retrofit 2 post raw json with dynamic headersAndroid 改造 2 发布带有动态标头的原始 json
【发布时间】:2019-06-07 15:55:45
【问题描述】:

我正在尝试使用带有动态标头的 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 个错误请求错误。 我错过了什么吗?

【问题讨论】:

    标签: android json header retrofit2


    【解决方案1】:

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

    1.使用 HeaderMap Retrofit 实际上有一种方法可以发送任意数量的标头。这可以通过@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 客户端与您的改造一起使用,每个请求都会添加标头。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-26
      • 2019-12-11
      • 1970-01-01
      • 1970-01-01
      • 2021-10-31
      • 1970-01-01
      • 2016-11-24
      • 1970-01-01
      相关资源
      最近更新 更多