当前位置: 首页 > 面试题库 >

如何使用Java访问github graphql API

杜翰林
2023-03-14
问题内容

我需要访问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错误的请求[服务器:GitHub.com,日期:2017年2月3日,星期五,格林尼治标准时间12:14:58,内容类型:application /
json; charset = utf-8,内容长度:89,状态:400错误的请求,X-RateLimit-Limit:200,X-RateLimit-
Remaining:187,X-RateLimit-Reset:1486125149,X-OAuth-
Scopes:repo,用户,X-Accepted-OAuth-Scopes:回购,X-GitHub-Media-
Type:github.v3;format = json,Access-Control-Expose-Header:ETag,链接,X-GitHub-
OTP,X-RateLimit-Limit,X-RateLimit-Remaining,X-RateLimit-Reset,X-OAuth-
Scopes,X-Accepted- OAuth范围,X轮询间隔,访问控制允许来源:*,内容安全策略:default-
src’none’,严格传输安全性:max-age = 31536000; includeSubdomains; 预加载,X-Content-Type-
Options:nosniff,X-Frame-Options:deny,X-XSS-Protection:1;模式=块,X-GitHub-
Request-Id:CF0A:0EE1:B057F26:EBCB8DF:58947441] ResponseEntityProxy
{[Content-Type:application / json; charset = utf-8,内容长度:89,已压缩: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();
        }


    }


 类似资料:
  • 问题内容: 如何以一种优雅的方式通过id获取任何HTTP会话或Web应用程序(Java 2 EE)中当前所有活动的HTTP会话? 当前,我有一个会话,一旦创建,便将其放入,一切正常,我可以随时通过会话ID从该映射中检索HTTP会话,但是看起来对象将永远不会完成……即使会话使该映射无效仍然引用无效的会话对象…我也已经阅读了这篇文章,在我看来,这是不可接受的… 换句话说,我需要一种可能性来查看任何Ht

  • 我需要访问以获得关于某个存储库的一些数据。下面的命令可以正常工作 现在我需要在中调用相同的代码,因为我需要操作输出。下面是我尝试过的代码, 我做错了什么?你能帮我解决这个问题吗。提前致谢

  • 问题内容: 我正在一个项目中,我必须使用REST并使用Java来访问一组Google日历。 该程序位于私人非Google服务器上,定期(通过cron作业)连接到Google帐户,获取链接到该帐户的日历列表,获取每个日历的上个月活动,并返回包含所有内容的XML文件信息。该程序应该能够在没有任何用户输入的情况下执行和访问日历。目前,该项目指定将仅读取日历,而不修改日历(因此将仅进行GET / LIST

  • 我有一个基本的SpringMVC应用程序,运行(和映射)很好。现在我想用MockMvc设置我的单元测试来执行get请求和其他东西。但如果我运行测试,则会出现断言错误状态: 以下是我的短期测试课程: 所以我希望MockMvc在默认情况下获得DispatcherServlet的位置。但它实际上并不是用来映射的。 我的“web.xml”和“dispatcher servlet.xml”位于“web-IN

  • 问题内容: 我已经开发了一个 JAVA SWING应用程序 。我想在安装此应用程序 几台电脑 ,所有 访问互联网 。那么我应该在哪里放置MYSQL数据库?所有这些计算机都应该能够 通过Internet访问相同的数据库。 问题答案: 出于安全性(身份验证授权,加密)和性能的原因,允许直接通过Internet访问数据库不是很常见。在大多数情况下,您将创建一个基于Web的服务器应用程序,该应用程序可以执

  • 我有客户端发送给我的以下endpoint: 由于这个请求需要通过AWS授权过程来调用,所以我想使用API网关SDK,但是我找不到如何调用它的简单示例。我能够使用Postman成功地测试API调用(如AWS文档中所述),但我不知道如何使用SDK指定它。endpoint应该是完整的URL?我该如何在此代码之外进行呼叫?我尝试使用GetResourceRequest,但这似乎不对。如果是,我拥有的这个U