使用 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 查询的主要内容,如果未能解决你的问题,请参考以下文章

端到端流中的多个 GraphQL “跃点”?

Apollo 客户端无法连接到 GraphQL 服务器(http 调用执行失败)

为啥 OkHttp 不重用它的连接?

使用 WebSocket 的原始 javascript GraphQL 订阅不起作用

如何使用 SQLAlchemy 从 graphQL 获取已编译的原始 sql?

GraphQL 查询仅显示原始结果