【发布时间】: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
【问题讨论】: