JSON 기반 RESTful 코드의 예외를 처리하는 방법
저는 RESTful API로 통신하는 JSON을 사용하는 "Software as a Service" 앱을 가지고 있습니다.
간단히 설명하면 JSON 데이터 교환과 함께 RESTful API를 사용할 때 예외를 캡처하고 보고하는 모범 사례는 무엇입니까?
처음에 생각한 건 레일이 비계를 만들어서 뭘 하는지 보는 거였는데, 그건 확실히 옳지 않아요.발췌문은 다음과 같습니다.
class MumblesController < ApplicationController
# GET /mumbles/1
# GET /mumbles/1.json
def show
@mumble = Mumble.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.json { render json: @mumble }
end
end
end
이 경우, JSON 코드가 존재하지 않는 ID 를 송신하는 경우.
http://www.myhost.com/mumbles/99999.json
Mumble.find()가 ActiveRecord를 올립니다.Record Not Found(레코드 없음)ActionController는 이를 포착하여 오류 페이지를 HTML로 렌더링합니다. 그러나 HTML은 JSON을 기대하는 클라이언트에게는 사용할 수 없습니다.
Mumble.find()를 포장으로 싸서 해결할 수 있습니다.begin ... rescue RuntimeError차단하고 JSON 상태 => : unprocessable_displays 또는 기타 무언가를 렌더링합니다.
그러나 클라이언트의 앱이 잘못된 경로를 전송하면 다음과 같이 됩니다.
http://www.myhost.com/badtypo/1.json
JSON 기반 앱은 이를 감지하여 JSON에서 오류를 반환해야 합니까?그렇다면 Action Dispatch를 자세히 조사하지 않고 어디서 캡처할 수 있을까요?
전체적으로 오류가 있을 경우 Action Controller가 HTML을 생성하도록 해야 합니까?그건 옳지 않아...
([질문 투고]를 누르기 직전에 답을 찾았습니다).하지만 이것은 다른 사람에게도 도움이 될 수 있습니다.)
Action Controller의 사용rescue_from
정답은 Action Controller의rescue_from이 가이드에 기재되어 있습니다.특히 다음 행에 따라 기본 404.html 및 500.html 파일의 기본 렌더링을 바꿀 수 있습니다.
class ApplicationController < ActionController::Base
rescue_from ActiveRecord::RecordNotFound, :with => :record_not_found
private
def record_not_found(error)
render :json => {:error => error.message}, :status => :not_found
end
end
만약 그것이 도움이 된다면, 나는 내 순수 json api를 위해 모든 것을 캐치했다.
고객님의 고객명ApplicationController각 특정 컨트롤러가 상속하는 경우,
# app/controllers/api/v1/application_controller.rb
# ...
rescue_from StandardError do |exception|
render json: { :error => exception.message }, :status => 500
end
# ...
- 대부분 겁없는_대부분의 대답에 기초하고 있다.
개발자로서 트레이스(가능하면 유용한 선으로 보석을 걸러내는 것)도 보고 싶어질 것입니다.그리고 생산을 위해 흔적을 보이지 않게 만듭니다.
rescue_from StandardError do |exception|
# Handle only JSON requests
raise unless request.format.json?
err = {error: exception.message}
err[:backtrace] = exception.backtrace.select do |line|
# filter out non-significant lines:
%w(/gems/ /rubygems/ /lib/ruby/).all? do |litter|
not line.include?(litter)
end
end if Rails.env.development? and exception.is_a? Exception
# duplicate exception output to console:
STDERR.puts ['ERROR:', err[:error], '']
.concat(err[:backtrace] || []).join "\n"
render :json => err, :status => 500
end
JSON API 코드를 작성하기 위한 일관된 표준을 유지하는 방법에 대한 명확한 합의는 없지만, 이것은 내가 연습하는 것의 일부입니다(당신이 요청한 것 이상).
- 심플하게 - 휴식을 취하도록 노력하세요.커스텀 메서드로 인해 일이 빠르게 복잡해질 수 있습니다.
- 서버에서 네이티브 에러 코드를 반환하도록 하고 'scue_from'을 사용하여 캡처합니다.
- 또는 클라이언트 앱이 특별히 대상으로 삼을 수 있는 Rails HTTP 응답 코드를 렌더링합니다.
사용자의 경우, Rails response_to 및 response_with html/json/기타 응답을 우아하게 처리할 수 있습니다.그리고 솔루션에서도 HTML을 효과적으로 렌더링할 수 있지만 클라이언트 앱에서는 해석되지 않습니다.HTTP 헤더를 읽고 HTTP 응답 코드를 얻을 수 있습니다.이것이 'secue_from'의 트리거가 됩니다.
언급URL : https://stackoverflow.com/questions/11859437/how-to-handle-exceptions-in-json-based-restful-code
'source' 카테고리의 다른 글
| 스프링 부트 MVC 테스트 - MockMvc는 항상 null입니다. (0) | 2023.03.01 |
|---|---|
| 필드/키별 고유값의 mongodb 카운트 수 (0) | 2023.03.01 |
| remove_action()이 WordPress 플러그인에서 작동하지 않음 (0) | 2023.03.01 |
| 경우에 따라 어레이 또는 객체에 따라서는 JSON의 시리얼화를 해제한다. (0) | 2023.03.01 |
| 제품 유형에 따라 WooCommerce의 "ADD TO CART" 버튼 옆에 있는 커스텀 버튼 (0) | 2023.03.01 |