HTTP 规范在 2014 年发生了变化,并允许删除具有正文。 是否有计划解决 connection.rb 中的委托方法,以允许使用 delete 方法的主体而不是将其清除?
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
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
最有用的评论
对于仍在等待此问题的任何人,我发现以下解决方法似乎适用于我的情况:
我希望这对某人有所帮助,直到默认情况下删除不再使正文为零