游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

Go使用GraphQL基础教程

  欢迎golang同胞!在本教程中,我们将研究如何在基于Go的程序中与GraphQL服务器进行交互。在本教程结束时,我们应该知道如何执行以下操作:GraphQL的基础知识在Go中构建一个简单的GraphQL服务器针对GraphQL执行基本查询
  在本教程中,我们将专注于学习GraphQL的数据检索方面,并且我们将使用内存中的数据源来支持它。这应该为我们在后续教程的基础上建立一个良好的基础。GraphQL基础知识
  好的,所以在我们深入研究之前,我们应该真正了解GraphQL的基础知识。作为开发人员,使用它对我们有什么好处?
  好吧,考虑使用每天处理数十万甚至数百万请求的系统。传统上,我们会使用位于数据库前面的系统API,它会返回大量JSON响应,其中包含许多我们可能不一定需要的冗余信息。
  如果我们正在处理大规模的应用程序,发送冗余数据的成本可能会很高,并且由于有效负载大小会阻塞我们的网络带宽。
  GraphQL基本上可以让我们以减少噪音和描述数据,我们希望让我们的检索,从我们的API中检索只有我们需要为我们当前的任务视图不管。
  这只是该技术为我们提供的众多好处的一个例子。希望在接下来的教程系列中,我们会提前看到更多这些好处。我们的API的查询语言,而不是我们的数据库
  需要注意的重要一点是,GraphQL不像我们传统的SQL那样是一种查询语言。它是位于我们API前面的抽象,不依赖于任何特定的数据库或存储引擎。
  这真的很酷。我们可以建立一个与现有服务商交互的GraphQL服务器,然后围绕着这个新的GraphQL服务器构建,而不必担心修改现有的RESTAPI。比较REST和GraphQL
  让我们看看RESTful方法与GraphQL方法有何不同。现在,假设我们正在构建一个返回该站点上所有教程的服务,如果我们想要特定教程的信息,我们通常会创建一个API端点,允许我们根据ID检索特定教程:AdummyendpointthattakesinanIDpathparameterhttp:api。tutorialedge。nettutorial:id
  如果给定一个validID,这将返回一个响应,看起来像这样:{title:GoGraphQLTutorial,Author:ElliotForbes,slug:golanggographqlbeginnerstutorial,views:1,key:value}
  现在,假设我们想创建一个小部件,列出该作者撰写的书籍5个帖子。我们可以点击author:id端点以检索该作者撰写的所有帖子,然后进行后续调用以检索前5个帖子中的每一个。或者,我们可以制作一个全新的端点来为我们返回这些数据。
  这两种解决方案听起来都不是特别吸引人,因为它们会创建不需要的请求量或返回过多的数据,这突出了RESTful方法开始出现一些裂缝的地方。
  这就是GraphQL发挥作用的地方。使用GraphQL,我们可以定义我们希望在查询中返回的数据的确切结构。所以如果我们想要上面的信息,我们可以创建一个看起来像这样的查询:{tutorial(id:1){idtitleauthor{nametutorials}comments{body}}}
  这将随后返回我们的教程、该教程的作者和一组表示该作者编写的教程的教程ID,而无需发送额外的x多个REST请求来获取信息!那有多好?基本设置
  好的,现在我们对GraphQL以及对它的用途有了更多的了解,让我们在实践中看看它。
  我们将使用graphqlgographql实现在Go中创建一个简单的GraphQL服务器。设置简单服务器
  让我们首先使用gomodinit以下方法初始化我们的项目:gomodinitgithub。comelliotforbesgographqltutorial
  接下来,让我们创建一个名为main。go。我们将从简单开始创建一个非常简单的GraphQL服务器,它具有一个非常简单的解析器:creditgographqlhelloworldexamplepackagemainimport(encodingjsonfmtloggithub。comgraphqlgographql)funcmain(){Schemafields:graphql。Fields{hello:graphql。Field{Type:graphql。String,Resolve:func(pgraphql。ResolveParams)(interface{},error){returnworld,nil},},}rootQuery:graphql。ObjectConfig{Name:RootQuery,Fields:fields}schemaConfig:graphql。SchemaConfig{Query:graphql。NewObject(rootQuery)}schema,err:graphql。NewSchema(schemaConfig)iferr!nil{log。Fatalf(failedtocreatenewschema,error:v,err)}Queryquery:{hello}params:graphql。Params{Schema:schema,RequestString:query}r:graphql。Do(params)iflen(r。Errors)0{log。Fatalf(failedtoexecutegraphqloperation,errors:v,r。Errors)}rJSON,:json。Marshal(r)fmt。Printf(s,rJSON){data:{hello:world}}}
  现在,如果我们尝试运行它,让我们看看会发生什么:gorun。。。。{data:{hello:world}}
  所以,如果一切正常,那么我们就可以设置一个非常简单的GraphQL服务器并对这个服务器进行非常简单的查询。GraphQL架构
  让我们分解上面代码中发生的事情,以便我们可以进一步扩展它。在lines1421我们定义我们的Schema。当我们对我们的GraphQLAPI进行查询时,我们基本上定义了我们想要返回给我们的对象上的哪些字段,因此我们必须在我们的Schema重新定义这些字段。
  在上line17,我们定义了一个解析器函数,每当field请求此特定内容时就会触发该解析器函数。现在,我们只是返回字符串world,但我们将实现从这里查询数据库的能力。查询
  让我们看一下main。go文件的第二部分。在line30我们开始定义query请求领域hello。
  然后我们创建一个params结构,其中包含对我们定义的Schema以及我们的RequestString请求的引用。
  最后,在line36我们执行请求并将请求的结果填充到r。然后我们进行一些错误处理,然后将响应编组为JSON并将其打印到我们的控制台上。一个更复杂的例子
  现在我们已经启动并运行了一个非常简单的GraphQL服务器,并且我们能够对其进行查询,让我们更进一步,构建一个更复杂的示例。
  我们将创建一个GraphQL服务器,它返回一系列内存中的教程及其作者,以及对这些特定教程的任何评论。
  让我们定义一些struct代表aTutorial、anAuthor和a的sComment:typeTutorialstruct{TitlestringAuthorAuthorComments〔〕Comment}typeAuthorstruct{NamestringTutorials〔〕int}typeCommentstruct{Bodystring}
  然后我们可以创建一个非常简单的populate()函数,它将返回一个类型数组Tutorial:funcpopulate()〔〕Tutorial{author:Author{Name:ElliotForbes,Tutorials:〔〕int{1}}tutorial:Tutorial{ID:1,Title:GoGraphQLTutorial,Author:author,Comments:〔〕Comment{Comment{Body:FirstComment},},}vartutorials〔〕Tutorialtutorialsappend(tutorials,tutorial)returntutorials}
  这将为我们提供一个简单的教程列表,然后我们可以稍后解决。创建新的对象类型
  我们将从使用GraphQL创建一个新对象开始graphql。NewObject()。我们将使用GraphQL的严格类型定义3种不同的类型,它们将与structs我们已经定义的3种相匹配。
  我们的Commentstruct可以说是最简单的,它只包含一个stringBody,所以我们可以commentType很容易地将其表示为:varcommentTypegraphql。NewObject(graphql。ObjectConfig{Name:Comment,wedefinethenameandthefieldsofourobject。Inthiscase,wehaveonesolitaryfieldthatisoftypestringFields:graphql。Fields{body:graphql。Field{Type:graphql。String,},},},)
  接下来,我们将处理该Author结构并将其定义为一个新的graphql。NewObject()。这会稍微复杂一些,因为它既有一个String字段,也有一个Int值列表,这些值代表他们编写的教程的ID。varauthorTypegraphql。NewObject(graphql。ObjectConfig{Name:Author,Fields:graphql。Fields{Name:graphql。Field{Type:graphql。String,},Tutorials:graphql。Field{welluseNewListtodealwithanarrayofintvaluesType:graphql。NewList(graphql。Int),},},},)
  最后,让我们定义我们的tutorialTypewhich将封装anauthor和comments的数组以及anID和atitle:vartutorialTypegraphql。NewObject(graphql。ObjectConfig{Name:Tutorial,Fields:graphql。Fields{id:graphql。Field{Type:graphql。Int,},title:graphql。Field{Type:graphql。String,},author:graphql。Field{here,wespecifytypeasauthorTypewhichwevealreadydefined。ThisishowwehandlenestedobjectsType:authorType,},comments:graphql。Field{Type:graphql。NewList(commentType),},},},)更新我们的架构
  现在我们已经定义了我们的Type系统,让我们着手更新我们的Schema以反映这些新类型。我们将定义2个distinctField,第一个将是我们的tutorial字段,它允许我们Tutorials根据传入查询的ID检索个人。第二个将是一个list字段,它将允许我们检索Tutorials我们在内存中定义的完整数组。Schemafields:graphql。Fields{tutorial:graphql。Field{Type:tutorialType,itsgoodformtoaddadescriptiontoeachfield。Description:GetTutorialByID,Wecandefineargumentsthatallowustopickspecifictutorials。InthiscasewewanttobeabletospecifytheIDofthetutorialwewanttoretrieveArgs:graphql。FieldConfigArgument{id:graphql。ArgumentConfig{Type:graphql。Int,},},Resolve:func(pgraphql。ResolveParams)(interface{},error){takeintheIDargumentid,ok:p。Args〔id〕。(int)ifok{Parseourtutorialarrayforthematchingidfor,tutorial:rangetutorials{ifint(tutorial。ID)id{returnourtutorialreturntutorial,nil}}}returnnil,nil},},thisisourlistendpointwhichwillreturnalltutorialsavailablelist:graphql。Field{Type:graphql。NewList(tutorialType),Description:GetTutorialList,Resolve:func(paramsgraphql。ResolveParams)(interface{},error){returntutorials,nil},},}
  所以我们已经创建了我们的类型并更新了我们的GraphQL模式,我们做得还不错!测试它的工作原理
  让我们尝试使用我们的新GraphQL服务器并处理我们提交的查询。让我们来尝试我们的list架构改变query,我们已经在我们得到main()的功能:Queryquery:{list{idtitlecomments{body}author{NameTutorials}}}
  让我们分解一下。所以在我们的查询中,我们有一个特殊的root对象。然后我们在其中说我们想要该list对象上的字段。在返回的名单list,我们希望看到的id,title,comments和author。
  当我们运行它时,我们应该会看到以下输出:gorun。。。。{data:{list:〔{author:{Name:ElliotForbes,Tutorials:〔1〕},comments:〔{body:FirstComment}〕,id:1,title:GoGraphQLTutorial}〕}}
  正如我们所见,我们的查询以JSON格式返回了我们所有的教程,看起来非常像我们初始查询的结构。
  现在让我们尝试对我们的tutorial模式进行查询:query:{tutorial(id:1){titleauthor{NameTutorials}}}
  再一次,当我们运行它时,我们应该看到它已经成功地检索了内存中的单独教程ID1:gorun。。。。{data:{tutorial:{author:{Name:ElliotForbes,Tutorials:〔1〕},title:GoGraphQLTutorial}}}
  完美,看起来我们已经让list我们的tutorial模式和我们的模式都按预期工作了。
  挑战尝试更新我们populate()函数中的教程列表,以便它返回更多教程。完成此操作后,请尝试使用查询并尝试对它们更加熟悉。结论
  这就是我们将在这个初始教程中介绍的全部内容。我们已经成功地设置了一个简单的GraphQL服务器,该服务器由内存数据存储支持。
  在下一个教程中,我们将研究GraphQL突变并更改我们的数据源以使用SQL数据库

