Android 使用OkHTTP进行改装,不使用@FormUrlEncoded设置内容类型
我试图通过Android上的改型2通过Android 使用OkHTTP进行改装,不使用@FormUrlEncoded设置内容类型,android,retrofit2,okhttp,okhttp3,Android,Retrofit2,Okhttp,Okhttp3,我试图通过Android上的改型2通过x-www-form-urlencoded实现auth,但遇到了一个问题,标题内容类型没有设置@FormUrlEncoded注释,我试图手动设置,但是,当我使用类似coent Type的输入法设置它时,它工作正常,我可以在标题中看到它 改装版本:2.4.0 所以我的问题是:为什么@FormUrlEncoded不设置内容类型以及@Header注释,或者什么可以从Header中删除它 我的请求: @FormUrlEncoded @POST("acco
x-www-form-urlencoded
实现auth,但遇到了一个问题,标题内容类型
没有设置@FormUrlEncoded
注释,我试图手动设置,但是,当我使用类似coent Type
的输入法设置它时,它工作正常,我可以在标题中看到它
改装版本:2.4.0
所以我的问题是:为什么@FormUrlEncoded
不设置内容类型以及@Header
注释,或者什么可以从Header中删除它
我的请求:
@FormUrlEncoded
@POST("account/login")
Single<LoginResponse> login(@Field("memberId") String memberId,
@Field("pin") String pin);
作为一种解决方法,我实现了以下拦截器:
Interceptor createHeaderTransformationInterceptor() {
return chain -> {
final Request request = chain.request();
String dataType = request.header("Data-Type");
final Request resultRequest = dataType == null
? request
: chain.request().newBuilder()
.removeHeader("Data-Type")
.addHeader("Content-Type", dataType)
.build();
return chain.proceed(resultRequest);
};
}
它可以与以下注释配合使用:
@Headers({"Data-Type: application/x-www-form-urlencoded"})
UPD:我的拦截器没有看到的原因是在存储内容类型的地方。在拦截器中查看该标头的正确方法:
Interceptor createHeaderTransformationInterceptor() {
return chain -> {
final Request request = chain.request();
String dataType = request.header("Data-Type");
final Request resultRequest = dataType == null
? request
: chain.request().newBuilder()
.removeHeader("Data-Type")
.addHeader("Content-Type", dataType)
.build();
return chain.proceed(resultRequest);
};
}
根据这项要求
@FormUrlEncoded
@POST("account/login")
Single<LoginResponse> login(@Field("memberId") String memberId,
@Field("pin") String pin);
它通过此请求以详细模式打印所有日志
@FormUrlEncoded
@POST("account/login")
Single<LoginResponse> login(@Field("memberId") String memberId,
@Field("pin") String pin);
它通过@FormUrlEncoded注释“Content Type:FormUrlEncoded”以详细模式打印所有日志。使用“拦截器”并通过@FormUrlEncoded注释记录您的结果,“内容类型:FormUrlEncoded”由改装自动添加。使用“拦截器”并记录您的结果。我的
日志拦截程序没有看到。谢谢。我的LoggingInterceptor
没有看到这一点。
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.addInterceptor(interceptor.setLevel(HttpLoggingInterceptor.Level.BODY))
.connectTimeout(2, TimeUnit.MINUTES)
.writeTimeout(2, TimeUnit.MINUTES)
.readTimeout(2, TimeUnit.MINUTES)
.build();