我正在尝试使用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个错误的请求错误。 我想念什么吗?
答案 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一起使用,每个请求都将添加标头。