2017-05-08 5 views
0

に消費するには、私が作成し、RESTのAPIを消費に関する多くの記事を読んだが、私は、単一のアプリでそれを行う方法についての有用な文書を見つけたhavent。RailsのREST APIと同じアプリケーション

Railsで完成したMVCアプリケーションを使用していましたが、それを変更してREST APIを使用して他の開発用のデータを提供することにしましたが、実際の方法はわかりません。私たちがやったのは、内部にAPIコントローラを持つapi/v1/folder構造を作ることでした。

我々はテストに非常に単純なコントローラがあります。

namespace :api do 
    namespace :v1 do 
    scope '/products' do 
     get '/list' => 'products#list' 
    end 
    end 
end 

を私は期待どおりに動作するサーバーとアクセスhttp://localhost:3000/api/v1/products/listを開始すると:私のルートで

class Api::V1::ProductsController < ApplicationController 
    def list 
    @products = Product.limit(100) 
    render json: @products, status: 200 
    end 
end 

は、私は次のようしたファイル。で、次の

class ProductsController < ApplicationController 
    include HTTParty 
    base_uri "http://1ocalhost:3000/api/v1/products"  
    format :json 

    def index 
    @products = self.class.get("/list?category_id=22")) 
    end 
end 

私はそのルートを取得しようと、それが表示されます。

しかし、今、私は、同じアプリケーションからそれを消費しようとしているので、私は次のコードで別のProductsControllerを持っていますサーバーコンソール:

Started GET "/" for 127.0.0.1 at 2017-05-08 11:58:30 -0400 
Processing by ProductsController#index as HTML 
Started GET "/api/v1/products/list?category_id=22" for 127.0.0.1 at 2017-05-08 11:58:31 -0400 
Completed 500 Internal Server Error in 120213ms (ActiveRecord: 2.9ms) 

Net::ReadTimeout (Net::ReadTimeout): 

しかし、エラーがスローされた後、要求はバックグラウンドで正しく行われます。

私は、これは正しいアプローチであると私は同じサーバにだと、既にAPIが働いて得ることをテストした場合第二に、なぜ私はそのタイムアウトを取得していた場合に最初に知っていただきたいと思います。

ありがとうございます。

答えて

2

私は同じサーバーにいて、APIを稼働させていることを既にテストしていると、タイムアウトが発生します。

正確にあなたは同じ[シングルスレッド開発]サーバーに属しているためです。あなたはすでにリクエストを処理中です。すべての容量が使い果たされる。

あなた自体へのリモート呼び出しを行う上廃棄物の資源べきではありません。これは、あなたのコードをより多くのリソースを飢えさせて脆弱にすることとは別に、何を達成するのでしょうか?シンプルなDBリクエストであったのは、同じdbリクエストとhttpリクエストです。フロントエンド(ジャバスクリプト/ブラウザ)からの照会

は全く別の問題です。しかし、サーバー上で - それをしないでください。コードの重複が心配だったら、クエリをQueryObject(または何でも)に抽出し、それをあなたのAPIコントローラとアプリケーションコントローラの両方から使用してください。

+0

あなたの答えをありがとう、しかし、なぜ私はそのエラーが表示されています。私はまだHTTPリクエストを行わずにその関数を呼び出す方法を知る必要があります(まだREST APIが必要です)。 – Kunstmann

+0

@Kunstmann:どのような関数ですか?残りのAPIエンドポイント? httpコール経由のみ。答えの最後の部分を確認してください。それはあなたに役立つ提案を含んでいます。 –

関連する問題