Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 如何解析子字段,以便向HTTP查询添加可选参数?_Elixir_Graphql_Absinthe - Fatal编程技术网

Elixir 如何解析子字段,以便向HTTP查询添加可选参数?

Elixir 如何解析子字段,以便向HTTP查询添加可选参数?,elixir,graphql,absinthe,Elixir,Graphql,Absinthe,注意:这是一个大大简化的示例,但问题是相同的 我试图用GraphQL接口包装一个现有的HTTP服务,/blog posts。只有我传入查询参数,extra data=true,服务才会在响应中返回一些额外数据。所以 GET/blog posts:获取ID和标题 GET/blog posts?extra data=true:获取ID、标题和extra data字段 我有一个类似于以下的苦艾酒模式: query do field :blog_posts, non_null(list_of(n

注意:这是一个大大简化的示例,但问题是相同的

我试图用GraphQL接口包装一个现有的HTTP服务,
/blog posts
。只有我传入查询参数,
extra data=true
,服务才会在响应中返回一些额外数据。所以

  • GET/blog posts
    :获取ID和标题
  • GET/blog posts?extra data=true
    :获取ID、标题和
    extra data
    字段
我有一个类似于以下的苦艾酒模式:

query do
  field :blog_posts, non_null(list_of(non_null(:blog_post)))
  resolve &MyAppWeb.Resolvers.Blog.posts/3
end

object :blog_post do
  field :id, non_null(:id)
  field :title, non_null(:string)
  field :extra_data, :string,
    resolve: &MyAppWeb.Resolvers.Blog.post_extra_data/3
end
我的问题是我不知道如何实现
extra_data
解析器,这样它就不会在已经调用了
/blog posts
之后对
/blog posts?extra data=true
进行冗余调用。有一个中间件被设计用来帮助解决类似的问题,即N+1查询,但我不知道如何在我的案例中应用它

有什么建议吗?

一个可选字段 如果只是一个额外字段,则可以在查询中传递:

querydo
字段:blog\u posts,列出(:blog\u post)do
arg:extra_数据,:布尔值
解析&MyAppWeb.Resolvers.Blog.posts/2
结束
结束

多个额外字段 但是,如果有多个可选参数,最好使用自定义参数:

input\u对象:额外的输入do
字段:额外值,:布尔值
字段:extra_b,:布尔值
字段:额外值,:布尔值
结束
询问
字段:blog\u posts,列出(:blog\u post)do
arg:extra_字段,:extra_输入
解析&MyAppWeb.Resolvers.Blog.posts/2
结束
结束
在解析器中,您可以获取请求字段并使用它们构建HTTP请求URL:

def posts(%{extra_fields:extra},_分辨率)do
#这里的'extra'是请求的可选字段的映射。你可以
#筛选选定字段,将其映射到HTTP服务名称并
#在调用之前,先构造HTTP url和查询参数
#一次性
结束


在这两种情况下,请删除直接在
:blog\u post
对象的
:extra\u data
字段中指定的解析器。

谢谢。我可以回到一个查询参数,但我希望得到一个更惯用的GraphQL解决方案,即将图形的一部分映射到
额外数据
HTTP查询参数。由于这不是一个常见的用例,因此您不会找到一个能神奇地自动执行的解决方案™️ 实现了这种转变。在这里使用查询参数是正确的方法。我认为这是一个常见的用例。我找到了另外两个GraphQL服务器,它们正好做到了这一点(让我检查一下高级解析器中选定的嵌套字段):和。我想我会和苦艾酒的人谈谈一个功能请求。找到了!:-)苦艾酒已经有了它,可以让我检查当前查询中的嵌套选择。我会尝试一下,然后写一个答案。是的,project是一种替代方法,但用于检查graphql查询中是否请求了某个字段。这也会解决你的问题。