如何在 Android 中的改造响应中添加多个 headers
How to add multiple headers in retrofit responses in Android
在我的应用程序中,我想从服务器获取一些数据,为此我使用了 retrofit。
我应该添加一些 Headers 但在 运行 应用程序后显示 ForceClose 错误!
ApiServices 代码:
interface ApiServices {
@Headers(
"Accept: application/json",
"Content-Type : application/json"
)
@POST("user/get-password")
fun sendPhoneNumber(@Body body: LoginSendPhoneBody): Single<Response<LoginSendPhoneResponse>>
@Headers(
"Accept: application/json",
"Content-Type : application/json"
)
@POST("addresses")
fun newAddress(@Header("Authorization") userToken: String, @Body body: NewAddressBody):
Single<Response<NewAddressResponse>>
}
我的 Retrofit 版本是 2.5.0 !
在 retrofit 文档中我阅读了多个 header 我应该使用 {}
到 Headers 例如 @Headers({...})
,但添加 {}
后显示错误,我无法使用 {}
!
Logcat 错误:
java.lang.IllegalArgumentException: Unexpected char 0x20 at 12 in header name: Content-Type
at okhttp3.Headers.checkName(Headers.java:261)
at okhttp3.Headers$Builder.add(Headers.java:311)
at retrofit2.RequestFactory$Builder.parseHeaders(RequestFactory.java:283)
at retrofit2.RequestFactory$Builder.parseMethodAnnotation(RequestFactory.java:224)
at retrofit2.RequestFactory$Builder.build(RequestFactory.java:161)
at retrofit2.RequestFactory.parseAnnotations(RequestFactory.java:65)
at retrofit2.ServiceMethod.parseAnnotations(ServiceMethod.java:25)
at retrofit2.Retrofit.loadServiceMethod(Retrofit.java:168)
at retrofit2.Retrofit.invoke(Retrofit.java:147)
at java.lang.reflect.Proxy.invoke(Proxy.java:913)
at $Proxy2.sendPhoneNumber(Unknown Source)
at com.app.app.data.network.ApiUseCase.getSendPhoneNumber(ApiUseCase.kt:42)
我该如何解决?
可以用HeaderMap,一样
val header = HashMap<String, String>()
header["Accept"] = "application/json"
header["Content-Type"] = "application/json"
header["Authorization"] = "userToken"
@POST("addresses")
fun newAddress(@HeaderMap headers: Map<String, String>, @Body body: NewAddressBody): Single<Response<NewAddressResponse>>
你可以像这样使用你的方法:
fun callLoginAPI(@HeaderMap header: Map<String, String>)
调用此方法时,只需创建地图即可添加所有 headers
改变
"Content-Type : application/json"
至
"Content-Type: application/json"
去掉Content-Type
后面的空格即可:)
在我的应用程序中,我想从服务器获取一些数据,为此我使用了 retrofit。
我应该添加一些 Headers 但在 运行 应用程序后显示 ForceClose 错误!
ApiServices 代码:
interface ApiServices {
@Headers(
"Accept: application/json",
"Content-Type : application/json"
)
@POST("user/get-password")
fun sendPhoneNumber(@Body body: LoginSendPhoneBody): Single<Response<LoginSendPhoneResponse>>
@Headers(
"Accept: application/json",
"Content-Type : application/json"
)
@POST("addresses")
fun newAddress(@Header("Authorization") userToken: String, @Body body: NewAddressBody):
Single<Response<NewAddressResponse>>
}
我的 Retrofit 版本是 2.5.0 !
在 retrofit 文档中我阅读了多个 header 我应该使用 {}
到 Headers 例如 @Headers({...})
,但添加 {}
后显示错误,我无法使用 {}
!
Logcat 错误:
java.lang.IllegalArgumentException: Unexpected char 0x20 at 12 in header name: Content-Type
at okhttp3.Headers.checkName(Headers.java:261)
at okhttp3.Headers$Builder.add(Headers.java:311)
at retrofit2.RequestFactory$Builder.parseHeaders(RequestFactory.java:283)
at retrofit2.RequestFactory$Builder.parseMethodAnnotation(RequestFactory.java:224)
at retrofit2.RequestFactory$Builder.build(RequestFactory.java:161)
at retrofit2.RequestFactory.parseAnnotations(RequestFactory.java:65)
at retrofit2.ServiceMethod.parseAnnotations(ServiceMethod.java:25)
at retrofit2.Retrofit.loadServiceMethod(Retrofit.java:168)
at retrofit2.Retrofit.invoke(Retrofit.java:147)
at java.lang.reflect.Proxy.invoke(Proxy.java:913)
at $Proxy2.sendPhoneNumber(Unknown Source)
at com.app.app.data.network.ApiUseCase.getSendPhoneNumber(ApiUseCase.kt:42)
我该如何解决?
可以用HeaderMap,一样
val header = HashMap<String, String>()
header["Accept"] = "application/json"
header["Content-Type"] = "application/json"
header["Authorization"] = "userToken"
@POST("addresses")
fun newAddress(@HeaderMap headers: Map<String, String>, @Body body: NewAddressBody): Single<Response<NewAddressResponse>>
你可以像这样使用你的方法:
fun callLoginAPI(@HeaderMap header: Map<String, String>)
调用此方法时,只需创建地图即可添加所有 headers
改变
"Content-Type : application/json"
至
"Content-Type: application/json"
去掉Content-Type
后面的空格即可:)