MIcrosoft API получает описание события календаря и отображает его соответствующим образом

В моем проекте React я сделал вызов Axios для заполнения списка событий календаря, используя данные из календаря Microsoft Outlook (используя Microsoft API). В результате получается следующее: введите здесь описание изображения

Как вы можете видеть, только описание события вызывает у меня проблему. Действительно, чтобы показать описание события, он показывает мне строку HTML без подробностей события.

Я читал, что мне нужно указать в заголовке моего запроса Content-type:text, но я попытался, и это не сработало. Как я могу это решить? Это мой запрос Axios

getEvents(startDate, endDate, accessToken) {
    const startDateString = startDate.toISOString();
    const endDateString = endDate.toISOString();
    axios.get(
      `https://graph.microsoft.com/v1.0/users/${USER_PUBLIC_ID}/calendarview?startdatetime=${startDateString}&enddatetime=${endDateString}&orderby=start/dateTime`,
      {
        headers: {
          Authorization: `Bearer ${accessToken}`,
        },
      },
    ).then(response => this.setEvents(response.data.value))
      .catch((error) => {
        console.error(error.response);
      });
  }

person TheOldBlackbeard    schedule 25.01.2019    source источник
comment
здесь есть похожая тема, но я не знаю, как применить это решение с Axios: stackoverflow.com/questions/28436361/   -  person TheOldBlackbeard    schedule 25.01.2019


Ответы (2)


В этом случае необходимо указать заголовок Prefer: outlook.body-content-type="text".

Согласно документации:

Чтобы указать желаемый формат для возврата в свойствах Body и UniqueBody запроса GET, используйте заголовок Prefer: outlook.body-content-type:

  • Укажите Prefer: outlook.body-content-type="text", чтобы получить тело сообщения в текстовом формате.
  • Укажите Prefer: outlook.body-content-type="html" или просто пропустите заголовок, чтобы вернуть тело сообщения в формате HTML.

Пример

getEvents(startDate, endDate, accessToken) {
    const startDateString = startDate.toISOString();
    const endDateString = endDate.toISOString();
    return axios.get(
      `https://graph.microsoft.com/v1.0/users/${USER_PUBLIC_ID}/calendarview?startdatetime=${startDateString}&enddatetime=${endDateString}&orderby=start/dateTime`,
      {
        headers: {
          'Authorization': `Bearer ${accessToken}`,
          'Content-Type': 'application/json',
          'Prefer' : 'outlook.body-content-type="text"'
        }
      }
    );
}
person Vadim Gremyachev    schedule 25.01.2019
comment
Ответ в порядке, я имею в виду, что тип содержимого тела - это текст, как в спецификации заголовка ... но response.body.content - это пустая строка, если я действительно не пишу в заголовке «Предпочитаю»: «Outlook .body-content-type=text', действительно из пустой строки у меня есть: ‹html›‹head›‹meta name=Generator content=Microsoft Exchange Server› ↵‹!-- преобразовано из текста --› ↵‹style› ‹!-- .EmailQuote { margin-left: 1pt; отступ слева: 4pt; граница слева: #800000 2px сплошная; } --›‹/style›‹/head› ↵‹body› ↵‹font size=2›‹span style=font-size:11pt;›‹div class=PlainText›‹/div›‹/span›‹/ шрифт› ↵‹/тело - person TheOldBlackbeard; 28.01.2019
comment
Может быть, есть способ остановить автоматическое преобразование Microsoft Exchange в текст? И если да, я должен что-то установить на сервере или я могу что-то сделать и с кодом? - person TheOldBlackbeard; 28.01.2019
comment
Я обнаружил, что проблема была не в коде, а в настройке привилегий в Microsoft Outlook, так что теперь это работает! - person TheOldBlackbeard; 29.01.2019

Вам нужно предоставить axios объект конфигурации. В настоящее время вы используете свойство get, поэтому ваш код сейчас не работает:

axios({
url: `https://graph.microsoft.com/v1.0/users/${USER_PUBLIC_ID}/calendarview?startdatetime=${startDateString}&enddatetime=${endDateString}&orderby=start/dateTime`,
method: "GET",
        headers: {
          Authorization: `Bearer ${accessToken}`,
          "Content-type": "text"
        },
})

Вы можете прочитать больше здесь: https://github.com/axios/axios

person Gh05d    schedule 25.01.2019
comment
Я пытался, но ответ в формате JSON тот же: [![введите здесь описание изображения][1]][1] [1]: i.stack.imgur.com/evBxn.png Я думаю, что проблема в том, что тип содержимого тела находится в html, действительно должен быть текстом. В ссылке, которую я разместил в комментарии, один парень предлагает добавить › Prefer: outlook.body-content-type=text Но в моем случае с Axios я не понимаю, как мне применить это решение. - person TheOldBlackbeard; 25.01.2019
comment
Я отредактировал свой ответ и добавил собственный заголовок. Вы можете использовать этот синтаксис для добавления заголовков. Просто убедитесь в правильности написания и используйте кавычки для свойств с дефисами. - person Gh05d; 25.01.2019
comment
Я отредактировал свой файл, но он не работает :( в ответе все еще body: {contentType: html} - person TheOldBlackbeard; 25.01.2019
comment
Я отредактировал заголовок таким образом: code headers: { Authorization: Bearer ${accessToken}, Prefer: 'outlook.body-content-type="text"', }, и теперь в ответе json у меня есть contentType: text, но теперь описание в компоненте не имеет строки, как на изображении, которое я публикую в своем вопросе, но это пусто - person TheOldBlackbeard; 25.01.2019
comment
Попробуйте так: code headers: { Authorization: Bearer ${accessToken}, Prefer: "outlook.body-content-type": "text", } или так: code headers: { Authorization: Bearer ${accessToken}, Prefer: outlook: { "body-content-type": "text" } } - person Gh05d; 25.01.2019
comment
К сожалению результат тот же: я имею в виду, теперь добавление того Prefer и т.д. и т.п. работает, потому что в json ответе body.contenType if finally text, но это вроде как у события нет описания, но оно есть. Я пробую тот же запрос с Microsoft Graph Explorer с примером календаря, и он работает: файл Json в body.content имеет строку с описанием события ... Может быть, проблема в Microsoft Exchange Server? ИЛИ какое-то правило, которое нужно настроить? - person TheOldBlackbeard; 25.01.2019