2017-05-08 1 views
0

REST API를 생성하고 사용하는 것에 대한 많은 게시물을 읽었지만 단일 앱에서이를 수행하는 방법에 대한 유용한 문서를 찾지 못했습니다.Rails API 및 동일한 애플리케이션에서 사용하기

저는 Rails에서 완성 된 MVC 애플리케이션을 사용 했었지만 REST API를 사용하여 다른 개발을위한 데이터를 제공하기 위해이 애플리케이션을 변경하기로 결정했지만 실제로 어떻게해야하는지 잘 모릅니다. 우리가 한 것은 내부에 API 컨트롤러가있는 api/v1/폴더 구조를 만드는 것입니다.

우리는

테스트에 매우 간단한 컨트롤러가 : 나는 서버 및 액세스 예상대로 작동 http://localhost:3000/api/v1/products/list를 시작하면

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

: 내 노선에서

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 호출을 통해서만. 대답의 마지막 부분을 확인하십시오, 그것은 당신을 도울 제안이 포함되어 있습니다. –

관련 문제