Faraday: 用实体删除

创建于 2017-05-17  ·  23评论  ·  资料来源: lostisland/faraday

HTTP 规范在 2014 年发生了变化,并允许删除具有正文。 是否有计划解决 connection.rb 中的委托方法,以允许使用 delete 方法的主体而不是将其清除?

feature

最有用的评论

对于仍在等待此问题的任何人,我发现以下解决方法似乎适用于我的情况:

conn = Faraday.new
body = {
some_key: 'some value'
}
conn.run_request(:delete, url, body, headers)

我希望这对某人有所帮助,直到默认情况下删除不再使正文为零

所有23条评论

PR 将很快提交给您审核。

@Carlbc18

您能否提供上述更改的链接?
我想这仅适用于 HTTP 2.0 规范,因此我们可能需要仔细考虑此功能。

https://tools.ietf.org/html/rfc7231#section -4.3.5

仅供参考:同样的文本块也适用于 GET && HEAD 请求。

特别是规范的这一部分:

DELETE 请求消息中的有效载荷没有定义的语义;
在 DELETE 请求上发送有效负载正文可能会导致一些现有的
拒绝请求的实现。

我有一个代码更改,测试有效(不确定你是否想要)。 我如何为这个项目创建一个公关?

我想这仅适用于 HTTP 2.0 规范,因此我们可能需要仔细考虑此功能。

这实际上是 HTTP 1.1 的一部分

如果你想创建一个 PR,我肯定会考虑它。
您可以像使用任何其他 repo 一样执行此操作,只需 fork faraday并将更改应用到您的 fork,然后创建一个 PR 到我们的主分支。

谢谢@iMacTia。 我会放上来的。 您对更改版本的看法最终有一个主要版本号吗? 对于许多人来说,这种变化可能是破坏性的。 我想遵循 semver 模式,此时法拉第版本为 1.0.0。 让我知道你的想法。

我们肯定会努力坚持使用 semver,并且我们已经对 v1.0 进行了一些重大更改。
如果此更改会破坏向后兼容性,那么它将仅在 1.0 版中发布(目前没有固定的发布日期)。
但是,我的理解是您现在应该能够选择性地向 GET、HEAD 和 DELETE 请求添加主体,所以这不应该向后兼容吗? 我错过了什么吗?

@iMacTia我的版本是 0.13.0 并且 PR 已经启动。 我们可以就此向 PR 进行任何其他对话,因为我相信会有评论。 再次感谢!

这是对我的https://github.com/lostisland/faraday/pull/695#issuecomment -305145499 的跟进。
首先,我们应该决定我们希望它如何工作。
假设更改应该向后兼容,以下应该仍然有效:

conn = Faraday.new(...)
conn.get('/path', {page: 1, per: 10})

# performs "GET /path?page=1&per=10"

如我的评论中所述,选项 1 是使此行为可配置:

conn = Faraday.new(..., standard: :http1_1)
conn.get('/path', {page: 1, per: 10})

# performs "GET /path" with body "page=1&per=10" (assuming www_form_url_encoded request)

相反,选项 2 意味着更强大的东西:

conn = Faraday.new(...) # note no special config here
conn.get('/path', {page: 1, per: 10}, body: {some_key: 'some_value')

# performs "GET /path?page=1&per=10" with body "some_key=some_value"

但是有一个问题,选项 2 可能只适用于 ruby​​ >= 2 因为 ruby​​ 1.9 不支持关键字参数😞

我认为关于这不适用于 ruby​​ 1.9 我觉得没问题。 Ruby 1.9 已经有很多年了。 我主张我们将最低 ruby​​ 版本的版本提升到至少 2.0,这将与 Faraday 的 v1.0 版本一致。 在我看来,选项 2 更接近于 http 1.1 规范,因为您可以选择传递参数和/或可选正文。

我觉得试图保持与适用于 ruby​​ 1.9 的 http 规范功能的向后兼容性会导致问题。 我认为这个功能会更适合法拉第的 V1。 我觉得有太多变量需要支持此更改(ruby v,params 传递)。 可能是我多虑了......

我认为关于这不适用于 ruby​​ 1.9 我觉得没问题。 Ruby 1.9 已经有很多年了。 我主张我们将最低 ruby​​ 版本的版本提升到至少 2.0,这将与 Faraday 的 v1.0 版本一致。 在我看来,选项 2 更接近于 http 1.1 规范,因为您可以选择传递参数和/或可选正文。

我完全同意以上所有。 这确实是最好的做法,尽管这意味着我们仍然需要等待 v1.0

所以要定义一个 v1.0 向后兼容的 API,我们可以尝试以下操作:

获取、头部、删除请求

conn = Faraday.new(...) # note no special config here
conn.get(path, url_params, body: {...})
# second parameter is URL PARAMS, optionally accept a named parameter for request body
# works the same for head and delete

POST、PUT、补丁请求

conn = Faraday.new(...) # note no special config here
conn.post(path, body, url_params: {...})
# second parameter is REQUEST BODY, optionally accept a named parameter for url_params
# works the same for put and patch

我认为通过这种方式,我们涵盖了所有可能的组合并扩展了 post/put/patch 请求!

肯定同意。 我们要拒绝我的 PR 并为此开设一个新的 PR 吗? 是否有我们可以解决的 V1 分支切割?

很高兴关闭那个并从头开始,因为它会完全不同。 对不起!

我将在合并之前创建一个 V1 分支,所以请随意从 master 开始,我将重定向 PR :)

@Carlbc18只是想让你知道分行1.0现在可供你使用😃。

谢谢谢谢! 😀

对于仍在等待此问题的任何人,我发现以下解决方法似乎适用于我的情况:

conn = Faraday.new
body = {
some_key: 'some value'
}
conn.run_request(:delete, url, body, headers)

我希望这对某人有所帮助,直到默认情况下删除不再使正文为零

那么是否有关于何时可用的更新?

我还没有看到任何 PR,但 v1 上的工作进展缓慢。
我可能可以自己解决这个问题,但目前我无法给出估计。
关于请求应该如何工作的更新 API 在我上面的评论中有解释,所以如果有人想在我之前试一试,非常欢迎 PR。

对于完全向后兼容的解决方案,PR 可以从 master 分支出来,我可以制作另一个 0.x 版本。
如果更改会破坏向后兼容性,那么最好从1.0分支中分支出来

https://github.com/lostisland/faraday/pull/855是支持这一点的 PR 草案。

我拒绝这个功能。 您可以使用 Faraday 中的块形式来发出带有正文的请求:

conn.delete(url) do |req|
  req.body = { some_key: 'some value' }
end

这个想法可以使简单的删除与身体成为一个单一的单行,但实现增加了比我想要的更多的复杂性和令人惊讶的行为。 这种块形式在法拉第已经很好用了。 我更喜欢修改类的属性而不是向方法添加更多参数:

conn.delete('/foo/1') do |req|
  req.headers["X-Men"] = "marvel"
  req.params[:confirm] = 1
  req.body = { some_key: 'some value' }
end
此页面是否有帮助?
0 / 5 - 0 等级

相关问题

luizkowalski picture luizkowalski  ·  3评论

t3hk0d3 picture t3hk0d3  ·  3评论

JasonBarnabe picture JasonBarnabe  ·  4评论

QuinnWilton picture QuinnWilton  ·  4评论

mattmill30 picture mattmill30  ·  4评论