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 |