REST API 디자인 : API에 대한 다중 호출 및 단일 호출


19

모바일 앱에서 사용할 전자 상거래 웹 사이트 용 Rest API를 개발 중입니다.

앱의 홈 페이지에서 Slider, Top Brands, Best Selling Products, Trending Products 등과 같은 여러 리소스를 호출해야합니다.

API 호출을위한 두 가지 옵션 :

단일 통화 :

www.example.com/api/GetAllInHome

여러 통화 :

www.example.com/api/GetSliders

www.example.com/api/GetTopBrands

www.example.com/api/GetBestSellingProducts

www.example.com/api/GetTrendingProducts

휴식 API 디자인에 대한 가장 좋은 방법은 무엇입니까-단일 또는 다중 호출, 장단점을 설명합니까?

요청에 응답하는 데 시간이 더 걸리는 것은 어느 것입니까?

답변:


14

이론 다중 동시 통화가보다 유연하고 단지 빠른 같다.

그러나 실제로 페이지를로드 한 다음 해당 페이지의 각 부분을로드하면 결과를 다시 얻을 때까지 페이지 전체에 로딩 스피너가 표시되어 결과가 느리고 분리됩니다.

이러한 이유로 데이터에 대한 AJAX 요청은 페이지의 섹션이 느리게로드되거나 페이지의 나머지 부분과 다른 주기로 새로 고쳐야하는 경우에만 드물게 사용해야합니다. 마스터에서 옵션을 선택하고 마스터를 다시로드하지 않고 해당 세부 사항을 표시하려는 마스터 / 세부 정보 표시를 말합니다.

일반적인 설계는 코딩 유연성과 마이크로 서비스 문제를 위해 별도의 API를 유지하지만 웹 사이트에서 데이터 서버 측을 결합하는 것입니다. 클라이언트가 자신의 웹 사이트를 한 번만 호출하면됩니다. 적절한 캐싱을 사용한 API 호출은 데이터 센터 내에서 빨라야합니다.

또한 클라이언트 API 호출이 전혀없는 것을 고려하십시오. HTML 서버 측을 생성하기 만하면됩니다. 자바 스크립트 단일 페이지 앱 프레임 워크는 API 경로를 아래로 밀어냅니다. 일반적으로 대량의 전자 상거래 사이트에는 최적의 방법이 아닙니다.

여기에 이미지 설명을 입력하십시오


고마워, 실제로이 API는 안드로이드 및 i 전화 앱에서 소비됩니다. 슬라이더, 브랜드, 단일 api 호출의 제품 또는 개별 리소스에 대한 api에 대한 개별 호출을 할 때 앱 홈 페이지가로드되는시기를 알고 싶습니다. 사용자가 아래로 스크롤합니까?
shaijut

동일한 논리가 적용되어 필요하지 않은 경우 동시 통화를 최소화합니다. 앱은 백그라운드에서 정보를 다운로드 할 수있는 유연성을 제공합니다. GetChangesSInce (date) 접근 방식으로 전환하고 싶을 수도 있습니다
Ewan

따라서 앱의 홈페이지가로드 될 때 모든 홈페이지 리소스 응답을 한 번에 호출하고 페이지의 섹션을 업데이트 할 때 마이크로 서비스에 대해 슬라이더, 브랜드 등이 서로 다르게 API를 갖는 단일 API를 사용하는 것이 가장 좋습니다. ?
shaijut

해당 섹션에 페이지 / 메인 데이터 만로드 된 이유가없는 한
Ewan

Amazon, flipkart와 같은 앱이 어떻게 작동합니까? 사용자가 앱을 열 때 한 번의 호출로 모든 홈페이지 리소스를로드하지 않습니까? 나는 이것에 가장 좋은 접근법이 무엇인지 알고 싶다.
shaijut

5

TL; DR : 다른 모든 응용 프로그램 고려 사항을 제외하고 단일 호출을 수행하면 여러 호출을 수행하는 것보다 빠릅니다. 비동기식으로 호출을 실행하면 사용자 관점에서 주어진 작업을 완료하는 데 필요한 전체 시간이 단축 될 수 있지만 (필요한 것일 수도 있음) 전체적으로 여러 호출에 걸리는 시간이 더 길어질 수 있습니다.

그러나 귀하의 경우, 그것이 전체 이야기인지 확실하지 않습니다.

REST API는 아이디어를 대중화시킨 논문에 대한 다양한 해석으로 인해 약간 모호한 용어입니다. 그러나 REST API를 구성하는 요소에 대한 가장 자유로운 해석조차도 실제로 맞지 않는 것입니다.

핵심 원칙은 작업을 수행 할 리소스가 있다는 것입니다. URI는 관심있는 리소스를 식별하며 일반적으로 HTTP 동사를 사용하여 해당 리소스에 대해 수행 할 작업을 나타냅니다.

특정한 경우, 모든 메소드의 이름에 'get'이라는 단어가 있습니다. HTTP 요청에 사용 된 동사를 변경하여 해당 위치에서 사용 가능한 자원을 '얻고 싶다'고 표시해야합니다.

URI 체계는 API 사용자에게 제공하려는 리소스의 논리적 계층 구조를 나타내야하므로 귀하의 경우 /api/products?category=sliders제품 모음을 필터링 하는 것과 같은 것을 사용하는 것이 좋습니다. 이는 고객이 모든 제품을 원할 때 쿼리 문자열을 생략 할 수 있음을 의미합니다.


고마워, 그래서 당신은 urlAPI에 대한 단일 을 의미 하지만 쿼리 문자열을 사용하여 다른 리소스에 대한 요청을해야합니까? 이것도 확인 하십시오 .
shaijut

예, 비동기 적으로 호출을 실행하면 데이터를 가져 오는 데 필요한 절대 시간이 줄어들지 만 전체적으로 걸리는 시간은 여전히 ​​큽니다. 더 많은 호출은 TCP 연결의 오버 헤드와 통신 왕복을 반복해야합니다. 같은 기능을 사용하더라도 keep-alive이것을 완전히 제거하지는 않습니다.
richzilla

범주는 개별 제품 리소스의 속성입니다. 논리적으로 당신은 제품 모음을 가져오고 지정된 범주를 가진 모든 것을 걸러
낼 것입니다

따라서 사용자가 앱의 홈 페이지를 열면 한 번의 호출이 위에서 언급 한 모든 리소스를 반환하는 API로 이동해야합니까? 또는 스크롤을 수행 할 때 특정 자원에 대해 개별 호출을 수행해야합니다.
shaijut

응용 프로그램의 각 지점에서 사용자가 기대하는 것에 따라 다릅니다. 예를 들어,이 웹 사이트를 클릭 questions하면 URI가 표시되고 /questions즐겨 찾는 태그 중 하나를 클릭하면 URI가 표시됩니다/questions/tagged/<tagname>
richzilla
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.