2013-02-15 2 views
10

API 호출 캐싱과 관련된 일반적인 질문이 있는데이 경우 Github API를 호출합니다.캐싱 Github API 호출

내 애플리케이션에 repo의 파일 이름과 README의 내용을 보여주는 페이지가 있다고 가정 해 보겠습니다. 즉,이를 검색하기 위해 몇 가지 API 호출을 수행해야합니다.

자, memcached와 같은 것을 추가하고 싶다고 가정 해 봅시다. 필요하지 않으면 계속해서 이러한 호출을 반복하지 않을 것입니다.

어떻게 평상시에 어떻습니까? Github에서 웹 훅을 활성화하지 않으면 캐시가 만료되는지 여부를 알 수 없습니다. HEAD의 현재 sha를 얻기 위해 항상 한 번 호출 할 수 있으며, 변경하지 않았다면 대신 캐시를 사용합니다. 하지만 이는 파일 수준이 아니라 레포 수준입니다.

나는 object-sha와 비슷한 것을 할 수 있다고 상상할 수 있지만 어쨌든 API를 호출해야 캐싱의 목적을 상실합니다.

어떨까요? prose.io와 같은 서비스가 지금은 캐싱이 없다는 것을 안다.하지만해야한다면, 접근 방법은 무엇인가?

고마워요.

답변

14

HTTP 캐싱을 사용하기에 충분합니까? HTTP 캐싱의 목적은 이미 새로운 응답이있는 경우 요청을하지 않는 방법을 제공하는 것이 아니라 서버가 완료 메시지를 보내지 않고 캐시에 이미있는 응답이 유효한지 신속히 확인할 수 있습니다. 신선한 경우 다시 응답).

GitHub API 응답을 보면 GitHub이 관련 HTTP 헤더 (ETag, Last-modified, Cache-control)를 올바르게 설정하고 있음을 알 수 있습니다.

그래서 GET을합니다. 를 위해 :

GET https://api.github.com/users/izuzak/repos 

이 반환

200 OK 
... 
ETag:"df739f00c5053d12ef3c625ad6b0fd08" 
Last-Modified:Thu, 14 Feb 2013 22:31:14 GMT 
... 

다음 시간 - 동일한 자원에 대한 GET을 수행 할뿐만 아니라, 실제로 조건부 GET 수 있도록 관련 HTTP 캐싱 헤더를 공급 :

GET https://api.github.com/users/izuzak/repos 
... 
If-Modified-Since:Thu, 14 Feb 2013 22:31:14 GMT 
If-None-Match:"df739f00c5053d12ef3c625ad6b0fd08" 
... 

보라 보라 - 서버가 304 수정되지 않음 응답을 반환하고 HTTP 클라이언트가 캐시에서 응답 끌어 :

304 Not Modified 

그래서 GitHub API는 HTTP 캐싱을 올바르게 수행하므로 사용해야합니다. 물론 HTTP 캐싱을 지원하는 HTTP 클라이언트를 사용해야합니다. 가장 좋은 점은 수정되지 않은 304 응답을 받으면 GitHub이 남아있는 API 호출 할당량을 줄이지 않는다는 것입니다. 참조 : http://developer.github.com/v3/#conditional-requests

GitHub API도 Cache-Control: private, max-age=60 헤더를 설정하므로 60 초의 신선도를 갖습니다. 즉, 60 초 미만의 동일한 리소스에 대한 요청은 서버에도 적용되지 않습니다.

repo에서 변경된 사항 (예 : HEAD가 표시된 리소스)이 확실하게 변경되는 리소스에 단일 조건부 GET 요청을 사용하는 것에 대한 귀하의 추론은 합리적으로 들립니다. 왜냐하면 해당 리소스가 변경되지 않은 경우, 개별 파일을 확실하게 변경하지 않았으므로 개별 파일을 확인할 필요가 없습니다.

+0

감사합니다. Ivan. 이것은 위대합니다. HTTP 캐시를 사용한다는 것은 memcached의 캐시에 내 자신의 중간 계층 API 경로가 필요 없다는 것을 의미합니다. 이 방법으로 클라이언트에서 CORS를 통해 직접 이동할 수 있습니다 (필요하다면 로컬 저장소를 사용했을 수도 있음). – Ronze

+0

github의 모든 끝점이'Last-Modified' 헤더를 반환하지 않을 수도 있습니까? 예를 들어, milestones 끝점에 대한 호출이'Last-Modified' 헤더를 반환하지 않습니다. curl -i https://api.github.com/repos/p1nox/repos/milestones 하지만 'ETag' 그래서 이런 종류의 자원을 캐쉬 할 수있는 유일한 방법은 콤비네이션 토큰 -에 타그를 사용하는 것입니다. – p1nox

+0

@ p1nox 예, 가능합니다. 이 https://developer.github.com/v3/#conditional-requests를 읽으면이 부분을 알게 될 것입니다 : "대부분의 응답은 ETag 헤더를 반환하며, 많은 응답은 Last-Modified 헤더를 반환합니다." "all"이 아니라 "most"및 "many"라고 표시됩니다. –