programing

RESTful JSON 응답에 메타데이터를 추가하는 모범 사례는 무엇입니까?

lastmemo 2023. 3. 7. 21:01
반응형

RESTful JSON 응답에 메타데이터를 추가하는 모범 사례는 무엇입니까?

배경

데이터 오브젝트를 JSON으로 반환하는 Restful API를 구축하고 있습니다.대부분의 경우 데이터 객체를 반환하는 것만으로 문제가 없지만, 페이지 번호 지정이나 검증 등 일부 메타데이터를 응답에 추가해야 하는 경우도 있습니다.

지금까지의 정보

모든 json 응답을 다음과 같이 정리했습니다.

{
    "metadata" :{
        "status": 200|500,
        "msg": "Some message here",
        "next": "http://api.domain.com/users/10/20"
        ...
    },
    "data" :{
        "id": 1001,
        "name": "Bob"
    }
}

장점

  • 응답에 유용한 메타데이터를 추가할 수 있습니다.

단점

  • 대부분의 경우 메타데이터 필드는 필요하지 않으며 json 형식이 복잡해집니다.
  • 데이터 객체가 아니라 포함된 응답에 가깝기 때문에 데이터 객체를 추출하지 않고는 f.ex backbone.js에서 바로 응답을 사용할 수 없습니다.

질문.

json 응답에 메타데이터를 추가하는 모범 사례는 무엇입니까?

갱신하다

아래 답변과는 거리가 먼 내용:

  • 를제 remove remove remove를 remove remove 를 remove 。metadata.status는 http 200, 500..." 입니다.http http 를 사용합니다.
  • http 500 응답 본문에 오류 메시지 추가
  • 페이지 매김을 위해 페이지 매김 구조와 그 구조에 중첩된 데이터에 대해 알려주는 메타데이터가 있는 것은 당연합니다.
  • 소량의 메타데이터를 http 헤더에 추가할 수 있습니다(X-something).

RESTful API에서 메타데이터를 전달하는 방법은 다음과 같습니다.

  1. HTTP 상태 코드
  2. 머리글
  3. 응답 본문

metadata.status에는 Http Status Code를 사용합니다.그것이 목적입니다.메타데이터가 응답 전체를 참조하는 경우 헤더 필드로 추가할 수 있습니다.메타데이터가 응답의 일부만을 참조하는 경우 메타데이터를 개체의 일부로 포함해야 합니다.응답 전체를 인위적인 봉투에 싸서 데이터 및 메타데이터로 분할하지 마십시오.

마지막으로 API 전체에서 일관된 선택을 해야 합니다.

좋은 예로는 페이지 번호부여가 있는 컬렉션 전체의 GET이 있습니다.GET /items 컬렉션 크기와 커스텀헤더의 현재 페이지를 반환할 수 있습니다.표준 링크 헤더 페이지 번호 링크:

Link: <https://api.mydomain.com/v1/items?limit=25&offset=25>; rel=next

이 접근법의 문제는 응답의 특정 요소를 참조하는 메타데이터를 추가해야 하는 경우입니다.이 경우 오브젝트 자체에 삽입하기만 하면 됩니다.일관된 접근 방식을 위해 항상 모든 메타데이터를 응답에 추가합니다.GET / items로 돌아가서 각 항목이 메타데이터를 만들고 업데이트했다고 가정해 보십시오.

{
  items:[
    {
      "id":"w67e87898dnkwu4752igd",
      "message" : "some content",
      "_created": "2014-02-14T10:07:39.574Z",
      "_updated": "2014-02-14T10:07:39.574Z"
    },
    ......
    {
      "id":"asjdfiu3748hiuqdh",
      "message" : "some other content",
      "_created": "2014-02-14T10:07:39.574Z",
      "_updated": "2014-02-14T10:07:39.574Z"
    }
  ],
  "_total" :133,
  "_links" :[
     {
        "next" :{
           href : "https://api.mydomain.com/v1/items?limit=25&offset=25"
         } 
   ]
}

수집 응답은 특수한 경우입니다.컬렉션에 메타데이터를 추가하는 경우 컬렉션을 더 이상 어레이로 반환할 수 없으므로 어레이가 포함된 개체여야 합니다.왜 물건일까요?메타데이터 Atribute를 추가할 필요가 있습니다.

개별 항목의 메타데이터와 비교합니다.엔티티를 감싸는 것과 비슷한 것은 없습니다.리소스에 몇 가지 특성만 추가하면 됩니다.

하나의 규칙은 제어 필드 또는 메타데이터 필드를 구별하는 것입니다.이러한 필드에는 밑줄을 붙일 수 있습니다.

@응답 , @Charlie는 과 같이 .status ★★★★★★★★★★★★★★★★★」message은, 「Attribut」로 에, 장황합니다.HTTP 자체 "상태")200 발견, - 모델 발견,404찾을 수 . - 모델을 찾을 수 없습니다.403- 충분한 권한이 없기 때문에 알 수 있습니다.(스펙 참조).서버에서 에러 상태가 반환된 경우에도message대응 기구의 역할을 담당합니다.이 두 필드는 메타데이터 요구의 대부분을 커버합니다.

