简体   繁体   English

如何从Java访问github graphql API而不在Java内部运行curl命令

[英]how to access the github graphql API from java without running curl commands inside java

Pardon me for the long question as I am a beginner to graphql . 因为我是graphql的初学者, 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 . 我需要访问github graphql API来获取某个文件上的责任详细信息,因为到目前为止, github API版本3中还没有责任REST API I can get output for the below graphql query which runs in here 我可以获取以下在这里运行的graphql查询的输出

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

from running the following curl command in the terminal 在终端中运行以下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

and running the same curl command inside Java as below 并在Java内部运行相同的curl命令,如下所示

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

}

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). 还有其他方法可以在不运行curl命令的情况下在java获得相同的输出,因为在java运行curl命令不是一种好习惯(根据我的观点)。 Thanks in advance 提前致谢

Update with a httpClient code 使用httpClient代码更新

here is the code I tried with apache httpClient 这是我用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();
        }


    }

but it gives me even with the small query of {repository(owner:\\"wso2\\",name:\\"product-is\\"){description}} 但即使使用{repository(owner:\\"wso2\\",name:\\"product-is\\"){description}}的小查询,它也能带给我

{"message":"Problems parsing JSON","documentation_url":" https://developer.github.com/v3 "} {“ message”:“问题解析JSON”,“ documentation_url”:“ https://developer.github.com/v3 ”}

but when simple query like this is passed String temp="{viewer {email login }}"; 但是当传递这样的简单查询时, 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+"\"}");

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): 尽管我应该提醒您,您应该避免尝试对json进行硬编码,但是,理想的情况下,您应该使用JSON库,从而产生如下所示(完整代码):

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


    }

Take a note on how the escaped double quotes are just the ones so java can understand it as a single string. 请注意转义的双引号仅是那些,以便java可以将其理解为单个字符串。

@AdrianoMartins answer is correct, but I was able to get my program working by simply modifying the line @AdrianoMartins的答案是正确的,但是我只需修改该行就可以使我的程序正常工作

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

to

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

So the total program will be as 所以整个程序将是

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


    }

as Adriano Martins has also suggested it is better to use a JSON library than hardcoding a JSON 正如Adriano Martins还建议的那样,使用JSON库比对JSON硬编码更好

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM