2017-01-12 3 views
1

Я использую Angular 2.2.3 и выполняю http-запросы с наблюдаемыми с rxjs. Заголовки отображаются на консоли Chrome, но список заголовков в заголовке объекта из ответа пуст. Вот код:Угловой 2 http Наблюдаемый запрос, не возвращающий ответный заголовок

Войти Функция

login(body: Object): Observable<Response> { 
    return this.http.post(this.url, body); 
} 

Вызов функции входа с подпиской на наблюдаемом

this.authService.login(values).subscribe(res => { 
    console.log(res.headers.get("Authorization")) 
    console.log(res) 
}, 
err => { 
    console.log(err); 
}); 

Есть ли что-то я делаю неправильно или что я должен делать по-другому?

Chrome сетевые заголовки консоли ответа

This is the response in the Chrome console where 'Authorization definitely exists'

console.log результаты

Значение null является res.headers.get("Authorization") Как вы можете видеть, список заголовков пуст. Chrome console

Большое спасибо за помощь!

+0

Это не имеет ничего общего с угловой. Если данные не попадают в ответ json, который вы получаете с сервера, то, ну, его там нет. –

+0

@JoshuaOhana Но, как я упоминал, я сказал, что заголовки отображаются в консоли Chrome, поэтому заголовки, несомненно, являются частью ответа. Я также использую Postman, и я получаю и могу анализировать мои заголовки, полученные из моего API. То же самое с моими испытаниями Mocha. – madube94

+0

О, о, о, о чем я сожалею, по какой-то причине мой мозг забыл эту мысль, которой не хватало изображения. Не уверен, что тогда удачи –

ответ

3

Я нашел решение своей проблемы. Оказывается, что Angular использует XMLHttpRequest за кулисами. Из-за этого заголовки, которые могут быть показаны клиенту «программно» (с функцией Angular), должны быть в списке заголовка Access-Control-Expose-Headers. Этот список необходимо создать в бэкэнд при отправке запроса клиенту. Вот что я сделал с ExpressJS, чтобы включить заголовок авторизации:

app.use((req, res, next) => { 
    // List of headers that are to be exposed to the XHR front-end object 
    res.header('Access-Control-Expose-Headers', 'Authorization'); 
    next(); 
}); 

Мой исходный код на переднем конце остался тот же и console.log из Authorization заголовка появляющимся теперь.

Documentation explaining why we need this header

Вся эта документация очень интересно, я думал, что я был очень хорош в APIs, но я узнал много, читая эту :-)

+2

Я столкнулся с той же проблемой. В этой документации говорится: «Заголовок Access-Control-Expose-Headers позволяет заголовкам« белых списков серверов »разрешать доступ браузерам». Почему сетевая консоль Chrome может получить эти заголовки ответа?Мне интересно, если он также использует 'XMLHttpRequest'? – niaomingjian