배경
REACT의 오픈 소스를 통해 Facebook은 많은 관련 프로젝트를 연속적으로 열었습니다. 이 프로젝트는 수년 동안 그것에 사용되었습니다. 내 관심을 끌었던 것은 이번에는 GraphQL이라는 것입니다. 현재 공식 웹 사이트의 Nodejs 버전 만 있습니다. 많은 회사의 백엔드 기술 스택은 Java이므로 Github에서 찾을 수있는 GraphQL의 Java 버전 구현이 있습니다. 더 이상 고민하지 않고 코드를보십시오. 특정 소개는 공식 웹 사이트 카페를 방문하십시오. 그렇지 않으면 주제가 없습니다.
GraphQlschema
스키마는 데이터베이스와 동일하며 많은 GraphQlfieldDefinitions로 구성되며 필드는 데이터베이스 테이블/보기와 동일하며 각 테이블/보기는 이름, 쿼리 매개 변수, 데이터 구조 및 데이터로 구성됩니다.
1) 먼저 데이터 구조 (GraphQloutPutType) 필드를 정의한 다음 초기화 방법을 정의합니다.
private GraphQloutPutType userType; private void initHutputType () { / *** 멤버 객체 구조* / userType = newObject () .name ( "user") .field (newFieldDefinition (). name ( "id"). type (draphqlint) .build ()). .field (NewFieldDefinition (). 이름 ( "age"). type (GraphQLint) .Build ()) .Field (NewFieldDefinition (). 이름 ( "name"). type (GraphQlString) .Build ())2) 이름, 쿼리 매개 변수, 데이터 구조 및 데이터 검색이 포함 된 두 개의 테이블/보기 정의
/ *** 쿼리 단일 사용자 정보* @return*/ private GraphQLFieldDefinition createUserField () {return GraphQlFieldDefinition.newfieldDefinition () .name ( "user") .Argument (newArgument (). name ( "id"). type (graphQlint) .type (userType). quer ind = Quess user (use). )) .짓다(); } / *** 다중 멤버 정보 쿼리* @return* / private GraphQLFieldDefinition createUsersfield () {return GraphQlFieldDefinition.newfieldDefinition () .name ( "users") .Argument (newArgument (). 이름 ( "page"). .ARGUMENT (newArgument (). 이름 ( "size"). type (GraphQLint) .Build ()) .Argument (newArgument (). name ( "name"). type (graphqlstring) .Build ()) .type (new GraphQllist (userType)) environment.getArgument("page"); int size = environment.getArgument("size"); String name = environment.getArgument("name"); // Execute the query, here you can use some test data to illustrate the problem List<User> list = new ArrayList<>(size); for (int i = 0; i < size; i++) { User user = new User(); user.setId(i); user.setAge(i + 15); }3) 그런 다음 스키마를 정의하고 초기화하고 이름이 포함되어 있으며 하나 이상의 테이블/뷰 (필드)가 포함됩니다.
개인 그래프 QLSCHEMA 스키마; public Graphschema () {initoutputtype (); schema = GraphQlsChema.newschema (). query (newObject () .name ( "GraphQuery") .field (createUsersfield ()) .field (createUserfield ()) .build ()). build (); }4) 위의 단계를 완료 한 후 클래스 이름을 제한하지 않고 모델을 정의해야하지만 구조는 위에 정의 된 데이터 구조를 충족해야하며 공개되어야합니다.
공개 클래스 사용자 {private int id; 사적인 int 연령; 개인 int 섹스; 개인 문자열 이름; 개인 문자열 사진; // getter, setter ...}5) 그런 다음 테스트하는 주요 방법을 작성하십시오
public static void main (String [] args) {GraphQlschema schema = new Graphschema (). getSchema (); String Query1 = "{users (page : 2, size : 5, name :/"john/") {id, sex, name, pic}}"; 문자열 query2 = "{user (id : 6) {id, sex, name, pic}}"; String query3 = "{user (id : 6) {id, sex, name, pic}, user (page : 2, size : 5, name :/"john/") {id, sex, name, pic}}"; map <string, object> result1 = (map <string, object>) new GraphQL (schema) .Execute (query1) .getData (); map <string, object> result2 = (map <string, object>) new GraphQL (schema) .Execute (query2) .getData (); map <string, object> result3 = (map <string, object>) new GraphQL (schema) .Execute (query3) .getData (); // 사용자 목록 System.out.println (result1) 쿼리; // 단일 사용자 system.out.println (result2) 쿼리; // system.out.println (result3);} check check산출:
{users = [{id = 0, sex = 0, name = john_2_0, pic = pic_0.jpg}, {id = 1, sex = 1, name = john_2_1, pic = pic_1.jpg}, {id = 2, sex = 0, name = john_2_2, pic_2.jpg}, {Id = 3, 섹스 = 1, 섹스 = 3 pic = pic_3.jpg}, {id = 4, sex = 0, name = john_2_4, pic = pic = pic_4.jpg}]} {user = {id = 6, sex = 0, name = name_6, pic = pic_6.jpg}} {user = {id = 6, sex = 0, name_6, pic =} sex = 0, name = john_2_0, pic = pic_0.jpg}, {id = 1, sex = 1, name = john_2_1, pic = pic_1.jpg}, {id = 2, sex = 0, name = john_2_2, pic = pic_2.jpg}, {id = 3, sex = 1, john_2_3, pic = __.jpg}, sex = 0, name = john_2_4, pic = pic_4.jpg}}}6) 마지막으로, 코드를 웹 계층의 기본 메소드에 넣고 쿼리 매개 변수 만 정의하면 쿼리 서비스를 쉽게 빌드 할 수 있습니다. 원래 쿼리 인터페이스는 여전히 DataFetcher에서 호출됩니다.
7) Maven 의존성을 소개합니다
<pectionency> <groupId> com.graphql-Java </groupId> <artifactid> GraphQL-Java </artifactid> <버전> 2.0.0 </version> </fectionency>
GraphQL 쿼리의 정의와 관련하여, 이것이 도움이 될 수 있습니다.
JSON
{id = 6, sex = 0, name = "name_6", pic = "pic_6.jpg"}질문
{id, 섹스, 이름, 그림}후자의 부분은 실제로 JSON 문자열입니다. 제거 = 및 값은 여전히 읽을 수 있습니다.
결론
GraphQL은 새로운 사고 방식을 제공하여 웹 API의 개발을 단순화 할 수 있습니다. 클라이언트는 필요한 데이터와 서버가 반환하는 데이터를 지정하고 불필요한 트래픽 전송을 줄이며 모바일 터미널에 친숙하며 다양한 데이터 집계 쿼리를 제공합니다. 다중 쿼리는 API의 최소 세분화를 충족 할뿐만 아니라 프론트 엔드의 요구를 충족시키고 요청을 줄이며 성능을 향상시키는 하나의 요청 만 사용합니다.
나는 일반적인 추세에 의해 주도되는 미래 에이 방향으로 발전 할 것이라고 생각합니다.