source

JSON 기반 RESTful 코드의 예외를 처리하는 방법

bestscript 2023. 3. 1. 11:16

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 코드를 작성하기 위한 일관된 표준을 유지하는 방법에 대한 명확한 합의는 없지만, 이것은 내가 연습하는 것의 일부입니다(당신이 요청한 것 이상).

  1. 심플하게 - 휴식을 취하도록 노력하세요.커스텀 메서드로 인해 일이 빠르게 복잡해질 수 있습니다.
  2. 서버에서 네이티브 에러 코드를 반환하도록 하고 'scue_from'을 사용하여 캡처합니다.
  3. 또는 클라이언트 앱이 특별히 대상으로 삼을 수 있는 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