如何使用 okHttpClient 执行 graphql 查询?

Posted

技术标签:

【中文标题】如何使用 okHttpClient 执行 graphql 查询?【英文标题】:How to excute graphql query with okHttpClient? 【发布时间】:2021-05-06 16:17:56 【问题描述】:

我有这个查询正在处理邮递员

    query  
getInstallment(amount: "400", bin: "400000", userName: "guille") 
    cardBrand


但是当我尝试使用 okHttpClient 执行此有效负载时

    OkHttpClient client = new OkHttpClient();

    MediaType mediaType = MediaType.parse("application/graphql");
    RequestBody body = RequestBody.create(mediaType, "query  \n" +
            "getInstallment(amount: \"400\", bin: \"400000\", userName: \"sbernal\") \n" +
            "    cardBrand\n" +
            "");
    Request request = new Request.Builder()
            .url("https://awsendpoint.appsync-api.us-east-1.amazonaws.com/graphql")
            .post(body)
            .addHeader("x-api-key", "dket")
            .build();

    Response response = client.newCall(request).execute();
    System.out.println(response.code());



    OkHttpClient client = new OkHttpClient();

    MediaType mediaType = MediaType.parse("application/graphql");
    RequestBody body = RequestBody.create(mediaType, "query  \n" +
            "getInstallment(amount: \"400\", bin: \"400000\", userName: \"guille\") \n" +
            "    cardBrand\n" +
            "");
    Request request = new Request.Builder()
            .url("https://ziexbkvj5bghnnyicsbge737oa.appsync-api.us-east-1.amazonaws.com/graphql")
            .post(body)
            .addHeader("x-api-key", "da2-7utq5lkg5zcllodmlzp66dd3vy")
            .build();

    Response response = client.newCall(request).execute();
    System.out.println(response.code());




我得到一个错误 400,我做错了什么?我应该使用另一个 httpclient 吗?

【问题讨论】:

您收到什么错误信息?您可以在发送之前对有效负载进行 json 编码 ``` String query = "query \n" + "getInstallment(amount: \"400\", bin: \"400000\", userName: \"guille\") \n" + " cardBrand\n" + "" URLEncoder.encode(query) ``` @DhanialRizkyWiraPutra 我收到 400(错误请求) 你能展示一个与 chrome 命令类似的工作示例吗? 【参考方案1】:

可能有 2 个问题(+ 1 个弃用和 1 个注释):

    我在 appsync 中成功使用了“application/json”(但我没有尝试使用“application/graphql”):
    public static final MediaType JSON = MediaType.get("application/json; charset=utf-8");
    body的内容必须是Json序列化的String:
RequestBody body = RequestBody.create(mediaType, " \"query\": \"query  \n" +
            "getInstallment(amount: \"400\", bin: \"400000\", userName: \"sbernal\") \n" +
            "    cardBrand\n" +
            " ");

    使用的 RequestBody.create 现在已弃用,但您可以将 Json 字符串作为第一个参数来删除弃用警告。

    为了完整起见,请注意 Json 对象 [查询、操作名称和变量] 中有几个可用的键,例如:

        JsonObject json = new JsonObject();
        json.addProperty("query", "mutation CreateAccount($name: String!) \n"
        + "  createAccount(input: name: $name) \n"
        + "    id\n"
        + "  \n"
        + "");
        json.addProperty("operationName", "CreateAccount");
        JsonObject variables = new JsonObject();
        variables.addProperty("name", "account1");
        json.add("variables", variables);
        
        RequestBody body = RequestBody.create(json.toString(), JSON);

【讨论】:

以上是关于如何使用 okHttpClient 执行 graphql 查询?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 OkHttpClient 真正断开与 WebSocket 的连接?

如何创建符合 GRPC 的 OkHttpClient?

如何告诉 OkHttpClient 忽略缓存并从服务器强制刷新?

如何在 Android OKHTTPClient 请求上设置(OAuth 令牌)授权标头

如何在 Android OKHTTPClient 请求上设置(OAuth 令牌)授权标头

Android Studio OkHttpClient使用