如何使用java访问github graphql API

我需要访问github graphql API来获取有关某个存储库的一些数据。 以下curl命令工作正常

 curl -i -H "Authorization: bearer myGithubToken" -X POST -d '{"query": "query { repository(owner: \"wso2-extensions\", name: \"identity-inbound-auth-oauth\") { object(expression:\"83253ce50f189db30c54f13afa5d99021e2d7ece\") { ... on Commit { blame(path: \"components/org.wso2.carbon.identity.oauth.endpoint/src/main/java/org/wso2/carbon/identity/oauth/endpoint/authz/OAuth2AuthzEndpoint.java\") { ranges { startingLine endingLine age commit { message url history(first: 2) { edges { node { message url } } } author { name email } } } } } } } }"}' https://api.github.com/graphql 

现在我需要在Java调用相同的操作输出。 这是我试过的代码,

  public void callGraphqlApi(){ CloseableHttpClient httpClientForGraphql = null; CloseableHttpResponse httpResponseFromGraphql= null; httpClientForGraphql=HttpClients.createDefault(); HttpPost httpPost= new HttpPost("https://api.github.com/graphql"); String query= "query\":\"query { repository(owner: \"wso2-extensions\", name:\"identity-inbound-auth-oauth\") { object(expression: \"83253ce50f189db30c54f13afa5d99021e2d7ece\") { ... on Commit { blame(path: \"components/org.wso2.carbon.identity.oauth.endpoint/src/main/java/org/wso2/carbon/identity/oauth/endpoint/authz/OAuth2AuthzEndpoint.java\") { ranges { startingLine endingLine age commit { message url history(first: 2) { edges { node { message url } } } author { name email } } } } } } } }"; httpPost.addHeader("Authorization","Bearer myGithubToken"); try { StringEntity params= new StringEntity(query); httpPost.addHeader("content-type","application/x-www-form-urlencoded"); httpPost.setEntity(params); httpResponseFromGraphql= httpClientForGraphql.execute(httpPost); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } 

当我调试代码时,它向我显示了这个错误,

HttpResponseProxy {HTTP / 1.1 400 Bad Request [服务器:GitHub.com,日期:星期五,2017年2月3日12:14:58 GMT,Content-Type:application / json; charset = utf-8,Content-Length:89,Status:400 Bad Request,X-RateLimit-Limit:200,X-RateLimit-Remaining:187,X-RateLimit-Reset:1486125149,X-OAuth-Scopes:repo, user,X-Accepted-OAuth-Scopes:repo,X-GitHub-Media-Type:github.v3; format = json,Access-Control-Expose-Headers:ETag,Link,X-GitHub-OTP,X-RateLimit-Limit,X-RateLimit-Remaining,X-RateLimit-Reset,X-OAuth-Scopes,X-Accepted- OAuth-Scopes,X-Poll-Interval,Access-Control-Allow-Origin:*,Content-Security-Policy:default-src’none’,Strict-Transport-Security:max-age = 31536000; includeSubdomains; preload,X-Content-Type-Options:nosniff,X-Frame-Options:deny,X-XSS-Protection:1; mode = block,X-GitHub-Request-Id:CF0A:0EE1:B057F26:EBCB8DF:58947441] ResponseEntityProxy {[Content-Type:application / json; charset = utf-8,Content-Length:89,Chunked:false]}}

我做错了什么? 能帮助我解决这个问题吗? 提前致谢

通过更改上面的代码使程序工作如下。 最好使用JSON库来创建类似于上面的复杂JSON ,而不是手动创建它,因为大多数情况下,手动创建复杂的JSON可能会导致很多麻烦。

 import org.json.JSONObject; public void callingGraph(){ CloseableHttpClient client= null; CloseableHttpResponse response= null; client= HttpClients.createDefault(); HttpPost httpPost= new HttpPost("https://api.github.com/graphql"); httpPost.addHeader("Authorization","Bearer myToken"); httpPost.addHeader("Accept","application/json"); JSONObject jsonObj = new JSONObject(); jsonobj.put("query", "{repository(owner: \"wso2-extensions\", name: \"identity-inbound-auth-oauth\") { object(expression: \"83253ce50f189db30c54f13afa5d99021e2d7ece\") { ... on Commit { blame(path: \"components/org.wso2.carbon.identity.oauth.endpoint/src/main/java/org/wso2/carbon/identity/oauth/endpoint/authz/OAuth2AuthzEndpoint.java\") { ranges { startingLine, endingLine, age, commit { message url history(first: 2) { edges { node { message, url } } } author { name, email } } } } } } } }"); try { StringEntity entity= new StringEntity(jsonObj.toString()); httpPost.setEntity(entity); response= client.execute(httpPost); } catch(UnsupportedEncodingException e){ e.printStackTrace(); } catch(ClientProtocolException e){ e.printStackTrace(); } catch(IOException e){ e.printStackTrace(); } try{ BufferedReader reader= new BufferedReader(new InputStreamReader(response.getEntity().getContent())); String line= null; StringBuilder builder= new StringBuilder(); while((line=reader.readLine())!= null){ builder.append(line); } System.out.println(builder.toString()); } catch(Exception e){ e.printStackTrace(); } }