403 CalDAV错误:valid-calendar-object-resource

时间:2016-01-13 02:42:06

标签: calendar http-status-code-403 caldav

我试图在iCloud日历中创建新事件。我收到 drawer = (DrawerLayout) findViewById(R.id.drawer_layout); final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); if(toolbar != null) { toggle = new ActionBarDrawerToggle( this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); toggle.syncState(); drawer.setDrawerListener(toggle); getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() { @Override public void onBackStackChanged() { if (getSupportFragmentManager().getBackStackEntryCount() > 0) { getSupportActionBar().setDisplayHomeAsUpEnabled(true); // show back button toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onBackPressed(); } }); } else { //show hamburger getSupportActionBar().setDisplayHomeAsUpEnabled(false); toggle.syncState(); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { drawer.openDrawer(GravityCompat.START); } }); } } }); 错误,根据spec说我的valid-calendar-object-resource请求未遇到Section 4.1 in the spec

但是,这是请求的主体,据我所知,它确实符合4.1中的所有要求:

PUT

iCalendar数据有什么问题,或错误是否在其他地方?

请求选项

使用request作为节点

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//sebbo.net//ical-generator//EN
BEGIN:VEVENT
UID:3xq8@the-calendar-api.herokuapp.com
SEQUENCE:0
DTSTAMP:20160113T023753Z
DTSTART:20160113T033753Z
DTEND:20160113T043753Z
SUMMARY:Example Event
DESCRIPTION:It works
END:VEVENT
END:VCALENDAR

回复:

{"auth":{"user":"feifan@me.com","pass":"XXX"},"headers":{"Content-Type":"text/calendar","Depth":"1","User-Agent":"DAVKit/4.0.1 (730); CalendarStore/4.0.1 (973); iCal/4.0.1 (1374); Mac OS X/10.6.2 (10C540)"},"method":"PUT","url":"https://p05-caldav.icloud.com/267369040/calendars/home/","body":"BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//sebbo.net//ical-generator//EN\r\nBEGIN:VEVENT\r\nUID:cc2x@the-calendar-api.herokuapp.com\r\nSEQUENCE:0\r\nDTSTAMP:20160114T061844Z\r\nDTSTART:20160114T071844Z\r\nDTEND:20160114T081844Z\r\nSUMMARY:Example Event\r\nDESCRIPTION:It works\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n"}

CURL尝试

<?xml version='1.0' encoding='UTF-8'?><error xmlns='DAV:'><valid-calendar-object-resource xmlns='urn:ietf:params:xml:ns:caldav'/></error>

CURL详细回复

curl -v -X PUT -H "Content-Type:text/calendar" -H "User-Agent:DAVKit/4.0.1 (730); CalendarStore/4.0.1 (973); iCal/4.0.1 (1374); Mac OS X/10.6.2 (10C540)" -u "feifan@me.com:XXXXX" --data-binary @- https://p05-caldav.icloud.com/267369040/calendars/home/  <<EOF
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//sebbo.net//ical-generator//EN
BEGIN:VEVENT
UID:3xq8@the-calendar-api.herokuapp.com
SEQUENCE:0
DTSTAMP:20160113T023753Z
DTSTART:20160113T033753Z
DTEND:20160113T043753Z
SUMMARY:Example Event
DESCRIPTION:It works
END:VEVENT
END:VCALENDAR
EOF

2 个答案:

答案 0 :(得分:1)

iCalendar数据本身似乎很好,因为它对我有用。我可以将您的活动上传到我的帐户,它会显示在我的日历中。

请确保

  1. 您在事件text/calendar时指定了正确的内容类型PUT
  2. 您正在撰写的集合实际上支持事件。 iCloud为VEVENTVTODO使用单独的集合。虽然,如果我尝试写入仅限VTODO的集合,我会重定向到主日历集合而不是错误。
  3. 更新

    对您的请求再提两条评论。

    1. 使用Depth请求发送PUT标题没有任何意义,您应将其删除,但不会导致错误
    2. 您的PUT被定向到日历集合网址,而不是集合的成员网址。大多数服务器都会马上拒绝它。 iCloud似乎接受了这个并且无论如何都创造了这个事件。但看起来你只能这样做一次。对日历集合URL的后续PUT请求将被拒绝,并显示412 Precondition Failed错误(即使UID不同),直到该事件被删除。

      你应该附加一个随机文件名。使用包含UID事件的<UID>.ics的内容是一种很好的做法,但您应该首先考虑删除@,因为有很多混淆何时或是否对其进行编码。

    3. 但是,我仍然无法重现此数据的问题。

      更新

      好的,现在我能够重现它。如上所述,问题是您没有在网址中指定文件名。

      再次尝试卷曲请求:

      curl -v -X PUT -H "Content-Type:text/calendar" -u "feifan@me.com:XXXXX" --data-binary @- https://p05-caldav.icloud.com/267369040/calendars/home/3xq8the-calendar-api.herokuapp.com.ics  <<EOF
      BEGIN:VCALENDAR
      VERSION:2.0
      PRODID:-//sebbo.net//ical-generator//EN
      BEGIN:VEVENT
      UID:3xq8@the-calendar-api.herokuapp.com
      SEQUENCE:0
      DTSTAMP:20160113T023753Z
      DTSTART:20160113T033753Z
      DTEND:20160113T043753Z
      SUMMARY:Example Event
      DESCRIPTION:It works
      END:VEVENT 
      END:VCALENDAR
      EOF
      

      请注意网址末尾的文件名。同样如@hnh所述,使用您自己的用户代理。不要让你的客户假装成别人。

答案 1 :(得分:0)

刚遇到同样的错误消息。对我来说,修复方法是切换到POST而不是PUT。当您创建新资源时,POST是适当的HTTP方法,而PUT则用于替换现有资源。改变方法解决了我的问题。

在上面的例子中,curl命令将按如下方式开始:

curl -v -X PUT ...