2017-02-14 13 views
2

Я пытаюсь использовать API Fetch для обработки POST данных XML, чтобы избежать проблем с перекрестным происхождением с помощью XmlHttpRequest. Проблема, с которой я сталкиваюсь, заключается в том, что, несмотря на то, что мой Content-Type имеет значение «text/xml» (который является единственным поддерживаемым заголовком содержимого в этом случае), тип содержимого моего запроса сбрасывается в text/plain, что приводит к статусу HTTP 415 из запрошенного контента.Использование Fetch API для POST XML

Вот моя выборка функции:

function doFetch(Content) 
    { 
     return fetch(
     URL, { method: 'POST', 
      mode: 'no-cors', 
      headers: new Headers(
      {'Content-Type': 'text/xml; charset=utf-8', 
      'Accept': '*/*', 
      'Accept-Language': 'en-GB', 
      'Accept-Encoding': 'gzip, deflate', 
      'Connection': 'Keep-alive', 
      'Content-Length': Content.length     
      }), 
      body: Content 
      }); 
    } 

Содержимое представляет собой строку данных XML.

И это заголовок, который фактически используется:

Content-Length:1537 
    content-type:text/plain;charset=UTF-8 

Просто интересно, если то, что я пытаюсь сделать, это возможно, и если это то, что я делаю неправильно? (Я как бы новичок в веб-разработке).

Спасибо!

ответ

2

Поскольку вы задаете mode: 'no-cors' (почему? ...) для запроса, браузеры не позволят вам устанавливать любые заголовки запросов, кроме CORS-safelisted request-headers. См the spec requirements:

... если охранник "request-no-cors" и имя/значение не CORS-safelisted request-header, возвращение.

Установка Content-Type: text/xml; charset=utf-8 делает его более не относящимся к CORS заголовком запроса; Content-Type является только заголовком запроса CORS-safelisted, если его значение равно application/x-www-form-urlencoded, multipart/form-data, или text/plain.

Таким образом, начало решения заключается в том, чтобы не использовать mode: 'no-cors'.

Единственный случай, когда обычно имеет смысл установить mode: 'no-cors', если вы используете сервис-работников для кеширования ответов, потому что для запроса mode: 'no-cors' браузеры не позволят вашему скрипту получить доступ к каким-либо свойствам ответа, поэтому единственное полезная вещь, которую вы можете сделать с ней, - это кеш.

Я пытаюсь использовать API Fetch для обработки POST данных XML, чтобы избежать проблем с перекрестным происхождением с помощью XmlHttpRequest.

Выборка API следует той же кросс-модель происхождения запроса как XHR, так что неясно, какие общие вопросы происхождения вы будете пытаться избежать с помощью Fetch API ...

+0

Ах спасибо. Вот почему это меняется! Проблема с перекрестным происхождением заключается в том, что ресурс, к которому я пытаюсь получить доступ, не имеет никакого способа обработки запроса OPTIONS. По какой-то причине использование Internet Explorer 11 и более ранних версий позволяет мне отправлять и получать без проблем, но любой «современный» браузер Edge, Chrome и т. Д. Дает мне HTTP 404 ответ из-за проблемы CORS. – Krisisonfire