컨텍스트 : 사용자에게 주기적으로 (하루, 시간 또는 몇 분마다) 별표 된 저장소의 전체 목록을 검색하려고한다고 가정 해 봅시다.Github API 페이징을 사용한 조건부 요청
그렇게 적어도 두 방법이 있습니다
1) https://api.github.com/users/evereq/starred에 도착하고 다음 페이지의 URL을 얻을 '링크'응답 헤더에 = '다음'(우리가 확인해해야와 URL을 사용하여 실행까지 우리는 응답으로 "다음"페이지를 얻지 못한다. 결국 우리는 끝까지 도달한다.) Github의 권장 접근법 인 것 같습니다.
2) 결과에서 0 개의 결과가 나타날 때까지 https://api.github.com/users/evereq/starred?page=XXX까지 GET을 사용하여 'page'매개 변수를 반복합니다 (1에서 무한대로). 결과가 0 인 경우 완료됩니다 (예 : 페이지 번호 대신 Github이 "해시"값으로 이동할 수 있기 때문에 권장하지 않습니다 .Github은 일부 API 작업을 위해 이미 수행했습니다.).
이제 우리는 API 사용 한도 (및 트래픽, 세계의 나무 등)를 저장하기 위해 조건부 요청 (http://developer.github.com/v3/#conditional-requests 참조)을 사용하고자합니다.
예를 들어 'If-None-Match'를 요청 헤더에 추가하고 응답 상태가 304 (수정되지 않음)인지 확인하십시오. 그렇다면 마지막 요청에서 변경된 사항이 없음을 의미합니다. 괜찮아.
그러나 위의 1)과 2)에서 우리가 멈추는 시간을 감지하는 방법과 관련된 문제는 조건부 요청을 사용할 때 더 이상 작동하지 않습니다.
e.e. 접근법 1)을 사용하면 조건부 요청을 사용할 때 링크 응답 헤더를 전혀 얻지 못합니다. 그래서 ETag가 이미있는 페이지보다 큰 페이지로 하나 이상의 요청을 실행해야합니다. 그러면 결과가 0이고 완료되었다는 것을 알 수 있습니다. 그렇게하면 기본적으로 Github API에 대한 하나의 요청을 "낭비"합니다 (조건부 요청 헤더가 누락되어).
접근 방식 2)과 동일하게, 기본적으로 상태 304의 요청마다 0 개의 응답이 있습니다. 다시 말하면, 완료되었음을 알기 위해서는 적어도 하나의 추가 요청을 만들어 0 개의 결과를 반환해야합니다.
그래서 문제는 Github API가 (적어도 304 페이지의 결과 ETag를 사용하는 쿼리를 통해) 링크 응답 헤더를 돌려 보내지 않는 조건부 요청을 할 때 어떻게 페이징을 중지해야 하는지를 알 수 있습니까? Github API 구현의 버그입니까, 아니면 뭔가 빠졌습니까?
최대 페이지 번호를 알 수 없으므로 언제 멈추려면 "폐기물"요청을 하나 더 실행하고 0 개의 결과가 다시 나오는지 확인하십시오!
또한 Github에서 별표 리포지토리의 총 개수를 쿼리하는 방법을 찾을 수 없습니다. (응답을 통해 반복해야하는 페이지 수를 계산할 수 있습니다.) 응답에 "X-Total-Count" 그래서 페이지 수에 대한 간단한 수학 사용을 중단해야 할 때를 압니다.
그 하나 ('끝') 요청을 저장하고 조건부 요청을 사용하는 방법에 대한 아이디어가 있으십니까?
하루에 하나의 요청을하면 그 낭비를 받아 들일 수 있지만 분당 요청하면 어떻게해야합니까? 모든 API 사용 제한을 빠르게 사용할 수 있습니다!
UPDATE
음, (수 그러나 어디에서나 문서에 그것을 발견, 그래서 그 규칙 아니면 그냥 가정의 경우 반드시 유의하지 않음) 몇 가지 더 테스트 후, 지금 "규칙"은 다음을 참조하십시오 : 사용자 별 경우 새로운 것, 요청 된 모든 페이지에 대한 결과는 이전과 비교 된 다른 ETag 값을 포함하며 더 이상 상태 304를 갖지 않습니다! 즉, 첫 번째 페이지를 요청하고 상태를 확인하는 것으로 충분합니다. 304가 수정되지 않은 경우 다음 페이지를 확인할 필요가 없습니다. 즉, 페이지에서 변경된 사항이 없으므로 완료됩니다. 올바른 접근인가 아니면 우연의 일치인가?
페이지 크기를 1로 설정하면 전 세계의 일부 트리 (예 : 트래픽)를 절약 할 수 있지만 Google에서 Github API 사용 한도를 낭비하는 것은 조건부 요청에서 전혀 작동하지 않기 때문입니다. (어쨌든 감사합니다. 우리의 (그리고 Github) 트래픽을 최소화하기위한 아이디어 : D 그래서 질문은 아직 열려 있습니다 : Github이 조건부 요청이라 할지라도 링크 헤더를 반환 할 수없는 이유는 무엇입니까? 다음 페이지가 존재하며 처리해야하며 그렇지 않으면 끝내야합니다 (304의 경우에도 응답 헤더에 항상 LINK가 표시되지 않도록하는 기술적 인 제한이 있습니까?) – Evereq
예를 들어 귀하의 요지 - https://gist.github.com/pengwynn을 참조하십시오./6366324 # file-2-sh - 응답 헤더에 링크가 포함되어 있지 않습니다. (위의 요지에서 볼 수 있듯이 실제로는 575 페이지 (각 페이지에 1 개의 repo 포함)가 있습니다! 우리가 다음 페이지를 처리해야하는지 안다. 조건부 요청을 사용하면 중단해야합니다. – Evereq
나는 (사소한) 답변을 찾은 것 같아요. 어떻게 생각하니? – Evereq