2016-05-16 5 views
2

私はRuby on Railsを使用しています。クライアント(私が開発したネイティブのモバイルアプリケーション)は、Rubyコードにhttp投稿リクエストを送信し、私のコードは(いくつかのビジネスロジックに基づいて)いくつかの余分なhttpヘッダーを追加します。このポスト要求を別のバックエンドサーバ(RESTサービスを持つ)に「リダイレクト」し、その応答をクライアントに返します。変更されたHTTPヘッダーを持つhttp投稿要求を別のサーバーにリダイレクト

私はラックのミドルウェアを書いて、ポストリクエストを傍受し、追加のヘッダを追加することができました。もともとは、私はhttpリダイレクト(ステータスコード:307後のリクエストのために)を使用することができると思った。しかし、問題は、余分なヘッダーがでなく、と提出できるということです。これは私のコードの全体的なポイントです。したがって、ではありません。HTTPリダイレクトまたは転送自体ではなく、リクエストを変換するようなものです。

net httpを使用して自分のコードから別の投稿要求を行うことができます。これは機能します。しかし、私はCOPY私の発信要求(フォームデータ、httpヘッダーなど)への着信要求からのデータにする必要があります。このコピーはちょっと面倒です。

私は単純な「再パッケージ化」(HTTPリダイレクトやフォワーディングに似ています)を好みます。つまり、着信要求全体をコピーして、追加のヘッダーをスラップし、宛先URLに送信しますと一緒に行われる。私はこれをどうやって行うのか分からず、そうするのが良い方法でもあります。たとえば、HTTP_USER_AGENTには、クライアントのブラウザのOSであるOSが表示されます。新しいリクエストを作成しているときに、これを送信する必要はありません。

また、すべてのバックエンドサーバー(この「リダイレクト」の宛先)が気になるアプリケーション固有のデータのみをコピーできます。しかし、私はコード内の属性をハードコーディングすることを嫌い、クライアント(私たちのネイティブモバイルアプリ)と密接に結びついています。理想的には、アプリケーション固有のデータをコピーして、の属性名をハードコードしないとコピーできません。これは可能ですか?もしそうなら、どうですか?

アドバイスをいただければ幸いです。 ありがとうございます。

+0

を参照してください。すべてのアプリケーション固有のアプリケーションヘッダーは、「HTTP_」で始まります(http://stackoverflow.com/questions/6317705/rackrequest-how-do-i-get-all-headersで説明されています)。フォームデータは、request.POST(Rack :: Requestのオブジェクトであるリクエスト)を介してアクセスできます。したがって、属性名をハードコードする必要はありません。 –

答えて

3

HTTPでは、GETリクエスト以外のリダイレクトは許可されません。

- あなたが必要とあまりにもあなたがすでに思えるよう、プロキシを使用して処理するために別のサーバーにPOSTリクエストを送信した場合

これは技術的に正しいではなく、HTTP 307を使用すると、一種の不完全であるhttps://softwareengineering.stackexchange.com/questions/99894/why-doesnt-http-have-post-redirectを参照してください)そうすることが正しい解決策です。

プロキシでリクエストを再作成するのは面倒かもしれませんが、実際には他のサーバー「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ヘッダーをコピーし、フォームデータが、私はそれが可能だろうと思ったほど複雑ではないようですhttp://api.rubyonrails.org/classes/ActionDispatch/Request.html

+0

セキュリティ上の懸念が非常に深刻なので、上記の例のように転送をお勧めしません。あなたが基本的にユーザーのプロキシを何かにして、代理サービスにリクエストがあなたのアプリからの正当なリクエストであると思われます。私は慎重なホワイトリストでそれを使用します。 – max

+0

はい、それは良い点です。慎重なホワイトリストがあるということを忘れていたので、すべてのリクエストがプロキシされているわけではありません。 –

+0

"HTTPはGET要求以外のリダイレクトを許可しません。"それは事実上間違っています。しかし、他のすべてに+1。 – DaSourcerer

関連する問題