2014-12-22 8 views
0
내가 여기에 바퀴를 다시 발명하지 않으려 고 노력하고

은 ... thereDavical 동기화 - 토큰 I CalDAV를 동기화 구현에 대한 몇 가지 좋은 문서를 발견했다</p> <p>웹 요청

의 웹 사이트에 따르면, DaviCal는 rfc6578입니다 0.9.8 이후로는 (here 참조). 다음과 같이

그래서 저는 먼저 동기화 토큰을 얻기 위해 내 요청을 보내

PROPFIND http://my_cal_srv/user/calendar_path HTTP/1.1 
Content-Type: application/xml; charset="utf-8" 
    <?xml version="1.0" encoding="utf-8" ?> 
     <d:propfind xmlns:d='DAV:'> 
     <d:prop> 
      <d:displayname /> 
      <d:sync-token /> 
     </d:prop> 
     </d:propfind> 

이 예상대로 데이터를 반환

<?xml version="1.0" encoding="utf-8" ?> 
<multistatus xmlns="DAV:"> 
<response> 
    <href>/caldav.php/user/calendar_path/</href> 
    <propstat> 
    <prop> 
    <displayname>My Calendar</displayname> 
    <sync-token>data:,9</sync-token> 
    </prop> 
    <status>HTTP/1.1 200 OK</status> 
    </propstat> 
</response> 
</multistatus> 
이 지금까지 너무 좋아, 내가,이 토큰의 한

을 " 데이터 :, 9 ". 그래서, 8시 이후에 변경을 시도해 봅시다. 어떤 이벤트를 추가하기 전에 서버에 질의를했을 때의 토큰입니다.

REPORT http://my_cal_srv/user/calendar_path HTTP/1.1 
Content-Type: application/xml; charset="utf-8" 
<?xml version="1.0" encoding="utf-8" ?> 
<d:sync-collection xmlns:d="DAV:"> 
    <d:sync-token>8</d:sync-token> 
    <d:sync-level>1</d:sync-level> 
    <d:prop> 
    <d:getetag/> 
    </d:prop> 
</d:sync-collection> 

대답은 :

<?xml version="1.0" encoding="utf-8" ?> 
<multistatus xmlns="DAV:"> 
<response> 
    <href>/caldav.php/user/cal_path/86166f9c-3e2e-4242-9a28-0f3bfb1dd67a-caldavsyncadapter.ics</href> 
    <status>HTTP/1.1 404 Not Found</status> 
</response> 
<response> 
    <href>/caldav.php/user/cal_path/cb354fab-b41d-49ad-8a4f-8d68c9090ea0.ics</href> 
    <propstat> 
    <prop> 
    <getetag>"334892703f4151024e9232eab9b515a7"</getetag> 
    </prop> 
    <status>HTTP/1.1 200 OK</status> 
    </propstat> 
</response> 
<sync-token>data:,10</sync-token> 
</multistatus> 
:

<?xml version="1.0" encoding="utf-8" ?> 
<multistatus xmlns="DAV:"> 
<response> 
    <href>/caldav.php/user/path/86166f9c-3e2e-4242-9a28-0f3bfb1dd67a-caldavsyncadapter.ics</href> 
    <propstat> 
    <prop> 
    <getetag>"5ed2101b0c867e490dbd71d40c7071bb"</getetag> 
    </prop> 
    <status>HTTP/1.1 200 OK</status> 
    </propstat> 
</response> 
<response> 
    <href>/caldav.php/user/path/cb354fab-b41d-49ad-8a4f-8d68c9090ea0.ics</href> 
    <propstat> 
    <prop> 
    <getetag>"334892703f4151024e9232eab9b515a7"</getetag> 
    </prop> 
    <status>HTTP/1.1 200 OK</status> 
    </propstat> 
</response> 
<sync-token>data:,9</sync-token> 
</multistatus> 

항목을 삭제 한 후, 나는 그 결과 다음과 같은 취득 (내가 동기화 토큰 (10) 얻을, 여전히 사용하여 비교 8 토큰)

그래서 나는이 결과를 해석하는 법을 알지 못하기 때문에 여기서 약간 혼란 스럽습니다 ...

아무도 말할 수 없습니다. 여기에서 동기화 정보를 추출하는 방법을 알고 계시나요? ICS 명명이 불분명하기 때문에 변경 유형을 알아내는 것은 조금 어렵습니다 ...

도와 주셔서 미리 감사드립니다 ... 그리고 즐거운 X-Mas! 감사합니다. N.

답변

1

"데이터 :, 9"는 실제로 "데이터 :, 8"또는 7 등을 쿼리 할 수 ​​있음을 의미하지 않습니다. 싱크 토큰은 불투명하며 버전 관리 시스템을 제공하지 않습니다 (DAV Versioning Extensions과 같은 sth이 필요합니다.).

