2016-12-14 8 views
0

私はレールでAPIを作るために練習しています。 apiには現在get要求でURLを受け取るエンドポイントが1つしかありません。私のルートは以下のとおりです。レールの動的URLを

Rails.application.routes.draw do 
    # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html 
    namespace :api, defaults: { format: :json } do 
     namespace :v1 do # resources :orders 
     get "*link" => "application#parse_link" 
     end 
    end 
end 

マイアプリケーションコントローラコード:

require 'open-uri' 

class Api::V1::ApplicationController < ActionController::Base 
    respond_to :json 
    # protect_from_forgery with: :exception 

    def parse_link 

     begin 

      url = URI.parse(params[:link]) 
      doc = Nokogiri::HTML(open(url).read) 

     rescue 
      redirect_to 'http://localhost:3000/' 
     end 

    end 
end 

私は、このようなURLを送信すると:それは

しかし、URLの次のタイプを正常に動作

http://localhost:3000/api/v1/http://stackoverflow.com/questions/41138538/dynamic-urls-in-rails-params 

動作しません:

この場合、
http://localhost:3000/api/v1/http://stackoverflow.com/ 

0、それはあなたがそれが与えられたURLを分割表示し、リンクのparamと「.COM」の部分で、それの半分を節約することができるように、これらののparams

<ActionController::Parameters {"link"=>"http:/stackoverflow", "format"=>"com"} permitted: true> 

私に与えてリンクを分割し、フォーマットパラメータ。

おかげ

+1

パラメータにhttp:// localhost:3000/api/v1/http%3A%2F%2Fstackoverflow.com%2F'のURLエスケープ特殊文字が含まれています。これで十分でない場合は、ドットをエスケープしてください。 –

+0

しかし、エンコードはparamsで行われます......... Paramは既に分割されています......完全なURLではありません –

+0

Nahはエンコードしてリクエストを送信します。 APIクライアントで。もちろん、APIサーバーではありません。 –

答えて

0

constraintsdefaultsを変更してみてください:

Rails.application.routes.draw do 
    namespace :api, constraints: { format: :json } do 
     namespace :v1 do # resources :orders 
     get "*link" => "application#parse_link" 
     end 
    end 
end 

お知らせ:それはだけでなく、JSONする形式を制約デフォルトとして設定されます。 Railsは応答タイプとしてURLの最後に.comを処理しました。