【问题标题】:The Cat Api: SocketTimeout when given header api keyCat Api:给定标头 api 键时的 SocketTimeout
【发布时间】:2022-01-04 02:58:06
【问题描述】:

我正在用这个 api(https://docs.thecatapi.com/api-reference/images/images-search) 测试改造

只有两个类

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)


        Toast.makeText(this, "Calling API", Toast.LENGTH_LONG).show()
        GlobalScope.launch{
            val result = CatApiService.create().getCats(50,5,100,"json", "RANDOM")
            Log.i("My tag", "Success: retrieved size ${result.size}")
        }
    }
}
interface CatApiService {

    @GET("search/")
    suspend fun getCats(
        @Query("size") size: Int,
        @Query("page") page: Int,
        @Query("limit") limit: Int,
        @Query("format") format: String,
        @Query("order") order: String
    ): List<CatApiResponse>

    companion object {
        private const val BASE_URL = "https://api.thecatapi.com/v1/images/"

        fun create(): CatApiService {
            val client = OkHttpClient.Builder()
                .connectTimeout(10, TimeUnit.DAYS)
                 //add header to every request
                .addInterceptor(Interceptor { chain ->
                    val request = chain.request().newBuilder()
                        .addHeader("x-api-key", "{my api key}")  // <-- cause Timeout problem
                        .build()
                    return@Interceptor chain.proceed(request)
                })
                .build()
            return Retrofit.Builder()
                .baseUrl(BASE_URL)
                .client(client)
                .addConverterFactory(GsonConverterFactory.create())
                .build()
                .create(CatApiService::class.java)
        }
    }

当我在标头中传入 x-api-key 时遇到此异常

E/AndroidRuntime: FATAL EXCEPTION: DefaultDispatcher-worker-1
    Process: com.example.catapi, PID: 14495
    java.net.SocketTimeoutException: timeout
        at okhttp3.internal.http2.Http2Stream$StreamTimeout.newTimeoutException(Http2Stream.java:678)
        at okhttp3.internal.http2.Http2Stream$StreamTimeout.exitAndThrowIfTimedOut(Http2Stream.java:686)
        at okhttp3.internal.http2.Http2Stream.takeHeaders(Http2Stream.java:154)
        at okhttp3.internal.http2.Http2ExchangeCodec.readResponseHeaders(Http2ExchangeCodec.java:136)
        at okhttp3.internal.connection.Exchange.readResponseHeaders(Exchange.java:115)
        at okhttp3.internal.http.CallServerInterceptor.intercept(CallServerInterceptor.java:94)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142)
        at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:43)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:117)
        at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:94)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:117)
        at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142)
        at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:88)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:117)
        at com.example.catapi.CatApiService$Companion.create$lambda-0(CatApiService.kt:34)
        at com.example.catapi.CatApiService$Companion.$r8$lambda$C6xqju8Deb6TFLdSpnGAaQEl2bI(Unknown Source:0)
        at com.example.catapi.CatApiService$Companion$$ExternalSyntheticLambda0.intercept(Unknown Source:0)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:117)
        at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:229)
        at okhttp3.RealCall$AsyncCall.execute(RealCall.java:172)
        at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:923)

我在邮递员上进行了测试,所以 api 工作,我的 api 密钥也工作,我还检查了我在设备上启用了互联网。如果未放入标头,则 api 正确返回响应。 我想知道我是否没有正确设置改造??

附上一个示例项目来演示问题。运行并等待 10 秒崩溃。

https://github.com/yatw/CatApiRetrofit/tree/master/app/src/main/java/com/example/catapi

【问题讨论】:

    标签: android kotlin retrofit


    【解决方案1】:

    找到解决方法,增加 okhttpclient 中的读取超时

    
            val client = OkHttpClient.Builder()
    
                    .readTimeout(60, TimeUnit.SECONDS) // this line fix the problem
                     //add header to every request
                    .addInterceptor(Interceptor { chain ->
                        val request = chain.request().newBuilder()
                            .addHeader("x-api-key", "api-key")
                            .build()
                        return@Interceptor chain.proceed(request)
                    })
                    .build()
                return Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .client(client)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build()
                    .create(CatApiService::class.java)
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-11
      • 1970-01-01
      • 1970-01-01
      • 2018-07-07
      • 2014-03-08
      • 2016-05-18
      • 2018-08-15
      相关资源
      最近更新 更多