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에서 메타데이터를 전달하는 방법은 다음과 같습니다.
- HTTP 상태 코드
- 머리글
- 응답 본문
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
'programing' 카테고리의 다른 글
| 프로펠러 변경 시 Re-render React 구성 요소 (0) | 2023.03.07 | 
|---|---|
| componentWillReceiveProps가 아닌 라이프 사이클 메서드 getDerivedStateFromProps를 사용하는 방법 (0) | 2023.03.07 | 
| Angularjs 다이내믹 ng 패턴 검증 (0) | 2023.03.07 | 
| 서브도메인 대신 서브디렉토리를 사용하려면 어떻게 해야 하나요? (0) | 2023.03.07 | 
| WORDPRESS: cURL 오류 60: SSL 인증서 (0) | 2023.03.07 |