自https://blog.csdn.net/belalds/article/details/88527769轉載,用於補充記錄及備忘
在一次項目需要接入第三方平台,而引用Graph QL遇到了很多問題,特意進行記錄
目前這個graphql client只支持post的graphql server
使用maven構建依賴關系
<dependency>
<groupId>org.mountcloud</groupId>
<artifactId>graphql-client</artifactId>
<version>1.1</version>
</dependency>
用例
//graphql服務器地址
String serverUrl = "http://localhost:8080/graphql";
//build一個新的graphqlclient
GraphqlClient graphqlClient = GraphqlClient.buildGraphqlClient(serverUrl);
//如果說graphql需要健全信息我們可以用map來進行傳遞
Map<String,String> httpHeaders = new HashMap<>();
httpHeaders.put("content-type", "application/json");
httpHeaders.put("cache-control", "no-cache");
httpHeaders.put("authorization", "Bearer "+accessToken);
//設置http請求的頭
graphqlClient.setHttpHeaders(httpHeaders);
//發起一個簡單的query查詢
//創建一個Query並設置query的名字為findUser,該名字也就是你要訪問的第三方功能
//如果有特殊需要可以自己繼承GraphqlQuery,DefaultGraphqlQuery已經可以滿足所有請求了
GraphqlQuery query = new DefaultGraphqlQuery("findUser");
//我們需要查詢user的名字,性別還有年齡,設置需要查詢的這三個屬性。
query.addResultAttributes("name","sex","age");
try {
//執行query
GraphqlResponse response = graphqlClient.doQuery(query);
//獲取數據,數據為map類型
Map result = response.getData();
} catch (IOException e) {
e.printStackTrace();
}
對應的graphql語句為:
query{
findUser{
name
sex
age
}
}
設置復雜的查詢結果
//創建一個Query並設置query的名字為findUser
//如果有特殊需要可以自己繼承GraphqlQuery,DefaultGraphqlQuery已經可以滿足所有請求了
GraphqlQuery query = new DefaultGraphqlQuery("findUser");
//------------------------------------------------------------------------
//查詢名字為張三,年齡為23歲的人,這里的參數類型一定要與query的參數類型一致
query.addParameter("name","張三").addParameter("age",23);
//------------------------------------------------------------------------
//我們需要查詢user的名字,性別還有年齡,設置需要查詢的這三個屬性。
query.addResultAttributes("name","sex","age");
//------------------------------------------------------------------------
//查詢用戶的部門
ResultAttributtes departmentAttr = new ResultAttributtes("department");
//查詢部門的名字和編號
departmentAttr.addResultAttributes("name","code");
//查詢部門所屬的公司
ResultAttributtes companyAttr = new ResultAttributtes("company");
//查詢部門所屬公司的名字
companyAttr.addResultAttributes("name");
//將部門和公司兩者關聯起來
departmentAttr.addResultAttributes(companyAttr);
//將需要查詢的這個語句放到query里
query.addResultAttributes(departmentAttr);
//------------------------------------------------------------------------
try {
//執行query
GraphqlResponse response = graphqlClient.doQuery(query);
//獲取數據,數據為map類型
Map result = response.getData();
} catch (IOException e) {
e.printStackTrace();
}
對應的graphql語句為:
query{
findUser(name:"張三",age:23){
name
sex
age
department{
name
code
company{
name
}
}
}
}
// 涉及修改的部分暫時未使用,僅記錄
MUTATION
這里只寫一個復雜的mutaion,其實跟query一樣
//創建一個mutation並設置名字為updateUser
GraphqlMutation mutation = new DefaultGraphqlMutation("updateUser");
//設置參數,用戶id為12,名字為張三,年齡為24
mutation.addParameter("id",12).addParameter("name","張三").addParameter("age",24);
//獲取修改的結果
mutation.addResultAttributes("code");
//獲取結果里的數據:data對象昂
ResultAttributtes dataAttr = new ResultAttributtes("data");
//獲取data里的消息、修改執行狀態與時間戳
dataAttr.addResultAttributes("message","state","date");
//將data與mutation關聯起來
mutation.addResultAttributes(dataAttr);
//執行mutation
try {
GraphqlResponse mutationResponse = graphqlClient.doMutation(mutation);
//同樣返回的數據也是map的
Map mutationResult = mutationResponse.getData();
} catch (IOException e) {
e.printStackTrace();
}
遇到的問題
1、由於是對接第三方平台,所以平台給出的范例都是假的,坑死個人
這種的就是identity不存在的
2、由於輸出的數據是map,在獲取到數組時,並不能通過Json 轉實體的方式實現,使用采用了字符串截取的方式進行了構造實體,暫時沒有好的辦法,以后有空記得回來再改了