Response 로 받는 body 데이터 외에 Header 에 오는 데이터를 사용하는 방법을 알아 봅니다.

실제 데이터 대신 MockWebServer 를 대신 사용해서 Response 및 Header 데이터를 생성하고 가져오는 테스트를 합니다.


app/build.gradle

dependencies {
    testImplementation("com.squareup.okhttp3:mockwebserver:4.9.0")
}
  • mockwebserver 디펜던시 추가


SampleResponse

data class SampleResponse(
  val id: Long,
  val name: String
)
  • 간단한 Response 객체 생성


Api Interface

interface Api {
    @GET("sample")
    fun getSample(): Call<SampleResponse>
}
  • API 호출에 사용할 샘플 추가


전체 코드

class ApiHeaderParsingTest {
    private val server: MockWebServer = MockWebServer()
    private lateinit var api: Api
    
    private val lock: CountDownLatch = CountDownLatch(1)

    @Before
    fun init() {
        server.start()
        val interceptor = HttpLoggingInterceptor()
        interceptor.level = HttpLoggingInterceptor.Level.BODY

        val client = OkHttpClient.Builder()
                .addInterceptor(ExceptionInterceptor())
                .addInterceptor(interceptor)

        api = Retrofit.Builder()
            .baseUrl(server.url("/"))
            .addConverterFactory(provideConverterFactory())
            .client(client.build())
            .build()
            .create(Api::class.java)
    }

    private fun provideConverterFactory(): Converter.Factory {
        return MoshiConverterFactory.create(
            Moshi.Builder()
                .add(KotlinJsonAdapterFactory())
                .build()
        )
    }

    @Test
    fun `Get Response Header Test`() {

        // Assign
        val response = MockResponse()
            .setResponseCode(HttpURLConnection.HTTP_OK)
            .setHeader("group", "a")
            .setBody(FixtureResponse.Sample)

        server.enqueue(response)

        val result = api.getSample()
        result.enqueue(object : Callback<SampleResponse> {
            override fun onResponse(
                call: Call<SampleResponse>,
                response: Response<SampleResponse>
            ) {
                // get headers
                val headers = response.headers()

                val group = headers.get("group")
                println("group: $group")

                Assert.assertEquals(group, "a")
            }

            override fun onFailure(call: Call<SampleResponse>, t: Throwable) {
                TODO("Not yet implemented")
            }
        })

        // 테스트 함수가 지속되도록 딜레이
        lock.await(5000, TimeUnit.MILLISECONDS)
    }

    @After
    fun shutdown() {
        server.shutdown()
    }
}
  • Retrofit 의 Call 을 사용해서 Response 를 받게한다.
  • CallBack 을 통해서 response.getHeaders() 에 전달된 header 정보를 가져온다.
  • header 의 get 함수를 통해서 필요한 헤더 정보를 가져온다.
/** Returns the last value corresponding to the specified field, or null. */
  public @Nullable String get(String name) {
    return get(namesAndValues, name);
  }



참고

MockWebServer