如何使用 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 的连接?
如何告诉 OkHttpClient 忽略缓存并从服务器强制刷新?
如何在 Android OKHTTPClient 请求上设置(OAuth 令牌)授权标头