繁体   English   中英

将具有修改的http标头的http发布请求重定向到另一台服务器

[英]Redirect a http post request with modified http header to another server

我正在使用Ruby on Rails。 这是要求:客户端(由我开发的本地移动应用程序)将向我的Ruby代码发送http发布请求,我的代码将添加一些额外的http标头(基于某些业务逻辑),然后我需要“转发”或将此发布请求“重定向”到另一个后端服务器(具有REST服务),并将其响应返回给客户端。

我已经能够编写机架中间件来拦截发布请求并添加额外的标题。 最初我以为我可以只使用http重定向(状态代码:307,用于发布请求)。 但问题是,额外的头不能提交,这是我的代码的整点。 因此,这本身不是 http重定向或转发,更像是转换请求。

我可以使用net http从我的代码中发出单独的发布请求。 这可行。 但是我必须将数据从传入请求复制到传出请求(例如,表单数据,http标头)。 这种复制似乎有点乏味。

我希望使用某种简单的“重新打包”(类似于http重定向或转发),也就是说,我将整个传入请求复制到传出请求,在多余的标头上拍打,然后将其发送到目标URL并完成。 我不确定如何做到这一点,如果这样做的话甚至是个好主意。 例如, HTTP_USER_AGENT显示了客户端的操作系统,浏览器类型,当我发出新请求时,可能不需要发送该请求。

另外,我只能复制特定于应用程序的数据,因为它们是后端服务器(此“重定向”的目标)关心的全部。 但是我反对在代码中对属性进行硬编码,从而导致与客户端(我们的本机移动应用程序)的紧密耦合。 理想情况下,我仅复制特定于应用程序的数据, 而无需对其属性名称进行硬编码。 这可能吗? 如果是这样,怎么办?

任何意见,将不胜感激。 谢谢。

HTTP不允许重定向除GET请求以外的任何内容。

从技术上来说这不是正确的,但是使用HTTP 307有点粗略-请参阅https://softwareengineering.stackexchange.com/questions/99894/why-doesnt-http-have-post-redirect

如果您也需要将POST请求发送到另一台服务器进行处理,则使用似乎已经在使用的代理是正确的解决方案。

在代理中重新创建请求可能看起来很乏味,但实际上可以保证您可以正确地调用其他服务器“ API”。

虽然您可以简单地遍历请求标头:

uri = URI('http://www.example.com/todo.cgi')
req = Net::HTTP::Post.new(uri)

request.headers.each do |key, value|
  req[key] = value
end

并传递请求表格数据:

req.set_form_data = request.request_parameters

您应该问自己,是否真的应该谨慎处理所有内容。

参见http://api.rubyonrails.org/classes/ActionDispatch/Request.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM