如何在 java 中没有 运行 curl 命令的情况下从 java 访问 github graphql API
how to access the github graphql API from java without running curl commands inside java
请原谅我这么长的问题,因为我是 graphql
的初学者。我需要访问 github graphql API
来获取某个文件的 blame 详细信息,因为到目前为止 github API version 3. I can get output for the below graphql
query which runs in here
中没有可用的 blame REST API
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
命令
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
命令如下
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();
}
}
}
有没有其他方法可以在没有 运行 curl 命令的情况下在 java
中获得与 java
中的 运行 curl
命令相同的输出不是一个好的做法(根据我的观点)。提前致谢
使用 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();
}
}
但即使是 {repository(owner:\"wso2\",name:\"product-is\"){description}}
的小查询,它也给了我
{"message":"Problems parsing JSON","documentation_url":"https://developer.github.com/v3"}
但是当像这样的简单查询被传递时 String temp="{viewer {email login }}";
它起作用了。我的代码有什么问题。请帮助
问题是你多加了一个"query"字,应该是
像这样:
(...)
StringEntity entity= new StringEntity("{\"query\":\""+temp+"\"}");
虽然我应该提醒你,你应该尽可能避免尝试硬编码 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();
}
}
记下转义双引号是如何成为双引号的,这样 java 就可以将其理解为单个字符串。
@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 } } } } } } } }";
到
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 } } } } } } } }";
所以整个程序将是
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();
}
}
正如 Adriano Martins 还建议的那样,使用 JSON
库比硬编码 JSON
更好
您还应该添加
responce.close()
按照此处的建议http://hc.apache.org/httpcomponents-client-4.4.x/tutorial/html/fundamentals.html#d5e145
请原谅我这么长的问题,因为我是 graphql
的初学者。我需要访问 github graphql API
来获取某个文件的 blame 详细信息,因为到目前为止 github API version 3. I can get output for the below graphql
query which runs in here
REST API
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
命令
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
命令如下
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();
}
}
}
有没有其他方法可以在没有 运行 curl 命令的情况下在 java
中获得与 java
中的 运行 curl
命令相同的输出不是一个好的做法(根据我的观点)。提前致谢
使用 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();
}
}
但即使是 {repository(owner:\"wso2\",name:\"product-is\"){description}}
{"message":"Problems parsing JSON","documentation_url":"https://developer.github.com/v3"}
但是当像这样的简单查询被传递时 String temp="{viewer {email login }}";
它起作用了。我的代码有什么问题。请帮助
问题是你多加了一个"query"字,应该是 像这样:
(...)
StringEntity entity= new StringEntity("{\"query\":\""+temp+"\"}");
虽然我应该提醒你,你应该尽可能避免尝试硬编码 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();
}
}
记下转义双引号是如何成为双引号的,这样 java 就可以将其理解为单个字符串。
@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 } } } } } } } }";
到
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 } } } } } } } }";
所以整个程序将是
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();
}
}
正如 Adriano Martins 还建议的那样,使用 JSON
库比硬编码 JSON
您还应该添加
responce.close()
按照此处的建议http://hc.apache.org/httpcomponents-client-4.4.x/tutorial/html/fundamentals.html#d5e145