倿§ãªã°ããŒãã«ãªãŒãã£ãšã³ã¹ã«å¯Ÿå¿ãããå ç¢ã§ä¿å®æ§ã®é«ãAPIãæ§ç¯ããããã®ãã¹ã±ãŒã©ãã«ãªGraphQLã¹ããŒãèšèšãã¿ãŒã³ãåŠã³ãŸããã¹ããŒãã¹ãã£ããã³ã°ããã§ãã¬ãŒã·ã§ã³ãã¢ãžã¥ãŒã«åããã¹ã¿ãŒããŸãããã
GraphQLã¹ããŒãèšèšïŒã°ããŒãã«APIã®ããã®ã¹ã±ãŒã©ãã«ãªãã¿ãŒã³
GraphQLã¯ãã¯ã©ã€ã¢ã³ããå¿ èŠãªããŒã¿ãæ£ç¢ºã«ãªã¯ãšã¹ãã§ããæè»æ§ãæäŸããåŸæ¥ã®REST APIã«ä»£ãã匷åãªéžæè¢ãšããŠç»å ŽããŸãããããããGraphQL APIãè€éåãããã®ç¯å²ãåºããã«ã€ã㊠â ç¹ã«å€æ§ãªããŒã¿èŠä»¶ãæã€ã°ããŒãã«ãªãªãŒãã£ãšã³ã¹ã«ãµãŒãã¹ãæäŸããå Žå â æ éãªã¹ããŒãèšèšãä¿å®æ§ãã¹ã±ãŒã©ããªãã£ãããã©ãŒãã³ã¹ã®ããã«äžå¯æ¬ ã«ãªããŸãããã®èšäºã§ã¯ãã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³ã®èŠæ±ã«å¯Ÿå¿ã§ããå ç¢ãªAPIãæ§ç¯ããã®ã«åœ¹ç«ã€ãããã€ãã®ã¹ã±ãŒã©ãã«ãªGraphQLã¹ããŒãèšèšãã¿ãŒã³ãæ¢ããŸãã
ã¹ã±ãŒã©ãã«ãªã¹ããŒãèšèšã®éèŠæ§
é©åã«èšèšãããGraphQLã¹ããŒãã¯ãæåããAPIã®åºç€ã§ããããã¯ãã¯ã©ã€ã¢ã³ããããªãã®ããŒã¿ããµãŒãã¹ãšã©ã®ããã«å¯Ÿè©±ã§ããããèŠå®ããŸããäžé©åãªã¹ããŒãèšèšã¯ã以äžã®ãããªå€ãã®åé¡ãåŒãèµ·ããå¯èœæ§ããããŸãïŒ
- ããã©ãŒãã³ã¹ã®ããã«ããã¯ïŒéå¹çãªã¯ãšãªãšãªãŸã«ãã¯ãããŒã¿ãœãŒã¹ã«éè² è·ããããå¿çæéãé ãããå¯èœæ§ããããŸãã
- ä¿å®æ§ã®åé¡ïŒã¢ããªã·ãã¯ãªã¹ããŒãã¯ãã¢ããªã±ãŒã·ã§ã³ã®æé·ã«äŒŽããçè§£ã倿Žããã¹ããå°é£ã«ãªããŸãã
- ã»ãã¥ãªãã£ã®è匱æ§ïŒäžé©åã«å®çŸ©ãããã¢ã¯ã»ã¹ã³ã³ãããŒã«ã¯ãæ©å¯ããŒã¿ãäžæ£ãªãŠãŒã¶ãŒã«å ¬éããå¯èœæ§ããããŸãã
- éå®çãªã¹ã±ãŒã©ããªãã£ïŒå¯çµåãªã¹ããŒãã¯ãAPIãè€æ°ã®ãµãŒããŒãããŒã ã«åæ£ãããããšãå°é£ã«ããŸãã
ã°ããŒãã«ãªã¢ããªã±ãŒã·ã§ã³ã§ã¯ããããã®åé¡ã¯ããã«å¢å¹ ãããŸããå°åã«ãã£ãŠããŒã¿èŠä»¶ãèŠå¶äžã®å¶çŽãããã©ãŒãã³ã¹ãžã®æåŸ ãç°ãªãå ŽåããããŸããã¹ã±ãŒã©ãã«ãªã¹ããŒãèšèšã«ããããããã®èª²é¡ã«å¹æçã«å¯ŸåŠããããšãã§ããŸãã
ã¹ã±ãŒã©ãã«ãªã¹ããŒãèšèšã®äž»èŠåå
ç¹å®ã®ãã¿ãŒã³ã«é£ã³èŸŒãåã«ãã¹ããŒãèšèšãå°ãã¹ãããã€ãã®äž»èŠãªååãæŠèª¬ããŸãããïŒ
- ã¢ãžã¥ãŒã«æ§ïŒã¹ããŒããããå°ãããç¬ç«ããã¢ãžã¥ãŒã«ã«åå²ããŸããããã«ãããAPIã®åã ã®éšåãçè§£ã倿Žãåå©çšãããããªããŸãã
- æ§æå¯èœæ§ïŒç°ãªãã¢ãžã¥ãŒã«ã容æã«çµã¿åããããæ¡åŒµãããã§ããããã«ã¹ããŒããèšèšããŸããããã«ãããæ¢åã®ã¯ã©ã€ã¢ã³ãã劚ããããšãªãæ°æ©èœã远å ã§ããŸãã
- æœè±¡åïŒåºç€ãšãªãããŒã¿ãœãŒã¹ããµãŒãã¹ã®è€éãããæç¢ºã«å®çŸ©ãããGraphQLã€ã³ã¿ãŒãã§ãŒã¹ã®èåŸã«é ããŸããããã«ãããã¯ã©ã€ã¢ã³ãã«åœ±é¿ãäžããããšãªãå®è£ ã倿Žã§ããŸãã
- äžè²«æ§ïŒã¹ããŒãå šäœã§äžè²«ããåœåèŠåãããŒã¿æ§é ããšã©ãŒåŠçæŠç¥ãç¶æããŸããããã«ãããã¯ã©ã€ã¢ã³ããAPIãåŠç¿ãã䜿çšãããããªããŸãã
- ããã©ãŒãã³ã¹ã®æé©åïŒã¹ããŒãèšèšã®ãã¹ãŠã®æ®µéã§ããã©ãŒãã³ã¹ãžã®åœ±é¿ãèæ ®ããŸããããŒã¿ããŒããŒããã£ãŒã«ããšã€ãªã¢ã·ã³ã°ãªã©ã®ãã¯ããã¯ã䜿çšããŠãããŒã¿ããŒã¹ã¯ãšãªããããã¯ãŒã¯ãªã¯ãšã¹ãã®æ°ãæå°éã«æããŸãã
ã¹ã±ãŒã©ãã«ãªã¹ããŒãèšèšãã¿ãŒã³
以äžã«ãå ç¢ãªGraphQL APIãæ§ç¯ããããã«äœ¿çšã§ãããããã€ãã®ã¹ã±ãŒã©ãã«ãªã¹ããŒãèšèšãã¿ãŒã³ã玹ä»ããŸãïŒ
1. ã¹ããŒãã¹ãã£ããã³ã°
ã¹ããŒãã¹ãã£ããã³ã°ã䜿çšãããšãè€æ°ã®GraphQL APIãåäžã®çµ±äžãããã¹ããŒãã«çµåã§ããŸããããã¯ãããŒã¿ã®ç°ãªãéšåãæ åœããç°ãªãããŒã ããµãŒãã¹ãããå Žåã«ç¹ã«äŸ¿å©ã§ããããã¯ãããã€ãã®ããAPIãæã¡ããããããã²ãŒããŠã§ã€ãAPIãä»ããŠçµåãããããªãã®ã§ãã
ä»çµã¿ïŒ
- åããŒã ãŸãã¯ãµãŒãã¹ã¯ãç¬èªã®ã¹ããŒããæã€ç¬èªã®GraphQL APIãå ¬éããŸãã
- äžå€®ã®ã²ãŒããŠã§ã€ãµãŒãã¹ã¯ãã¹ããŒãã¹ãã£ããã³ã°ããŒã«ïŒApollo FederationãGraphQL Meshãªã©ïŒã䜿çšããŠããããã®ã¹ããŒããåäžã®çµ±äžãããã¹ããŒãã«ããŒãžããŸãã
- ã¯ã©ã€ã¢ã³ãã¯ã²ãŒããŠã§ã€ãµãŒãã¹ãšå¯Ÿè©±ããã²ãŒããŠã§ã€ãµãŒãã¹ã¯ãªã¯ãšã¹ããé©åãªåºç€ãšãªãAPIã«ã«ãŒãã£ã³ã°ããŸãã
äŸïŒ
ååããŠãŒã¶ãŒã泚æçšã«å¥ã ã®APIãæã€eã³ããŒã¹ãã©ãããã©ãŒã ãæ³åããŠã¿ãŠãã ãããåAPIã«ã¯ç¬èªã®ã¹ããŒãããããŸãïŒ
# ååAPI
type Product {
id: ID!
name: String!
price: Float!
}
type Query {
product(id: ID!): Product
}
# ãŠãŒã¶ãŒAPI
type User {
id: ID!
name: String!
email: String!
}
type Query {
user(id: ID!): User
}
# 泚æAPI
type Order {
id: ID!
userId: ID!
productId: ID!
quantity: Int!
}
type Query {
order(id: ID!): Order
}
ã²ãŒããŠã§ã€ãµãŒãã¹ã¯ããããã®ã¹ããŒããã¹ãã£ããã³ã°ããŠãçµ±äžãããã¹ããŒããäœæã§ããŸãïŒ
type Product {
id: ID!
name: String!
price: Float!
}
type User {
id: ID!
name: String!
email: String!
}
type Order {
id: ID!
user: User! @relation(field: "userId")
product: Product! @relation(field: "productId")
quantity: Int!
}
type Query {
product(id: ID!): Product
user(id: ID!): User
order(id: ID!): Order
}
OrderåããUserãšProductãå¥ã®APIã§å®çŸ©ãããŠããã«ãããããããããããžã®åç
§ãå«ãã§ããããšã«æ³šç®ããŠãã ãããããã¯ãã¹ããŒãã¹ãã£ããã³ã°ã®ãã£ã¬ã¯ãã£ãïŒãã®äŸã§ã¯@relationãªã©ïŒãéããŠå®çŸãããŸãã
å©ç¹ïŒ
- 忣ãããæææš©ïŒåããŒã ã¯ç¬èªã®ããŒã¿ãšAPIãç¬ç«ããŠç®¡çã§ããŸãã
- ã¹ã±ãŒã©ããªãã£ã®åäžïŒåAPIãç¹å®ã®ããŒãºã«åºã¥ããŠç¬ç«ããŠã¹ã±ãŒãªã³ã°ã§ããŸãã
- è€éãã®è»œæžïŒã¯ã©ã€ã¢ã³ãã¯åäžã®APIãšã³ããã€ã³ããšã®ã¿å¯Ÿè©±ããã°ãããªããŸãã
èæ ®äºé ïŒ
- è€éãïŒã¹ããŒãã¹ãã£ããã³ã°ã¯ã¢ãŒããã¯ãã£ã«è€éããå ããå¯èœæ§ããããŸãã
- ã¬ã€ãã³ã·ãŒïŒã²ãŒããŠã§ã€ãµãŒãã¹ãä»ããŠãªã¯ãšã¹ããã«ãŒãã£ã³ã°ãããšãã¬ã€ãã³ã·ãŒãçºçããå¯èœæ§ããããŸãã
- ãšã©ãŒåŠçïŒåºç€ãšãªãAPIã®é害ã«å¯ŸåŠããããã«ãå ç¢ãªãšã©ãŒåŠçãå®è£ ããå¿ èŠããããŸãã
2. ã¹ããŒããã§ãã¬ãŒã·ã§ã³
ã¹ããŒããã§ãã¬ãŒã·ã§ã³ã¯ãã¹ããŒãã¹ãã£ããã³ã°ã®ããã€ãã®å¶éã«å¯ŸåŠããããã«èšèšãããããã®é²å圢ã§ããGraphQLã¹ããŒããæ§æããããã®ããã宣èšçã§æšæºåãããã¢ãããŒããæäŸããŸãã
ä»çµã¿ïŒ
- åãµãŒãã¹ã¯GraphQL APIãå
¬éãããã®ã¹ããŒãã«ãã§ãã¬ãŒã·ã§ã³ãã£ã¬ã¯ãã£ãïŒäŸïŒ
@keyã@extendsã@externalïŒã§æ³šéãä»ããŸãã - äžå€®ã®ã²ãŒããŠã§ã€ãµãŒãã¹ïŒApollo Federationã䜿çšïŒã¯ããããã®ãã£ã¬ã¯ãã£ãã䜿çšããŠããã§ãã¬ãŒã·ã§ã³ãããã¹ããŒãå šäœã衚ãã¹ãŒããŒã°ã©ããæ§ç¯ããŸãã
- ã²ãŒããŠã§ã€ãµãŒãã¹ã¯ãã¹ãŒããŒã°ã©ãã䜿çšããŠãªã¯ãšã¹ããé©åãªåºç€ãšãªããµãŒãã¹ã«ã«ãŒãã£ã³ã°ããäŸåé¢ä¿ã解決ããŸãã
äŸïŒ
åãeã³ããŒã¹ã®äŸã䜿çšãããšããã§ãã¬ãŒã·ã§ã³ãããã¹ããŒãã¯æ¬¡ã®ããã«ãªããŸãïŒ
# ååAPI
type Product @key(fields: "id") {
id: ID!
name: String!
price: Float!
}
type Query {
product(id: ID!): Product
}
# ãŠãŒã¶ãŒAPI
type User @key(fields: "id") {
id: ID!
name: String!
email: String!
}
type Query {
user(id: ID!): User
}
# 泚æAPI
type Order {
id: ID!
userId: ID!
productId: ID!
quantity: Int!
user: User! @requires(fields: "userId")
product: Product! @requires(fields: "productId")
}
extend type Query {
order(id: ID!): Order
}
ãã§ãã¬ãŒã·ã§ã³ãã£ã¬ã¯ãã£ãã®äœ¿çšã«æ³šç®ããŠãã ããïŒ
@keyïŒåã®äž»ããŒãæå®ããŸãã@requiresïŒãã£ãŒã«ããå¥ã®ãµãŒãã¹ã®ããŒã¿ãå¿ èŠãšããããšã瀺ããŸãã@extendsïŒãµãŒãã¹ãå¥ã®ãµãŒãã¹ã§å®çŸ©ãããåãæ¡åŒµã§ããããã«ããŸãã
å©ç¹ïŒ
- 宣èšçãªæ§æïŒãã§ãã¬ãŒã·ã§ã³ãã£ã¬ã¯ãã£ãã«ãããã¹ããŒãã®äŸåé¢ä¿ãçè§£ãã管çãããããªããŸãã
- ããã©ãŒãã³ã¹ã®åäžïŒApollo Federationã¯ãã¯ãšãªã®èšç»ãšå®è¡ãæé©åããŠã¬ã€ãã³ã·ãŒãæå°éã«æããŸãã
- åå®å šæ§ã®åŒ·åïŒã¹ãŒããŒã°ã©ãã«ããããã¹ãŠã®åããµãŒãã¹éã§äžè²«ããŠããããšãä¿èšŒãããŸãã
èæ ®äºé ïŒ
- ããŒã«ïŒApollo FederationãŸãã¯äºææ§ã®ãããã§ãã¬ãŒã·ã§ã³å®è£ ã䜿çšããå¿ èŠããããŸãã
- è€éãïŒã¹ããŒãã¹ãã£ããã³ã°ãããèšå®ãè€éã«ãªãå¯èœæ§ããããŸãã
- åŠç¿æ²ç·ïŒéçºè ã¯ãã§ãã¬ãŒã·ã§ã³ãã£ã¬ã¯ãã£ããšæŠå¿µãåŠã¶å¿ èŠããããŸãã
3. ã¢ãžã¥ã©ãŒã¹ããŒãèšèš
ã¢ãžã¥ã©ãŒã¹ããŒãèšèšã¯ã倧ããªã¢ããªã·ãã¯ãªã¹ããŒãããããå°ãã管çããããã¢ãžã¥ãŒã«ã«åå²ããããšãå«ã¿ãŸããããã«ããããã§ãã¬ãŒã·ã§ã³ã¹ããŒãã«é ŒãããšãªããAPIã®åã ã®éšåãçè§£ã倿Žãåå©çšãããããªããŸãã
ä»çµã¿ïŒ
- ã¹ããŒãå ã®è«ççãªå¢çïŒäŸïŒãŠãŒã¶ãŒãååãæ³šæïŒãç¹å®ããŸãã
- åå¢çã«å¯ŸããŠå¥ã ã®ã¢ãžã¥ãŒã«ãäœæãããã®å¢çã«é¢é£ããåãã¯ãšãªããã¥ãŒããŒã·ã§ã³ãå®çŸ©ããŸãã
- ïŒGraphQLãµãŒããŒã®å®è£ ã«å¿ããŠïŒã€ã³ããŒã/ãšã¯ã¹ããŒãã¡ã«ããºã ã䜿çšããŠãã¢ãžã¥ãŒã«ãåäžã®çµ±äžãããã¹ããŒãã«çµåããŸãã
äŸïŒJavaScript/Node.jsã䜿çšïŒïŒ
åã¢ãžã¥ãŒã«çšã«å¥ã ã®ãã¡ã€ã«ãäœæããŸãïŒ
// users.graphql
type User {
id: ID!
name: String!
email: String!
}
type Query {
user(id: ID!): User
}
// products.graphql
type Product {
id: ID!
name: String!
price: Float!
}
type Query {
product(id: ID!): Product
}
次ã«ãã¡ã€ã³ã®ã¹ããŒããã¡ã€ã«ã§ããããçµåããŸãïŒ
// schema.js
const { makeExecutableSchema } = require('graphql-tools');
const { typeDefs: userTypeDefs, resolvers: userResolvers } = require('./users');
const { typeDefs: productTypeDefs, resolvers: productResolvers } = require('./products');
const typeDefs = [
userTypeDefs,
productTypeDefs,
""
];
const resolvers = {
Query: {
...userResolvers.Query,
...productResolvers.Query,
}
};
const schema = makeExecutableSchema({
typeDefs,
resolvers,
});
module.exports = schema;
å©ç¹ïŒ
- ä¿å®æ§ã®åäžïŒå°ããªã¢ãžã¥ãŒã«ã®æ¹ãçè§£ããããã倿Žããããã§ãã
- åå©çšæ§ã®åäžïŒã¢ãžã¥ãŒã«ã¯ã¢ããªã±ãŒã·ã§ã³ã®ä»ã®éšåã§åå©çšã§ããŸãã
- ããè¯ãã³ã©ãã¬ãŒã·ã§ã³ïŒç°ãªãããŒã ãç°ãªãã¢ãžã¥ãŒã«ã§ç¬ç«ããŠäœæ¥ã§ããŸãã
èæ ®äºé ïŒ
- ãªãŒããŒãããïŒã¢ãžã¥ãŒã«åã¯éçºããã»ã¹ã«å€å°ã®ãªãŒããŒãããã远å ããå¯èœæ§ããããŸãã
- è€éãïŒåŸªç°äŸåãé¿ããããã«ãã¢ãžã¥ãŒã«éã®å¢çãæ éã«å®çŸ©ããå¿ èŠããããŸãã
- ããŒã«ïŒã¢ãžã¥ã©ãŒã¹ããŒãå®çŸ©ããµããŒãããGraphQLãµãŒããŒå®è£ ã䜿çšããå¿ èŠããããŸãã
4. ã€ã³ã¿ãŒãã§ãŒã¹åãšãŠããªã³å
ã€ã³ã¿ãŒãã§ãŒã¹åãšãŠããªã³åã䜿çšãããšãè€æ°ã®å ·è±¡åã«ãã£ãŠå®è£ ã§ããæœè±¡åãå®çŸ©ã§ããŸããããã¯ãæèã«å¿ããŠç°ãªã圢ããšãããšãã§ãã倿 çãªããŒã¿ã衚çŸããã®ã«äŸ¿å©ã§ãã
ä»çµã¿ïŒ
- äžé£ã®å ±éãã£ãŒã«ããæã€ã€ã³ã¿ãŒãã§ãŒã¹ãŸãã¯ãŠããªã³åãå®çŸ©ããŸãã
- ã€ã³ã¿ãŒãã§ãŒã¹ãå®è£ ãããããŠããªã³ã®ã¡ã³ããŒã§ããå ·è±¡åãå®çŸ©ããŸãã
- å®è¡æã«å
·è±¡åãèå¥ããããã«
__typenameãã£ãŒã«ãã䜿çšããŸãã
äŸïŒ
interface Node {
id: ID!
}
type User implements Node {
id: ID!
name: String!
email: String!
}
type Product implements Node {
id: ID!
name: String!
price: Float!
}
union SearchResult = User | Product
type Query {
node(id: ID!): Node
search(query: String!): [SearchResult!]!
}
ãã®äŸã§ã¯ãUserãšProductã®äž¡æ¹ããå
±éã®idãã£ãŒã«ããå®çŸ©ããNodeã€ã³ã¿ãŒãã§ãŒã¹ãå®è£
ããŠããŸããSearchResultãŠããªã³åã¯ãUserãŸãã¯Productã®ããããã§ããåŸãæ€çŽ¢çµæã衚ããŸããã¯ã©ã€ã¢ã³ãã¯searchãã£ãŒã«ããã¯ãšãªãããã®åŸ__typenameãã£ãŒã«ãã䜿çšããŠãåãåã£ãçµæã®ã¿ã€ãã倿ã§ããŸãã
å©ç¹ïŒ
- æè»æ§ïŒå€æ çãªããŒã¿ãåå®å šãªæ¹æ³ã§è¡šçŸã§ããŸãã
- ã³ãŒãã®åå©çšïŒã€ã³ã¿ãŒãã§ãŒã¹ãšãŠããªã³ã§å ±éãã£ãŒã«ããå®çŸ©ããããšã«ãããã³ãŒãã®éè€ãæžãããŸãã
- ã¯ãšãªå¯èœæ§ã®åäžïŒã¯ã©ã€ã¢ã³ããåäžã®ã¯ãšãªã䜿çšããŠç°ãªãçš®é¡ã®ããŒã¿ãã¯ãšãªãããããªããŸãã
èæ ®äºé ïŒ
- è€éãïŒã¹ããŒãã«è€éããå ããå¯èœæ§ããããŸãã
- ããã©ãŒãã³ã¹ïŒã€ã³ã¿ãŒãã§ãŒã¹åãšãŠããªã³åã解決ããããšã¯ãå ·è±¡åã解決ãããããã³ã¹ãããããå ŽåããããŸãã
- ã€ã³ããã¹ãã¯ã·ã§ã³ïŒã¯ã©ã€ã¢ã³ãã¯ãå®è¡æã«å ·è±¡åãæ±ºå®ããããã«ã€ã³ããã¹ãã¯ã·ã§ã³ã䜿çšããå¿ èŠããããŸãã
5. ã³ãã¯ã·ã§ã³ãã¿ãŒã³
ã³ãã¯ã·ã§ã³ãã¿ãŒã³ã¯ãGraphQL APIã§ããŒãžããŒã·ã§ã³ãå®è£ ããããã®æšæºçãªæ¹æ³ã§ãã倧éã®ããŒã¿ãªã¹ãããã£ã³ã¯ã§ååŸããããã®äžè²«æ§ã®ããå¹ççãªæ¹æ³ãæäŸããŸãã
ä»çµã¿ïŒ
edgesãšpageInfoãã£ãŒã«ããæã€ã³ãã¯ã·ã§ã³åãå®çŸ©ããŸããedgesãã£ãŒã«ãã«ã¯ãšããžã®ãªã¹ããå«ãŸããåãšããžã«ã¯nodeãã£ãŒã«ãïŒå®éã®ããŒã¿ïŒãšcursorãã£ãŒã«ãïŒããŒãã®äžæã®èå¥åïŒãå«ãŸããŸããpageInfoãã£ãŒã«ãã«ã¯ã次ã®ããŒãžããããã©ãããæåãšæåŸã®ããŒãã®ã«ãŒãœã«ãªã©ãçŸåšã®ããŒãžã«é¢ããæ å ±ãå«ãŸããŸãã- ããŒãžããŒã·ã§ã³ãå¶åŸ¡ããããã«ã
firstãafterãlastãbeforeåŒæ°ã䜿çšããŸãã
äŸïŒ
type User {
id: ID!
name: String!
email: String!
}
type UserEdge {
node: User!
cursor: String!
}
type UserConnection {
edges: [UserEdge!]!
pageInfo: PageInfo!
}
type PageInfo {
hasNextPage: Boolean!
hasPreviousPage: Boolean!
startCursor: String
endCursor: String
}
type Query {
users(first: Int, after: String, last: Int, before: String): UserConnection!
}
å©ç¹ïŒ
- æšæºåãããããŒãžããŒã·ã§ã³ïŒAPIå šäœã§ããŒãžããŒã·ã§ã³ãå®è£ ããããã®äžè²«ããæ¹æ³ãæäŸããŸãã
- å¹ççãªããŒã¿ååŸïŒå€§éã®ããŒã¿ãªã¹ãããã£ã³ã¯ã§ååŸã§ããããããµãŒããŒã®è² è·ã軜æžããããã©ãŒãã³ã¹ãåäžãããŸãã
- ã«ãŒãœã«ããŒã¹ã®ããŒãžããŒã·ã§ã³ïŒã«ãŒãœã«ã䜿çšããŠåããŒãã®äœçœ®ã远跡ããŸããããã¯ãªãã»ããããŒã¹ã®ããŒãžããŒã·ã§ã³ãããå¹ççã§ãã
èæ ®äºé ïŒ
- è€éãïŒã¹ããŒãã«è€éããå ããå¯èœæ§ããããŸãã
- ãªãŒããŒãããïŒã³ãã¯ã·ã§ã³ãã¿ãŒã³ãå®è£ ããããã«è¿œå ã®ãã£ãŒã«ããšåãå¿ èŠã§ãã
- å®è£ ïŒã«ãŒãœã«ãäžæã§äžè²«ããŠããããšãä¿èšŒããããã«ãæ éãªå®è£ ãå¿ èŠã§ãã
ã°ããŒãã«ãªèæ ®äºé
ã°ããŒãã«ãªãªãŒãã£ãšã³ã¹åãã®GraphQLã¹ããŒããèšèšããéã«ã¯ã以äžã®è¿œå èŠçŽ ãèæ ®ããŠãã ããïŒ
- ããŒã«ãªãŒãŒã·ã§ã³ïŒãã£ã¬ã¯ãã£ããŸãã¯ã«ã¹ã¿ã ã¹ã«ã©åã䜿çšããŠãããŸããŸãªèšèªãå°åããµããŒãããŸããããšãã°ãç°ãªãèšèªã®ç¿»èš³ãæ ŒçŽããã«ã¹ã¿ã ã®`LocalizedText`ã¹ã«ã©ãæã€ããšãã§ããŸãã
- ã¿ã€ã ãŸãŒã³ïŒã¿ã€ã ã¹ã¿ã³ããUTCã§ä¿åããã¯ã©ã€ã¢ã³ãã衚瀺ç®çã§èªåã®ã¿ã€ã ãŸãŒã³ãæå®ã§ããããã«ããŸãã
- é貚ïŒäžè²«ããé貚圢åŒã䜿çšããã¯ã©ã€ã¢ã³ãã衚瀺ç®çã§å¥œã¿ã®é貚ãæå®ã§ããããã«ããŸããããã衚çŸããããã«ã«ã¹ã¿ã ã®`Currency`ã¹ã«ã©ãæ€èšããŠãã ããã
- ããŒã¿ã¬ãžãã³ã·ãŒïŒããŒã¿ãçŸå°ã®èŠå¶ã«æºæ ããŠä¿åãããŠããããšã確èªããŸããããã«ã¯ãAPIãè€æ°ã®ãªãŒãžã§ã³ã«ãããã€ããããããŒã¿ãã¹ãã³ã°æè¡ã䜿çšããå¿ èŠãããå ŽåããããŸãã
- ã¢ã¯ã»ã·ããªãã£ïŒé害ã®ãããŠãŒã¶ãŒãã¢ã¯ã»ã¹ããããããã«ã¹ããŒããèšèšããŸããæç¢ºã§èª¬æçãªãã£ãŒã«ãåã䜿çšããããŒã¿ã«ã¢ã¯ã»ã¹ããããã®ä»£æ¿æ¹æ³ãæäŸããŸãã
ããšãã°ãåå説æãã£ãŒã«ããèããŠã¿ãŸãããïŒ
type Product {
id: ID!
name: String!
description(language: String = "en"): String!
}
ããã«ãããã¯ã©ã€ã¢ã³ãã¯ç¹å®ã®èšèªã§åå説æããªã¯ãšã¹ãã§ããŸããèšèªãæå®ãããŠããªãå Žåãããã©ã«ãã§è±èªïŒ`en`ïŒã«ãªããŸãã
çµè«
ã¹ã±ãŒã©ãã«ãªã¹ããŒãèšèšã¯ãã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³ã®èŠæ±ã«å¯Ÿå¿ã§ãããå ç¢ã§ä¿å®æ§ã®é«ãGraphQL APIãæ§ç¯ããããã«äžå¯æ¬ ã§ãããã®èšäºã§æŠèª¬ããååã«åŸããé©åãªèšèšãã¿ãŒã³ã䜿çšããããšã§ãçè§£ããããã倿Žã»æ¡åŒµã容æã§ãåªããããã©ãŒãã³ã¹ãšã¹ã±ãŒã©ããªãã£ãæäŸããAPIãäœæã§ããŸããã¹ããŒããã¢ãžã¥ãŒã«åããæ§æããæœè±¡åããã°ããŒãã«ãªãªãŒãã£ãšã³ã¹ã®ç¹å®ã®ããŒãºãèæ ®ããããšãå¿ããªãã§ãã ããã
ãããã®ãã¿ãŒã³ãåãå ¥ããããšã§ãGraphQLã®æœåšèœåãæå€§éã«åŒãåºããä»åŸäœå¹Žã«ãããã£ãŠã¢ããªã±ãŒã·ã§ã³ãæ¯ããããšãã§ããAPIãæ§ç¯ã§ããŸãã