使用 OkHttp 客户端执行原始 graphQL 查询
Posted
技术标签:
【中文标题】使用 OkHttp 客户端执行原始 graphQL 查询【英文标题】:Execute raw graphQL query using OkHttp Client 【发布时间】:2020-03-14 06:59:03 【问题描述】:我有一个 graphQL 查询,我想将其作为原始请求执行,并且不想依赖任何客户端来执行此请求(我不想使用 apollo 客户端 for android 来执行它)
我已经创建了形成这个查询的字符串,并尝试使用 OkHttp 客户端发出这个请求,但我认为有一些东西丢失了,因为每次我发送请求时,响应都是内部服务器错误。但是,如果我使用 apollo-client for android 执行此查询,它会返回响应。
这是我使用 OkHttp 执行原始查询请求的尝试:
val requestBodyString = " cities\n" +
" name\n" +
" "
fun makeRequest(url: String): Response
val client = OkHttpClient()
val requestBody = RequestBody.create(null, requestBodyString)
val request = Request.Builder().url(url).post(requestBody)
.addHeader("content-type", "application/graphql").build()
return client.newCall(request).execute()
我关注yelp documentation 提出请求,但它对我不起作用。我不知道为什么?
【问题讨论】:
【参考方案1】:尝试以 JSON 格式发送
val query = " cities\n" +
" name\n" +
" "
fun makeRequest(url: String): Response
val client = OkHttpClient()
val json = JSONObject()
json.put("query",query)
val requestBody = RequestBody.create(null, json.toString())
val request = Request.Builder().url(url).post(requestBody)
.addHeader("content-type", "application/json").build()
return client.newCall(request).execute()
【讨论】:
【参考方案2】:我最近正在尝试类似的东西。我想出的解决方案是使用编码的查询参数访问 URL。
String url = url + "query?" + URLEncoder.encode(query);
我已经成功使用 OkHttp,但我注意到其他一些客户端无法与 GraphQl 通信。
编辑:无论如何,我使用的 URL 不是安全的 (http),我设置的唯一标头是基本身份验证。
【讨论】:
以上是关于使用 OkHttp 客户端执行原始 graphQL 查询的主要内容,如果未能解决你的问题,请参考以下文章
Apollo 客户端无法连接到 GraphQL 服务器(http 调用执行失败)
使用 WebSocket 的原始 javascript GraphQL 订阅不起作用