【问题标题】:How to add multiple headers in retrofit responses in Android如何在 Android 的改造响应中添加多个标头
【发布时间】:2019-12-25 06:32:20
【问题描述】:

在我的应用程序中,我想从服务器获取一些数据,为此我使用了 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$1.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)

我该如何解决?

【问题讨论】:

  • 这可能很愚蠢,但是 logcat 抱怨字符 #12,它(取决于您开始阅读它的位置)恰好是“Content-Type”和“:”符号之间的空格。试试“Content-Type:”而不是“Content-Type:”
  • @TooManyEduardos, ohhh yeees :D 我应该使用 Content-Type: 。谢谢亲爱的

标签: android kotlin retrofit retrofit2


【解决方案1】:

改变

"Content-Type : application/json"

"Content-Type: application/json"

只需删除Content-Type 后面的空白即可:)

【讨论】:

    【解决方案2】:

    你可以使用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>>
    

    【讨论】:

    • 谢谢亲爱的,但我添加到 newAddress 方法中,我应该在所有使用的页面中添加这个 newAddress
    • 如果你想要动态标题,你可以这样做
    • 当我使用这个 HeaderMap 时,它并没有获取所有值,其中一些值正在丢失。看穿拦截器时它们不见了
    【解决方案3】:

    你可以像这样使用你的方法:

     fun callLoginAPI(@HeaderMap header: Map<String, String>)
    

    调用此方法时只需创建地图添加所有标题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-11
      • 2017-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-17
      • 2012-08-25
      相关资源
      最近更新 更多