第36届法国耶尔艺术节未来时尚设计之星诞生SofiaIlmo为庆祝梅赛德斯奔驰与耶尔艺术节的长期合作友好关系,梅赛德斯奔驰设立了可持续发展奖,这是耶尔艺术节第一个以可持续发展为主题的奖项并延续了品牌推动奢侈品发展这一远大的目标。该奖项与……重庆磁器口古镇风情磁器口古镇位于重庆市沙坪坝区嘉陵江畔,始建于宋代,拥有一江两溪三山四街的独特地貌,形成天然良港,是嘉陵江边重要的水陆码头。曾经白日里千人拱手,入夜后万盏明灯繁盛一时。主题……CVR708全新回归内外精致高清经典,记录你的出行飞利浦行车记录仪CVR708有着别致的单反设计元素,全方位融合了现代出行记录全需求,兼得高性能与设计感,完美契合各型汽车车内装饰风格,智能科技感十足,自上市以来便一直是行业同品……OPPO平板相关信息曝光,或将定位中高端市场随着近年来平板电脑市场的回暖,越来越多的手机厂商也开始陆续进入这一领域,也使得消费者在市场上有了更多的选择。日前有消息透露,OPPO方面也或将推出一款定位不低的平板电脑产品,并……小米又曝性价比之王新机,这次有什么新亮点?我们如果有心对比前两年的小米,会发现它已经奋力追逐市场前列的对手们了,虽然大家都知道小米是主打性价比的手机品牌,但是这几年确实它的手机业务普普通通,没有生产很多吸引人眼球的新机……中国邮政新政策,快递次日达,对比其他快递公司有哪些优势说到物流快递公司首先要从电商的崛起开始,现在国内最大的电商物流还是京东快递,刘强东的京东可以和马云的阿里巴巴竞争十几年不倒。重要的原因之一是京东的自营物流比阿里巴巴的第三方物流……怕什么来什么,台积电做好准备毫无疑问,台积电已经是全球最大的第三方芯片代工商,这里所说的最大,不仅仅是台积电的市场份额,还有台积电所具备的量产规模,技术实力等。芯片代工产业数据高度的技术密集,以及高……中国有哪些企业在未来有希望成为像微软苹果高盛这样的世界级企业中国有哪些企业可以成为像苹果,微软,高盛这样的世界级企业。未来中国这样的企业应该也有很多。苹果,微软和高盛都是美国的企业。随着二战结束,美国的强盛。布雷顿森林体系的建立,……联想到底有没有侵吞国有资产?不谈其他只讲中一点,柳传志贪占了倪光南院士无偿赠送给国家的汉卡及技术,而后柳传志又把倪院士扫地出门独占了,让一个原属100国有公司转换成柳传志为主的控股公司。再利用倪光南院士赠……观察蔚来们该向中国手机学习,技术和供应链都要抓都要硬(以下内容是36氪音频节目《观察》的文字版,收听更多精彩解读,请在36氪app订阅《观察》)采访秘丛丛文稿整理李胜楠近日,电动车企业蔚来交了自己在上市后的首份……这边鹿晗关晓彤忙着秀恩爱,那边一鹿彤行商标就被抢注了关晓彤和鹿晗自从宣布恋爱后,就经常被传出分手。最近这段时间,他们分手的传闻尤其多。4月20号是鹿晗的生日,但是到了这一天,关晓彤却迟迟没有发生日祝福,于是很多网友和营销号……自6月以来,以太坊Gas费用上涨了2,300根据加密指标网站BitInfoCharts的数据,以太坊的平均交易费用飙升至51。45美元,数据显示自6月下旬以来增长了2,293。自8月伦敦硬分叉以来,以太坊上的交易价……
梦幻西游主题小镇,空降重庆融创文旅城渝你相约,纯爱梦幻。梦幻西游x融创文旅城联动活动2。0来啦!10月1日,梦幻西游主题小镇正式开启!游戏里的三界乐趣不断,游戏外的主题线下活动也要精彩加码!走入梦幻主题小镇……糖的英文是sugar,那冰糖英文是啥?棒棒糖又是啥?今天,我想来带大家来学习一下英文中的各种糖。我们都知道,白糖、蔗糖等的英文可以用sugar,而糖果的英文则是candy。在生活,除了这些糖,我们还会用到冰糖、红糖,……从长春一汽和红旗,看中国汽车行业的昨天今天和明天壹序先看图,下图为长春市2019年上半年GDP数据,排除疫情影响我们就看19年数据,正好这也是国内车市全面进入寒冬之时。2019年上半年15座副省级城市GDP统计数……主力资金64亿抢筹有色股!中信证券净流入19亿元【大盘数据】今日两市全天上涨2087家,下跌2265家,101家平盘。涨停数107家,跌停28家。沪指上涨0。45,主力资金净流入12。71亿元。创业板……2021年了短视频和直播还能改变普通人的命运吗?在中国每隔35年都会出现一次风口,如10年前的电商、5年前的微电商、今天的短视频与直播。而普通人突破阶层的唯一的机会,就是站在风口上,借助时代的东风逆袭。风口每个普……1吨iPhone主板能回收1斤黄金1500万中国人正在用八万、2009年,一位大众相当陌生的女性,成了胡润百富榜上的中国首位女首富,而她的发家行当也同样冷门:废旧回收再利用。她就是至今还被称为废纸女王的张茵,在资源越发紧张的趋势下……淘宝上被恶意买家投诉,怎么办?黄牛抢单后哄抬商品价格、恶意评价干扰消费者判断,看到这些字眼,不少互联网经营者都会感到头疼。这些恶意行为不但影响商家的正常经营,最终也会影响到终端消费者的体验。那么哪些是……给年轻人留点未来2008年时,中国储蓄率曾一度达到峰值:51。8,增速高达16。2。这个增速成为记录,之后再也没有出现过,对应的则是我们国家的储蓄率持续下滑:中国总储蓄率中国历来具……欧易NFT市场提醒警惕NFT产品交易NFT头像的不断发力,让很多投资者都发出感叹,到底这种数字艺术,还是数字垃圾。在巨大财富效应吸引下,头像NFT的制作和销售越来越火热,很多大佬IP纷纷争相入局,这种IP效应再次……荣耀10的颜值魅力,会变色才潮美华为荣耀总是将手机的颜值放在首要位置,这次荣耀10也毫无例外的让大家惊喜一把。荣耀10采用了变色光学镀膜工艺,首创业内变彩极光玻璃,带来了炫酷的视觉效果。比如幻影蓝版本的……音乐厅中的发烧录音欣赏会器材和主要曲目介绍7月11日(周六)下午1:304:30,在成都伽地音厅将会有一场别开生面的音乐会。它不是由现场乐队演奏,而是采用音响器材播放发烧录音唱片的方式。具体详情见:https:w……Zoom全新沉浸感虚拟会议最多可容纳25人同时在线现在,虚拟会议领域的《Zoom》用ImmersiveView为虚拟会议带来一种全新的沉浸感。这项新功能于4月26日正式推出,允许《Zoom》会议的所有参与者首次在屏幕上将……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网