보다 「 「 」 「 」 「 」 )에 커스텀 .X-prefix라고 하는 것이 만, 이지 않게 되는 는 꽤 것 .prefix)라고 하는 것은, 「Prefix」라고 하는 것입니다.

범위가 작은 질문에서 조금 더 자세히 설명했지만, 이 질문에는 아직 포인트가 유효하다고 생각합니다.

이 페이지 https://www.odata.org/를 읽어보시길 권합니다.ODATA를 강제로 사용할 필요는 없지만, 작업 방식은 REST의 모범 사례입니다.

JSON 응답에 페이지화 메타데이터를 추가해야 했던 것과 동일한 사용 사례가 있었습니다.이 데이터를 처리할 수 있는 컬렉션 타입을 Backbone에 작성하고, 경량 래퍼도 Rails 측에 작성했습니다.이 예에서는 뷰에서 참조할 수 있도록 메타 데이터를 컬렉션 개체에 추가합니다.

그래서 우리는 Backbone Collection 클래스를 만들었습니다.

// Example response:
// { num_pages: 4, limit_value: 25, current_page: 1, total_count: 97
//   records: [{...}, {...}] }

PageableCollection = Backbone.Collection.extend({
  parse: function(resp, xhr)  {
    this.numPages = resp.num_pages;
    this.limitValue = resp.limit_value;
    this.currentPage = resp.current_page;
    this.totalCount = resp.total_count;
    return resp.records;
  }  
});

그리고 이 심플 클래스를 Rails 쪽에 만들어 Kaminari와 페이지 연결 시 메타 데이터를 내보냅니다.

class PageableCollection
  def initialize (collection)
    @collection = collection
  end
  def as_json(opts = {})
    {
      :num_pages => @collection.num_pages 
      :limit_value => @collection.limit_value 
      :current_page => @collection.current_page,
      :total_count => @collection.total_count
      :records => @collection.to_a.as_json(opts)
    }
  end
end

이런 컨트롤러에서 사용합니다.

class ThingsController < ApplicationController
  def index 
    @things = Thing.all.page params[:page]
    render :json => PageableCollection.new(@things)
  end
end

즐기세요 유용하시길 바랍니다

return과 같이 데이터에서 원하는 개체를 직접 반환하는 것은 어떻습니까?

{
    "id": 1001,
    "name": "Bob"
}

헤더에 메타데이터를 반환합니다.

옵션 1(모든 메타데이터 JSON에 대해 하나의 헤더):

X-METADATA = '{"status": 200|500,"msg": "Some message here","next": "http://api.domain.com/users/10/20"...}'

옵션 2(메타데이터 필드마다 1개의 헤더):

X-METADATA-STATUS = 200|500
X-METADATA-MSG = "Some message here",
X-METADATA-NEXT = "http://api.domain.com/users/10/20"
...

지금까지는 데이터용과 메타데이터용 두 개의 필드가 있는 복잡한 JSON을 사용하고 있었습니다.하지만 제가 제안한 방법으로 시작하는 것이 더 쉬울 것 같습니다.


일부 서버에는 HTTP 헤더에 대한 크기 제한이 있음을 주의해 주십시오.예를 들어, https://www.tutorialspoint.com/What-is-the-maximum-size-of-HTTP-header-values

언급URL : https://stackoverflow.com/questions/8294265/what-are-the-best-practices-to-add-metadata-to-a-restful-json-response

반응형