DAV 동기화 토큰은 간단한 최적화 기술입니다. 클라이언트에 완전히 불투명하며 서버는 언제든지 동기화 토큰을 만료시킬 수 있습니다 (삭제 표시 등을 저장하지 않아도됩니다). 예를 들어 삭제 표시를 저장할 수없는 서버는 단순히 DELETE 요청에서 토큰을 만료시킬 수 있습니다.

당신이 동기화-토큰을 사용하는 방법은 다음과 같습니다

  1. 부모 모음의 하위 컬렉션 아이 수집
  2. 내 자원의 동기화를 최적화하기 위해
  3. 을 다시 동기화 할 필요가있는 알아 내기 위해 자식 컬렉션

    를 동기화 할 필요가

1)은 (달력의 컬렉션이 가정 예 my_cal_srv/사용자 /) 당신은 PROPFIND을 깊이 :이 컬렉션에서 1, 하위 컬렉션의 동기화 토큰을 묻습니다. 그것들이 클라이언트 캐시의 캐시와 더 이상 일치하지 않는다면, 그 자식 콜렉션들만의 동기화를 수행해야한다는 것을 알게됩니다.

참고 :이 요청에서 얻은 토큰을 사용하여 하위 컬렉션을 동기화하지 마십시오 (위에서 수행 한 작업). 이미 만료되었을 수 있습니다. 동기화 보고서에는 동기화 보고서에서받은 토큰 만 사용하십시오!

2) 다시 수집 내용

의 동기화를 최적화 : 동기화 - 토큰의는 최적화, 아무것도 더 있습니다. 유효한 sync-token 전제 조건 오류 (서버가 토큰을 만료했음을 의미)를 가져올 준비가되어 있어야하며 컬렉션 내용을 완전히 다시 가져와야합니다! 그런 다음 (URL, ETag)를 캐시 된 버전과 비교하여 변경 내용을 파악합니다. (기본적으로 동기화 보고서를 지원하지 않는 서버가있을 때 수행해야하는 모든 단계).

동기화 보고서 결과에서 동기화 토큰을 얻은 경우 다음 동기화 요청에서 사용할 수 있습니다. 서버에 여전히 상태가 있으면 변경 사항 만 제공합니다. 토큰이 만료되면 동기화 토큰 오류가 발생합니다.

참고 : 명확하지 않은 경우 - 첫 번째 동기화 요청에서 토큰을 제공 할 수 없습니다 (제공 할 수 없음). 토큰없이 쿼리를 실행하고 모든 내용을 다시 가져옵니다. 서버가 유효한 sync-token 오류를 보내면 다시 동일한 작업을 수행합니다.

+0

모두 잘 작동합니다. ** DaviCal **의 경우 토큰이 만료되면 서버는 자동으로 ** ALL ** 이벤트를 요청에 반환합니다. 임의의 키로 요청을 테스트했지만 오류 응답을 얻지는 못했지만 콘텐츠를 보면 항상 서버에있는 모든 이벤트를 반환합니다. – neggenbe

+0

DaviCal의 주요 버그. 토큰이 만료되었을 때 삭제 된 리소스를 클라이언트가 어떻게 파악할 수 있습니까? 클라이언트에게는 토큰이 정상적으로 보이고 결과가 변경 세트로 처리됩니다 (응답에 모든 것이 포함된다는 표시가 없음). – hnh

+0

좋은 지적 - 이에 대처하는 방법에 대한 제안? – neggenbe

1

올바른 요청을하지 않았습니다.

<d:sync-token>8</d:sync-token> 

을하지만이되어야합니다 : 귀하의 요청에 당신이 그에서 제외

<d:sync-token>data:,8</d:sync-token> 

, 당신이 얻고있는 첫 번째 응답은 당신에게 알려줍니다

These resources have been changed or newly created: 
/caldav.php/user/path/86166f9c-3e2e-4242-9a28-0f3bfb1dd67a-caldavsyncadapter.ics 
/caldav.php/user/path/cb354fab-b41d-49ad-8a4f-8d68c9090ea0.ics 

두 번째 응답은 말한다 너 :

This resource has been changed or newly created: 
/caldav.php/user/cal_path/cb354fab-b41d-49ad-8a4f-8d68c9090ea0.ics 

This resource has been deleted: 
/caldav.php/user/cal_path/86166f9c-3e2e-4242-9a28-0f3bfb1dd67a-caldavsyncadapter.ics 
+0

좋아, 다시 파고. 나는 상태 200 HTTP/1.1 200 OK 삭제 된 항목의 경우 내가 얻을 것이다 상태 (400) HTTP /를 얻을 수 있습니다 추가/업데이트 항목의 경우 : 그래서 상태 태그를 찾는 사람을 의미 1.1 404 찾을 수 없음 결과를 어떻게 해석합니까? – neggenbe

+0

예, 그렇습니다. 그것은 사양에 모두 있습니다. – Evert