agrosner
06/28/2022, 3:37 PM{
"summary": {
....
},
"response": {
"data": {
vs the expected:
{
"errors": ...,
"data": {
agrosner
06/28/2022, 3:38 PMHttpinterceptor
but it never reaches that interceptor, and didnt know how to convert the stream to a subset of jsonmbonnin
06/28/2022, 3:39 PMmbonnin
06/28/2022, 3:39 PMmbonnin
06/28/2022, 3:40 PMagrosner
06/28/2022, 3:43 PMagrosner
06/28/2022, 3:48 PMresponse
. which will follow similiar format as regular graphql responsesmbonnin
06/28/2022, 3:50 PMval mockServer = MockServer()
val apolloClient = ApolloClient.Builder()
.serverUrl(mockServer.url())
.addHttpInterceptor(object: HttpInterceptor {
override suspend fun intercept(request: HttpRequest, chain: HttpInterceptorChain): HttpResponse {
val response = chain.proceed(request)
val json = AnyAdapter.fromJson(response.body!!.jsonReader(), CustomScalarAdapters.Empty) as Map<String, Any?>
val jsonString = buildJsonString {
writeAny(json["response"])
}
return HttpResponse.Builder(response.statusCode)
.body(jsonString.encodeUtf8())
.headers(response.headers)
.build()
}
})
.build()
mockServer.enqueue("""
{
"summary": "something something",
"response": {
"data": {
"hero": {
"__typename": "Droid",
"name": "R2-D2"
}
}
}
}
""".trimIndent())
val data = apolloClient.query(EpisodeHeroNameQuery(Episode.NEWHOPE)).execute().data
mbonnin
06/28/2022, 3:50 PMmbonnin
06/28/2022, 3:50 PMmbonnin
06/28/2022, 3:51 PMagrosner
06/28/2022, 4:00 PM.addHttpInterceptor(object: HttpInterceptor {
override suspend fun intercept(request: HttpRequest, chain: HttpInterceptorChain): HttpResponse {
val response = chain.proceed(request)
val body = response.body!!
return response.newBuilder()
.body(body)
.build()
}
})
obviously doesnt actually do anything but it wasnt even hitting this breakpoint. im going to try againmbonnin
06/28/2022, 4:01 PMresponse.newBuilder().body(body)
this fails on "impossible to set body twice"mbonnin
06/28/2022, 4:02 PMmbonnin
06/28/2022, 4:03 PMmbonnin
06/28/2022, 4:03 PMagrosner
06/28/2022, 4:05 PMagrosner
06/28/2022, 4:05 PMagrosner
06/28/2022, 4:18 PMmbonnin
06/28/2022, 4:18 PMagrosner
06/28/2022, 5:21 PM@Suppress("BlockingMethodInNonBlockingContext")
override suspend fun intercept(request: HttpRequest, chain: HttpInterceptorChain): HttpResponse {
val response = chain.proceed(request)
val bodySource = extractNestedResponse(response)
return HttpResponse.Builder(response.statusCode)
.body(bodySource)
.headers(response.headers)
.build()
}
private fun extractNestedResponse(response: HttpResponse) =
Buffer().apply {
@Suppress("UNCHECKED_CAST")
val json = AnyAdapter.fromJson(response.body!!.jsonReader(), CustomScalarAdapters.Empty) as Map<String, Any?>
BufferedSinkJsonWriter(this, null).writeAny(json["response"])
}
bit more efficient, as we just use a buffer directly rather than turn it into string and encode utf8 back again.