我试图在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
答案 0 :(得分:1)
iCalendar数据本身似乎很好,因为它对我有用。我可以将您的活动上传到我的帐户,它会显示在我的日历中。
请确保
text/calendar
时指定了正确的内容类型PUT
。VEVENT
和VTODO
使用单独的集合。虽然,如果我尝试写入仅限VTODO
的集合,我会重定向到主日历集合而不是错误。对您的请求再提两条评论。
Depth
请求发送PUT
标题没有任何意义,您应将其删除,但不会导致错误您的PUT
被定向到日历集合网址,而不是集合的成员网址。大多数服务器都会马上拒绝它。 iCloud似乎接受了这个并且无论如何都创造了这个事件。但看起来你只能这样做一次。对日历集合URL的后续PUT
请求将被拒绝,并显示412 Precondition Failed
错误(即使UID不同),直到该事件被删除。
你应该附加一个随机文件名。使用包含UID
事件的<UID>.ics
的内容是一种很好的做法,但您应该首先考虑删除@
,因为有很多混淆何时或是否对其进行编码。
但是,我仍然无法重现此数据的问题。
好的,现在我能够重现它。如上所述,问题是您没有在网址中指定文件名。
再次尝试卷曲请求:
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 ...