簡體   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