如何从java访问github graphql API而不在java中运行curl命令 [英] how to access the github graphql API from java without running curl commands inside java

查看:15
本文介绍了如何从java访问github graphql API而不在java中运行curl命令的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

请原谅我的长问题,因为我是 graphql 的初学者.我需要访问 github graphql API 以获取某个文件的责备详细信息,因为到目前为止,github API 版本 3.我可以获得以下 graphql 查询的输出,该查询在 中运行这里

Pardon me for the long question as I am a beginner to graphql. I need to access the github graphql API to get the blame details on a certain file, as upto now there is no blame REST API available in github API version 3. I can get output for the below graphql query which runs in here

  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
              }
            }
          }
        }
      }
    }
  }
}

在终端中运行以下 curl 命令

from running the following curl command in the terminal

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 中运行相同的 curl 命令,如下所示

and running the same curl command inside Java as below

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Demo {
    public static void main(String[] args) {

        String url="https://api.github.com/graphql";
           String[] command = {"curl", "-H" ,"Authorization: Bearer myGitHubToken","-H","Accept:application/json","-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 } } } } } } } }"}" , url};
            ProcessBuilder process = new ProcessBuilder(command); 
            Process p;
            try
            {
                p = process.start();
                 BufferedReader reader =  new BufferedReader(new InputStreamReader(p.getInputStream()));
                    StringBuilder builder = new StringBuilder();
                    String line = null;
                    while ( (line = reader.readLine()) != null) {
                            builder.append(line);
                            builder.append(System.getProperty("line.separator"));
                    }
                    String result = builder.toString();
                    System.out.print(result);

            }
            catch (IOException e)
            {   System.out.print("error");
                e.printStackTrace();
            }
    }

}

有没有其他方法可以在 java 中获得相同的输出而不运行 curl 命令,就像在 java 中运行 curl 命令一样不是一个好习惯(根据我的观点).提前致谢

is there any other way that I can get the same output in java without running curl commands, as running curl commands inside java is not a good practice (according to my view). Thanks in advance

使用 httpClient 代码更新

这是我用 apache httpClient 尝试的代码

here is the code I tried with apache httpClient

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");


        String temp="{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 } } } } } } } }";

//        String temp="{repository(owner:"wso2",name:"product-is"){description}}";

        try {

           StringEntity entity= new StringEntity("{"query":"query "+temp+""}");

            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();
        }


    }

但它给了我即使 {repository(owner:"wso2",name:"product-is"){description}}

{"message":"解析 JSON 的问题","documentation_url":"https://developer.github.com/v3"}

{"message":"Problems parsing JSON","documentation_url":"https://developer.github.com/v3"}

但是当传递这样的简单查询时 String temp="{viewer {email login }}"; 它可以工作.我的代码有什么问题.请帮忙

but when simple query like this is passed String temp="{viewer {email login }}"; it works. What is wrong with my code. Please help

推荐答案

问题几乎是您添加了额外的查询"字样,应该是像这样:

The issue is pretty much that you have added an extra "query" word, it should be something like this:

(...)
StringEntity entity= new StringEntity("{"query":""+temp+""}");

虽然我应该提醒你,你应该尽量避免尝试硬编码 json,因此,理想情况下你应该使用 JSON 库,结果是这样的(完整代码):

Although I should remind you that you should avoid trying to hardcode json as much as possible, therefore, the ideal scenario you should use a JSON library, resulting in something like this (full code):

import org.json.JSONObject; // New import

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();
        }


    }

注意转义双引号是如何让java可以将其理解为单个字符串的.

Take a note on how the escaped double quotes are just the ones so java can understand it as a single string.

这篇关于如何从java访问github graphql API而不在java中运行curl命令的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