【问题标题】:CalDAV client's Report method not requesting for the new event dataCalDAV 客户端的报告方法不请求新的事件数据
【发布时间】:2015-12-17 20:15:00
【问题描述】:

我目前正在为我的日历应用程序开发 caldav 同步服务器层。我能够回答日历客户端请求的所有初始请求,并且目前坚持使用 REPORT 方法。

在日历上完成 PROPFIND 时,它会要求提供 CTag 和 Sync-Token。我确实通过提供 CTag 和 Sync-Token 来回答这个查询(目前为了模拟服务器,我动态生成这些值并为客户端提供服务)。

在接下来的查询中,请求的方法是日历上的REPORT,如下所示:

来自客户的请求:

REPORT URI  /users/admin%40a.de/calendar/ PROTOCOL HTTP/1.1
----------------------------------------
Accept-encoding  gzip, deflate
Accept  */*
Connection  keep-alive
Prefer  return=minimal
Host  **************
Brief  t
User-agent  Mac+OS+X/10.10.5 (14F27) CalendarAgent/316.1
Depth  1
Authorization  Basic YWRtaW5AYS5kZTpwYXNz
Accept-language  en-us
Content-type  text/xml
Content-length  260
Request body: <?xml version="1.0" encoding="UTF-8"?>
<A:sync-collection xmlns:A="DAV:">
  <A:sync-token>http://calserver.org/ns/sync-token/1</A:sync-token>
  <A:sync-level>1</A:sync-level>
  <A:prop>
    <A:getcontenttype/>
    <A:getetag/>
  </A:prop>
</A:sync-collection>

来自服务器的响应:

响应标头

Content-type: text/calendar;  charset=UTF-8
Connection:   keep-alive
Date  Thu, 17 Dec 2015 19:35:40 GMT
Transfer-encoding  chunked
Http/1.1  207 Multi-Status

响应正文

<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<D:multistatus xmlns:D=\"DAV:\" xmlns:C=\"urn:ietf:params:xml:ns:caldav\" xmlns:E=\"urn:ietf:params:xml:ns:carddav\">
<D:response>
 <D:propstat>
  <D:href>/calendar/2601ddd19c1001.ics</D:href>
  <D:prop>
         <D:getcontenttype>text/calendar</D:getcontenttype>
         <D:getetag>"334411222s12"</D:getetag>
  </D:prop>
  <D:status>HTTP/1.1 200 OK</D:status>
 </D:propstat>
</D:response>
</D:multistatus>

现在我的问题是,在服务器响应中,我通过提供新的 ETag 值来回答 REPORT 方法已创建新事件,但客户端未请求数据??

我应该如何以及何时提供新活动的日历数据以及客户的请求是什么???

【问题讨论】:

    标签: http webdav caldav


    【解决方案1】:
    • 内容类型不应为text/xml,应为text/calendar
    • etag 需要用双引号括起来。
    • 我很确定在 uri 中使用 + 是个坏主意。如果您想对空格进行编码,请改用%20,但最好完全避免任何类型的特殊编码。
    • 对同步收集报告的响应还必须在响应正文中包含当前同步​​令牌。见https://www.rfc-editor.org/rfc/rfc6578#section-6.4

    【讨论】:

    • 感谢您的回复。是的,我将内容类型更改为 icalendar 并将 etag 括在双引号中。但没有运气!加号“+”不在 etag 中,只是动态获取新值以附加 etag 值的代码的一部分(用于测试目的)。
    • 从问题中删除了加号以避免歧义。
    • 嗨,对不起,我错了。内容类型应该是text/calendar 而不是text/icalendar,我也在我的答案中添加了另一个要点。
    • 谢谢。是的,更新内容类型并添加当前同步令牌值。但仍然没有问下一个问题“日历数据”。
    • @Hoysala 请注意,HTTP 响应本身的内容类型应该是 application/xml(也可以接受 text/xml),而 D:getcontenttype 值应该是“text/calendar”,如 Evert已经指出。
    【解决方案2】:

    对多次编辑感到困惑,但响应中的内容类型 header 绝对应该是 text/xml

    内容类型:文本/xml; charset=UTF-8

    【讨论】:

      猜你喜欢
      • 2016-10-29
      • 1970-01-01
      • 1970-01-01
      • 2010-09-12
      • 2018-08-23
      • 1970-01-01
      • 2012-08-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多