2016-10-20 3 views
1

У меня странная проблема, которая, как я надеюсь, имеет чрезвычайно простое решение. Я пытаюсь отправить запрос POST на сервер. Я пробовал это с помощью fetch и без использования XMLHttpRequest. Мой запрос XHR выглядит следующим образом:XHR POST Не удается отправить учетные данные и заголовок

var xhr = new XMLHttpRequest(); 
xhr.open("POST", location); 
xhr.withCredentials = true; 
xhr.setRequestHeader('Content-Type', 'application/json'); 
xhr.send(JSON.stringify(obj)); 

Моя выборка запрос выглядит следующим образом:

fetch(location, { 
     credentials: 'include', 
     method: 'post', 
     body: JSON.stringify({obj}), 
     headers: { 
     'Content-Type': 'application/json' 
    }) 
    .then((response) => { 
     if (response.ok){ 
     response = response.json(); 
     } else { 
     response = {}; 
     } 
     window.console.debug(response); 
    }) 
    .then((json) =>{ 
     window.console.debug(json); 
    }) 
    .catch((error) => { 
     window.console.debug(error); 
    }); 

Оба они имеют один и тот же результат. Если бы я оставил его, как и выше, полномочия не отправляют, так он посылает OPTIONS просить, и я получаю 401. My Chrome Network вкладка Заголовки запросов для сообщения выглядит следующим образом:

Accept:*/* 
Accept-Encoding:gzip, deflate, sdch 
Accept-Language:en-US,en;q=0.8 
Access-Control-Request-Headers:content-type 
Access-Control-Request-Method:POST 
Connection:keep-alive 
Host:192.168.146.101:8005 
Origin:http://localhost:8555 
Referer:http://localhost:8555/ 
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36 

Если я удалить строки заголовка, тип содержимого неправильного типа (очевидно), и поэтому я получаю вкладку сети Запрос заголовки сообщений 415. хрома выглядит следующим образом:

Accept:*/* 
Accept-Encoding:gzip, deflate 
Accept-Language:en-US,en;q=0.8 
Authorization:Basic YWRtaW46YWRtaW4= 
Connection:keep-alive 
Content-Length:504 
Content-Type:text/plain;charset=UTF-8 
Host:192.168.146.101:8005 
Origin:http://localhost:8555 
Referer:http://localhost:8555/ 
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36 

По какой-то причине, когда я добавить заголовок, это списывает учетные данные. Я пытался посылать закодированный пользователя: передать в заголовке, так как это (но, очевидно, с реальным именем пользователя/пароль):

var xhr = new XMLHttpRequest(); 
xhr.open("POST", location); 
xhr.withCredentials = true; 
xhr.setRequestHeader('Content-Type', 'application/json'); 
xhr.setRequestHeader('Authorization', 'Basic ' + window.btoa('user:pass'); 
xhr.send(JSON.stringify(obj)); 

Это происходит во всех браузерах. Спасибо за любую помощь!

+0

Я предполагаю, что мой вопрос действительно такой: как изменить тип содержимого, не отображая его под заголовками Access-Control-Request-Headers, а вместо этого просто появляется, где отображается Content-Type по умолчанию? Плагин Postman способен каким-то образом заставить его отображаться таким образом, и это, похоже, единственное решение этой проблемы. – Bruce

ответ

0

В withCredentials только атрибут объявления указывает, является ли запрос межсайтовое Access-Control должны быть сделаны с использованием учетных данных, я не уверен, если это то, что вы ищете https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/withCredentials

пытались ли вы это?

var xhr = new XMLHttpRequest(); 
xhr.open("POST", location); 
xhr.setRequestHeader('Content-Type', 'application/json'); 
xhr.setRequestHeader('Authorization', 'Basic ' + btoa(user+':'+pass); 
xhr.send(JSON.stringify(obj)); 
+0

В моем оригинальном посте я сказал, что попробовал то, что вы заявили, и это не сработает. Мне кажется, что theCredentials действительно должны использовать ваши файлы cookie. – Bruce

+0

Кроме того, если вы правильно говорите, учетные данные не будут работать БЕЗ типа содержимого, но они это делают. – Bruce

+0

, вы сказали, используя оба с заголовкамиCredentials и Authorization, код кажется прекрасным здесь. Https://jsfiddle.net/y0wwbw6k/ –

1

Я считаю, что я обнаружил проблему. Проблема в том, что сервер, отвечающий API REST, настроен на аутентификацию всего, что происходит, включая запросы OPTIONS. Запрос OPTIONS создается только в том случае, если мы пытаемся сделать это перекрестное происхождение, каким я был. Браузеры, похоже, лишают аутентификацию запросов OPTIONS, и поскольку сервер, на котором я пытаюсь запустить аутентификацию запросов OPTIONS (по какой-то неизвестной причине), он терпит неудачу. Поэтому я теперь попробовал просто «продолжить» мой код и разместить его на одном сервере, и я могу пройти мимо вопросов аутентификации.

+0

Это была очень сложная проблема для меня. Спасибо за ответ! – Mihail