as I list, this feature `2th feature` is useful for the user. If we only support the GraphQL in the plugin, there is no way to support this case.
---------------------------2th feature > **2th feature**: For different GraphQL queries, different plugins are allowed to be bound. For example, querying different root fields allows completely different plug-ins to be bound. * query `person`: enable plugin prometheus. * query `bill`: enable plugin limit-count and prometheus. On Fri, Oct 30, 2020 at 4:06 PM wei jin <[email protected]> wrote: > If our purpose is to forward traffic according to QL, perhaps it is more > suitable to use plugin customization. > For example, create a plugin called graphql-dynamic-upstream. > > two reasons about this > > 1. The purpose of graphql is to aggregate back-end data and provide a QL to > return the data format required by the front-end. > I think graphql has weakened APISIX's routing matching capabilities, and he > merged multiple routes into one. > This leads to obvious differences between the behavior of services such as > graphql and ordinary services; the matching rules of route are also not > applicable to each other. > > 2. QL itself belongs to business logic. > > YuanSheng Wang <[email protected]> 于2020年10月30日周五 下午2:32写道: > > > On Thu, Oct 29, 2020 at 5:44 PM Jan Li <[email protected]> wrote: > > > > > I think the support to GraphQL is the direction to go. > > > > > > One suggestion here, I think the support for GraphQL operation is also > > > important. > > > > > > For example, people might limit mutation rate to a lower value than > > query. > > > > > > So apart from ["graphql_field", "==", "person"], we better also > support > > > ["graphql_operation", "==", "query"] > > > > > > > > yes, that is useful. agree > > > > > > > > > On Thu, Oct 29, 2020 at 5:07 PM YuanSheng Wang <[email protected]> > > > wrote: > > > > > > > That is a new feature I want to implement it. > > > > > > > > Let us discuss it first. > > > > > > > > On Thu, Oct 29, 2020 at 5:05 PM YuanSheng Wang <[email protected]> > > > > wrote: > > > > > > > > > *what is GraphQL* > > > > > > > > > > GraphQL is a query language for APIs and a runtime for fulfilling > > those > > > > > queries with your existing data. GraphQL provides a complete and > > > > > understandable description of the data in your API, gives clients > the > > > > power > > > > > to ask for exactly what they need and nothing more, makes it easier > > to > > > > > evolve APIs over time, and enables powerful developer tools. > > > > > > > > > > *How GraphQL works* > > > > > > > > > > `client` -> `APISIX` -> `GraphQL server` . > > > > > > > > > > Proxy the user's GraphQL request and forward it to the GraphQL > server > > > > > according to the user's request information. > > > > > > > > > > When a client resource requests, GraphQL is submitted in the > request > > > > body, > > > > > for example: > > > > > > > > > > ``` > > > > > curl http://***/graphql -X POST -d ' > > > > > query getUser($id: ID) { > > > > > person(id: $id) { > > > > > firstName > > > > > lastName > > > > > } > > > > > } > > > > > ' > > > > > ``` > > > > > > > > > > ## feature > > > > > > > > > > > **1th feature**: Forward to different requests upstream according > > to > > > > > the root field. > > > > > > > > > > ```lua > > > > > local graphql_str = [[ > > > > > query getUser($id: ID) { -- root > > > > > person(id: $id) { -- field 为 `person` > > > > > firstName > > > > > lastName > > > > > } > > > > > }]] > > > > > local ast = parse(graphql_str) > > > > > ... > > > > > ``` > > > > > > > > > > > **2th feature**: For different GraphQL queries, different plugins > > are > > > > > allowed to be bound. > > > > > > > > > > For example, querying different root fields allows completely > > different > > > > > plug-ins to be bound. > > > > > > > > > > * query `person`: enable plugin prometheus. > > > > > * query `bill`: enable plugin limit-count and prometheus. > > > > > > > > > > > **3th feature**: Later support GraphQL's `mutation`: > > > > > https://graphql.org/learn/queries/#mutations > > > > > > > > > > *implement way* > > > > > > > > > > Support adding GraphQL field to route matching conditions. > > > > > > > > > > For example: > > > > > > > > > > ```shell > > > > > curl http://127.0.0.1:9080/apisix/admin/routes/1 -X PUT -i -d ' > > > > > { > > > > > "uri": "/graphql", > > > > > "vars": [ > > > > > ["graphql_field", "==", "person"] > > > > > ], > > > > > "upstream": { > > > > > "type": "roundrobin", > > > > > "nodes": { > > > > > "127.0.0.1:3000": 1 # GrapQL server > > > > > } > > > > > } > > > > > }' > > > > > ``` > > > > > > > > > > -- > > > > > > > > > > *MembPhis* > > > > > My GitHub: https://github.com/membphis > > > > > Apache APISIX: https://github.com/apache/apisix > > > > > > > > > > > > > > > > > -- > > > > > > > > *MembPhis* > > > > My GitHub: https://github.com/membphis > > > > Apache APISIX: https://github.com/apache/apisix > > > > > > > > > > > > > -- > > > > > > > > > > > > Jan Li > > > > > > Senior Software Engineer, Tech > > > > > > > > > > > > Mobile +86 15316315503 > > > > > > Room 1802, 18th Floor, Tower A, China Overseas International Center > > > > > > Lane 838, South Huangpi Road, Huangpu District,Shanghai,China > > > > > > > > > > > > Transforming the way businesses move and manage money globally > > > > > > Amsterdam | Beijing | Bangalore | Hong Kong | Kuala Lumpur | London | > > > Melbourne | San Francisco | Shanghai | Shenzhen | Singapore | Tokyo > > > > > > > > > -- > > > > *MembPhis* > > My GitHub: https://github.com/membphis > > Apache APISIX: https://github.com/apache/apisix > > > -- *MembPhis* My GitHub: https://github.com/membphis Apache APISIX: https://github.com/apache/apisix
