相关文章推荐
曾经爱过的刺猬  ·  cimoc ...·  9 月前    · 

这一篇介绍一下GraphQL实际使用时的语法和一些要素

字段(Fields)

请求对象上的特定字段,返回结果的数据字段
可以是基本类型(String,Int),也可以是自定义对象类型

hero { # 查询可以有备注! friends { "data": { "hero": { "name": "R2-D2", "friends": [ "name": "Luke Skywalker" "name": "Han Solo" "name": "Leia Organa"

可以看到,请求的时候可以对字段进行层级选择,使客户端可以一次性取的级联关系的相关数据。

参数(Arguments)

在字段上还可以增加input参数,比如指定请求ID为1000的某个对象

human(id: "1000") { height "data": { "human": { "name": "Luke Skywalker", "height": 1.72

同时参数可以是不同的类型,例子中的id是String。GraphQL提供了一套默认类型,Int、Enum等等(类比于java的基础类型),也可以自己定制类型(java的class),如果参数类型是定制类型的话,可以配合另一个关键词 Variables ,以Json形式传入。

别名(Aliases)

简单说来就是对字段及返回用任意的名字进行变更

empireHero: hero(episode: EMPIRE) { jediHero: hero(episode: JEDI) { "data": { "empireHero": { "name": "Luke Skywalker" "jediHero": { "name": "R2-D2"

原本请求2个hero字段会有冲突,用别名就解决了这个问题

操作名称(Operation name)

上面的查询使用了简写,其实都省略了 query 关键字及具体的查询名称。推荐在使用中,定义查询名称减少歧义,而且当传递动态参数及变量时,需要在名称后声明

query QueryUsers {
  user {
    userName
    dogs {
      dogName

上例中声明了操作类型为query,并且操作名称是QueryUsers
GraphQL中操作类型有:query(查询)、mutation(增删改)、subscription(订阅)。

变量(Variables)

参数演示了将参数值加在字段上,但很多情况下请求参数都是动态的,如何适配这一场景呢?使用前需要:

  1. 使用$vname 替代查询中的静态值
  2. 在操作名称后声明$vname为查询接受的变量之一
  3. 使用json格式传输变量
query QueryUsers($vname:String = "zzz") {
  user(userName:$vname) {
    userName
    dogs {
      dogName
Variable:
    "vname":"zzz"

这样通过不同的变量就可以进行动态的查询了。注意也可以在操作名称后的变量后定义默认值。如果想传递一个复杂对象,需要知道Schema的定义,并以对应的json形式传入,这边不做赘述。

指令(Directives)

和变量可以动态操作我们的查询一样,指令可以帮助我们动态的改变我们查询的结构。常见于列表视图及详情视图中。

query QueryUsers($vname:String = "zzz",$needShow:Boolean) {
  user(userName:$vname) {
    userName
    dogs @include(if: $needShow){
      dogName
Variable:
    "vname":"zzz"
    "needShow":false

这样整体的返回结果中就不会包含dogs字段,可以使用的指令有:
@include(if: Boolean) 仅在参数为 true 时,包含此字段。
@skip(if: Boolean) 如果参数为 true,跳过此字段。

变更(Mutation)

之前大部分涉及的都是数据查询,GraphQL中约定任何的写入操作通过Mutation来进行操作。和查询一样,如果一个变更操作后需要返回数据,也可以请求字段来作数据返回

mutation CreateUser($vname: String!, $dogs: DogInput!) {
  create(userName: $vname, dogs: $dogs) {
    userName
    dogs{
        dogName
Variable:
    "vname":"testUserName",
    "dogs":[
                    "dogName":12345
                    "dogName":12345

上例中的dog变量并非GraphQL自带类型,它是一个输入对象类型,一种特殊的对象类型,可以当做参数传递,可以在Schema中了解更多自定义类型的信息。
注:一次查询中,可以发起多个Query(并行),也可以发起多个Mutation(串行)

内联片段(Inline Fragments)

参见官网,用的比较少,如果你查询的字段返回的是接口或者联合类型,那么你可能需要使用内联片段来取出下层具体类型的数据

query HeroForEpisode($ep: Episode!) {
  hero(episode: $ep) {
    ... on Droid {
      primaryFunction
    ... on Human {
      height
Variables:
    "ep":"dasdsad"

如果要请求具体类型上的字段,你需要使用一个类型条件内联片段。因为第一个片段标注为 … on Droid,primaryFunction 仅在 hero 返回的 Character 为 Droid 类型时才会执行。同理适用于 Human 类型的 height 字段。

片段(Fragement)

与内连片段类似,通常在查询中如果有大量重复字段的话,会进行使用

leftComparison: hero(episode: EMPIRE) { ...comparisonFields rightComparison: hero(episode: JEDI) { ...comparisonFields fragment comparisonFields on Character { appearsIn friends {

你可以看到上面的查询如何漂亮地重复了字段。片段的概念经常用于将复杂的应用数据需求分割成小块,特别是你要将大量不同片段的 UI 组件组合成一个初始数据获取的时候。

元字段(Meta fields)

顾名思义,有一些内置参数,在我们不知道GraphQL服务会返回的数据结构,数据类型等、

介绍了基本的查询语法及可以使用到的一些常用功能,应该不难理解,而且在数据层面也都和一般的Rest API差不多,学习成本较低。下一次说一下我觉得最为重要的Schema。。

这一篇介绍一下GraphQL实际使用时的语法和一些要素字段(Fields)请求对象上的特定字段,返回结果的数据字段可以是基本类型(String,Int),也可以是自定义对象类型 123456789 { hero { name # 查询可以有备注! friends { name } }...
GraphQL 是由 Facebook 创造的用于描述复杂数据模型的一种查询语言。这里查询语言所指的并不是常规意义上的类似 sql 语句的查询语言,而是一种用于前后端数据查询方式的规范。 官网(中文):https://graphql.cn/ 规范地址:http://spec.graphql.cn/ RESTful是我们已经很熟悉的用于api通信的规范, 对于一次请求,我只需要id和name属性...
GraphQL 是什么? GraphQL 是一个用于 API 的查询语言,是一个使用基于类型系统来执行查询的服务端运行时。 GraphQL 包括两部分:定义的类型和类型上的字段(Schema),每个类型上的每个字段的解析函数(Resolvers) 为什么要用 GraphQL ? 1. GraphQL 是强类型的 Schema 。是每个 GraphQL API 的基础,它清晰的定义了每个 API 支持 GraphQL 的类型系统分为标量类型(Scalar Types,标量类型)和其他高级数据类型。 标量类型即可以表示最细粒度数据结构的数据类型,可以和 JavaScript 的原始类型对应。 1. GraphQL 规范目前规定支持的标量类型有: (1). Int -有符号 32 位整数。 (2). Float-有符号双精度浮点值。 (3). String-U.........
什么是GraphQL GraphQL是Facebook开发的一套查询语言,和Restful查询规范一样,都是一种对前后端数据交互的一种规范,并不是SQL这种的查询语言。 GraphQL和Restful区别 Restful:主流的前后端交互规范,并且开发的过程中,简洁明了,可以很方面的理解接口的含义,不会来额外的开发的复杂度,但是接口的返回的数据是固定的,如果前端只需要部分数据,那么接口返回的还是全部的数据,会来额外的资源浪费 GraphQL:主要是解决了Restful规范中问题,接口返回的数据不可控制
本篇文章可能稍微长了一点,您需要先准备好时间,以免中途要去上厕所什么的,发生中断。 我们一般都是用REST API, 即后端定义好API的数据结构和参数,前端再传参请求获取数据。 比如我们有个获取用户列表的接口:GET /user/list, 返回用户id,用户名,创建时间: "id": 1, "name": "jack", "created_at": "2021-05-10 13:14:15" "id": 2,
本文将从GraphQL是什么,为什么要使用GraphQL,使用GraphQL创建简单例子,以及GraphQL实战,四个方面对GraphQL进行阐述。说得不对的地方,希望大家指出斧正。 github项目地址:https://github.com/Charming2015/graphql-todolist 一、GraphQL是什么? 关于GraphQL是什么,网上一搜一大堆。根据官网的解释就是一...
The Anatomy of a GraphQL Query《GraphQL 名词 101:解析 GraphQL查询语法》【译】 GraphQL 日渐成为数据查询的主流标准之一,整个生态圈也蓬勃发展。本文则由浅入深地详细介绍基础的 GraphQL 格式与关键字,有助于初学者对于 GraphQL 的使用形成体系认知。 GraphQL 日渐成为数据查询的主流标准之一。每天都会产生许多围绕这项技术
回答: 引用 提到了当使用graphql引擎执行时,可能会发生运行时异常的情况。这些异常不是执行期间的graphql错误,而是执行graphql查询时发生的完全不可接受的条件。 这里没有具体提到"graphql-client java"的信息。引用提到当通过graphql.schema.GraphQLSchema.Builder#build()构建模式时,如果模式无效,会抛出异常。而引用提到了在Java中创建与模型相对应的类,并实现GraphQLQueryResolver接口,为hello字段提供解析的方法。但是这些引用没有提供关于"graphql-client java"的具体信息。请提供更多细节以便我为您提供更准确的回答。123 #### 引用[.reference_title] - *1* *2* [graphql-java常见异常汇总](https://blog.csdn.net/heqiushuang110/article/details/126449148)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] - *3* [Graphql-Java实践-1-graphql的理念及quickstart](https://blog.csdn.net/weixin_40292704/article/details/122640307)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] [ .reference_list ]
import org.apache.cxf.message.Message; Message message = PhaseInterceptorChain.getCurrentMessage(); HttpServletRequest request = (HttpServletRequest) message.get(AbstractHTTPDestination.HTTP_REQUEST); request.getHeader("x-forwarded-for") linux 配置全用户的环境变量,profile.d文件夹的作用 小白一个~: 分配权限很关键,不然其他用户无法读取 nacos 部署 Could not retrieve transation read-only status server 雨中奔跑的小孩: 厉害,有效解决 SpringSecurity 用户名和密码的校验过程及自定义密码验证 weixin_43793908: 会经过的,这个是一个过滤器