Как получить доступ к API-интерфейсу github graphql с помощью java

Мне нужно получить доступ к 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, Дата: Пт, 03 фев 2017 12:14:58 GMT, Content-Type: application/json; charset = utf-8, Content-Length: 89, Status: 400 Bad Request, X-RateLimit-Limit: 200, X-RateLimit-Осталось: 187, X-RateLimit- Reset: 1486125149, X-OAuth-Scopes: репо, пользователь, 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]}}

что я делаю неправильно? Не могли бы вы быть добрыми, чтобы помочь мне исправить это. Спасибо заранее

Ответ 1

Получив программу, изменив приведенный выше код, как показано ниже. И хорошая практика использовать библиотеку 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();
        }


    }