如何从java访问github graphql API而不在java中运行curl命令 [英] how to access the github graphql API from java without running curl commands inside java
问题描述
请原谅我的长问题,因为我是 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屋!