Сообщение Создание календаря по протоколу CALDAV на yandex mail.ru от 26.04.2022 3:31
Изменено 26.04.2022 7:17 Разраб
И еще вопрос
HttpWebRequest Request = (HttpWebRequest)HttpWebRequest.Create("https://caldav.yandex.ru/calendars/login@yandex.ru/events-cal1");
Request.Method = "MKCALENDAR";
Request.Credentials = new NetworkCredential("login", "password");
Request.ContentType = "application/xml";
Request.SendChunked = true;
Request.TransferEncoding = "utf-8";
byte[] encodedBody = Encoding.UTF8.GetBytes(body);
Request.ContentLength = encodedBody.Length;
using (Stream reqStream = Request.GetRequestStream())
{
reqStream.Write(encodedBody, 0, encodedBody.Length);
reqStream.Close();
}
var response = (HttpWebResponse)Request.GetResponse();
String responseString = string.Empty;
using (Stream stream = response.GetResponseStream())
{
StreamReader reader = new StreamReader(stream, Encoding.UTF8);
responseString = reader.ReadToEnd();
}Получаю: The remote server returned an error: (501) Not Implemented.
Что как бы намекает, что яндекс не позволяет создавать календари(но это не точно, т.к. инфы на сайте нет подробной).
Если же использовать современный подход:
using var client = new HttpClient();
var login = Convert.ToBase64String(Encoding.ASCII.GetBytes("login:password"));
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", login);
HttpRequestMessage message = new HttpRequestMessage(new HttpMethod("MKCALENDAR"), "https://caldav.yandex.ru/calendars/login@yandex.ru/events-cal1")
{
Content = new StringContent(data, Encoding.UTF8, "application/xml")
};
message.Headers.Authorization = new AuthenticationHeaderValue("Basic", login);
using var response = await client.SendAsync(message);
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync();получаю: Response status code does not indicate success: 500 (Server Error).
Где я ошибся?
Сам календарь формирую при помощи Ical.Net
Сами события нормально считываются обычным client.GetAsync.
за основу взял пример
UPDATE 1: OPTIONS запрос возвращает в том числе и MKCALENDAR
UPDATE 2: Нашел вот эту штуку https://github.com/ProximoSrl/CalDav. она создает календарь(видно в веб-интерфейсе),
но список "calendar-collection-set" методом "propfind" не выдает(ошибка BadRequest).
Внезапно! по get на адрес https://caldav.yandex.ru/calendars/login@yandex.ru/ получил урлы календарей!
UPDATE 3:
опытным путем выяснилось, что урл для создания календаря должен быть "https://caldav.yandex.ru/calendars/login@yandex.ru/me"
при этом нельзя в теле ничего отправлять, только метод, логин и запрос. в ответ пусто. ни айди, ничего.
при этом список вот такой календарей
можно конечно сортировать по events-./calendars/login%40yandex.ru/inbox/
/calendars/login%40yandex.ru/outbox/
/calendars/login%40yandex.ru/events-27127/
/calendars/login%40yandex.ru/events-8486495/
/calendars/login%40yandex.ru/events-8486446/
/calendars/login%40yandex.ru/events-8486467/
/calendars/login%40yandex.ru/events-8486476/
/calendars/login%40yandex.ru/events-8486479/
/calendars/login%40yandex.ru/events-8486741/
/calendars/login%40yandex.ru/events-8486744/
/calendars/login%40yandex.ru/events-8486874/
/calendars/login%40yandex.ru/events-8486886/
/calendars/login%40yandex.ru/events-8486956/
/calendars/login%40yandex.ru/todos-86503/
но только если обеспечить эксклюзивный доступ.
что странно, то ли яндекс такой неправильный.
И еще вопрос
HttpWebRequest Request = (HttpWebRequest)HttpWebRequest.Create("https://caldav.yandex.ru/calendars/login@yandex.ru/events-cal1");
Request.Method = "MKCALENDAR";
Request.Credentials = new NetworkCredential("login", "password");
Request.ContentType = "application/xml";
Request.SendChunked = true;
Request.TransferEncoding = "utf-8";
byte[] encodedBody = Encoding.UTF8.GetBytes(body);
Request.ContentLength = encodedBody.Length;
using (Stream reqStream = Request.GetRequestStream())
{
reqStream.Write(encodedBody, 0, encodedBody.Length);
reqStream.Close();
}
var response = (HttpWebResponse)Request.GetResponse();
String responseString = string.Empty;
using (Stream stream = response.GetResponseStream())
{
StreamReader reader = new StreamReader(stream, Encoding.UTF8);
responseString = reader.ReadToEnd();
}Получаю: The remote server returned an error: (501) Not Implemented.
Что как бы намекает, что яндекс не позволяет создавать календари(но это не точно, т.к. инфы на сайте нет подробной).
Если же использовать современный подход:
using var client = new HttpClient();
var login = Convert.ToBase64String(Encoding.ASCII.GetBytes("login:password"));
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", login);
HttpRequestMessage message = new HttpRequestMessage(new HttpMethod("MKCALENDAR"), "https://caldav.yandex.ru/calendars/login@yandex.ru/events-cal1")
{
Content = new StringContent(data, Encoding.UTF8, "application/xml")
};
message.Headers.Authorization = new AuthenticationHeaderValue("Basic", login);
using var response = await client.SendAsync(message); // UPDATE 4: заменил это на это using var response = await client.SendAsync(message, HttpCompletionOption.ResponseContentRead, CancellationToken.None);
// HttpCompletionOption.ResponseContentRead (!!!)
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync();получаю: Response status code does not indicate success: 500 (Server Error).
Где я ошибся?
Сам календарь формирую при помощи Ical.Net
Сами события нормально считываются обычным client.GetAsync.
за основу взял пример
UPDATE 1: OPTIONS запрос возвращает в том числе и MKCALENDAR
UPDATE 2: Нашел вот эту штуку https://github.com/ProximoSrl/CalDav. она создает календарь(видно в веб-интерфейсе),
но список "calendar-collection-set" методом "propfind" не выдает(ошибка BadRequest).
Внезапно! по get на адрес https://caldav.yandex.ru/calendars/login@yandex.ru/ получил урлы календарей!
UPDATE 3:
опытным путем выяснилось, что урл для создания календаря должен быть "https://caldav.yandex.ru/calendars/login@yandex.ru/me"
при этом нельзя в теле ничего отправлять, только метод, логин и запрос. в ответ пусто. ни айди, ничего.
при этом список вот такой календарей
можно конечно сортировать по events-./calendars/login%40yandex.ru/inbox/
/calendars/login%40yandex.ru/outbox/
/calendars/login%40yandex.ru/events-27127/
/calendars/login%40yandex.ru/events-8486495/
/calendars/login%40yandex.ru/events-8486446/
/calendars/login%40yandex.ru/events-8486467/
/calendars/login%40yandex.ru/events-8486476/
/calendars/login%40yandex.ru/events-8486479/
/calendars/login%40yandex.ru/events-8486741/
/calendars/login%40yandex.ru/events-8486744/
/calendars/login%40yandex.ru/events-8486874/
/calendars/login%40yandex.ru/events-8486886/
/calendars/login%40yandex.ru/events-8486956/
/calendars/login%40yandex.ru/todos-86503/
но только если обеспечить эксклюзивный доступ.
что странно, то ли яндекс такой неправильный.