2017-11-20 8 views
3

나는 클라이언트가받을 객체의 ID를 지정할 수있는 Spring을 API로 설정했다. 객체의 @ResponseBody 주석을 사용하여 JSON 목록을 반환합니다.안정된 API - 가져 오기, 붙여 넣기, 게시, 삭제가 얼마나 가까이 있어야합니까?

요청이 긴 목록 일 수 있으므로 POST로 설정했습니다. ProductRequest이라는 객체 (@RequestBody 주석 사용)로 수신되었습니다. 이것은 공식적인 REST API 표준을 따르지 않는 것으로 보입니다. 게시물은 새로운 객체를 만드는 데 공식적으로 사용되기 때문에 공식을 사용하기 때문에 공식을 사용하지 않아도 URL을 어수선하게 정리하지 않아도됩니다. 또한 출력을 사용자 지정하는 추가 매개 변수를 지정할 수 있습니다.

제 질문은 유효한 RESTful 디자인으로 간주 될 수 있습니까? 게시물은 객체를 만드는 데 사용되지 않으므로 안심할 수 없습니다. 생각?

+0

'공식 REST API 표준'은 무엇을 의미합니까? – jschnasse

+0

가능하면 자신의 HTTP 동사를 지정할 수 있습니다 (예 : 명부. 그러나 이것이 항상 최선의 선택은 아닙니다. [여기] (https://www.safaribooksonline.com/library/view/restful-web-services/9780596809140/ch01s12.html)에 대한 간단한 토론을 찾았습니다. – jschnasse

답변

1

간단한 GET 요청입니다.

@GetMapping(path = "/your-url") 
public List<Object> method(@RequestParam(name="ids") List<Long> objectIds) { 
} 

목록은 간단한 자바 목록으로 수신 할 수 있습니다.

/api?ids=1,2,3

+0

질문 : 귀하의 ID 목록이 수백 또는 수천 개의 12 - 자리 식별자? 오버플로가 URL 문자열에 허용되는 최대 값을 초과 할 수 없습니까? 나는 전에 이것에 빠져 들었다. 또한, 왜 그것을 게시물로 만드는 것은 나쁜 일입니까? 궁극적으로이게 바로 API가 작동하는 방식입니다. –

+1

그런 종류의 요청은 클라이언트 쪽에서도 페이지 매김되어야한다고 생각하고 한 요청에서 "고정 된"양 이상의 개체를 요청하지 마십시오. 하지만 가능하지 않다면 HTTP 메소드를 사용할 수 없다고 생각합니다. –

1

당신은 아주 잘 자원 (들) "수"에 HTTP POST를 할 수 있습니다. 그렇게하는 매우 유효한 예,

  1. GraphQL 있습니다 - 우리가하고있는 모든 전송됩니다 (게시) 우리가

  2. 을 선호하는 형식으로 일부 데이터를 "GET"으로 requestbody에서 일부 쿼리 특정 데이터를 얻기 위해 사용자 이름과 암호로 인증해야한다고 가정하면 GET 요청의 헤더에서 보내거나 POST를 수행하여 데이터를 가져옵니다.

+0

아시다시피,'query '매개 변수를 지정하여 선호하는 형식으로 데이터를 가져 오려면'GET' 메서드를 사용해야합니다. 우리가 리소스를 통해 수행 할 작업을 설정해야하는 경우 POST가 더 좋습니다. – Andrew

+0

@AndrewTobilko 주석 주셔서 감사합니다 ... 여러 리소스가 관련되어있을 때 여전히 "GET"작업이며 "부작용"이 없습니다. http 메소드는 POST입니다. –

1

하지 오버 플로우 URL 문자열에 대한 최대 허용을 수 있을까?

실제로 URI의 길이에는 제한이 없습니다. 그러나 실제적으로, 당신은 약간을 만날 수 있습니다. 2.5 절에 설명 RFC7230 (강조 내)에 기재된

,

HTTP는 요청 라인의 길이에 소정의 제한을 두지 않는다. 구현 된 것보다 긴 메소드를 수신 한 서버는 501 (Not Implemented) 상태 코드로 응답해야합니다 (SHOULD). 구문 분석하고자하는 URI보다 긴 요청 - 대상을받는 서버는 414 (URI Too Long) 상태 코드로 응답해야합니다.

실제로 요청 라인 길이에 대한 다양한 ad-hoc 제한이 있습니다. 모든 HTTP 보낸 사람과받는 사람이 최소한 8000 옥텟의 요청 줄 길이를 지원하는 것이 좋습니다.

우리가 문제를 처리하는 동안 요청 줄에 의존 할 수 없다는 것은 분명합니다.

유효한 RESTful 디자인으로 간주 될 수 있습니까?POST를 사용으로 인해 전술 한 제한에

, 유효한 해결이다.

this Wikipedia article 의해 명시된 바와

이러한 문제

일반적인 해결책은 요구 본체 파라미터 대신 GETPOST를 사용하여 저장하는 것이다. 요청 본문의 길이 제한은 일반적으로 URL 길이보다 훨씬 큽니다.

주저하지 않으려면 common non-standard headerX-Http-Method-Override입니다.

X-Http-Method-Override: GET 

나는 봄이 헤더를 처리 여부를 확실하지 않다 : 그것은 헤더에 주어진 메소드를 사용하여 요청에 지정된 메소드를 오버라이드 (override) 할 수있는 웹 응용 프로그램을 요청합니다. 비록 유사한 작업을 수행하는 것으로 보이는 필터가 HiddenHttpMethodFilter입니다.