js post中服务器500错误信息,javascript – POST在服务器上成功但在浏览器中导致CORS错误...

我对微软登录进行HTTP POST请求以获取与邮件API一起使用的访问令牌,请求成功但代码转到我的代码的错误子句.

requestAccessToken(code: string)

{

console.log("request access token");

if (code) {

var headers = new Headers();

headers.append("Content-Type", 'application/x-www-form-urlencoded');

headers.append('Accept', 'application/json');

var requestoptions = new RequestOptions({

headers: headers

});

var body = `grant_type=authorization_code&

redirect_uri=http://localhost:4200&

code=`+ code + `&

client_id=4e[................]5ab&

client_secret=CE[..............]BC`;

this.http.post("https://login.microsoftonline.com/common/oauth2/v2.0/token", body, requestoptions).map((res: Response) =>

{

console.log("response given");

const data = res.json();

}).subscribe( (data) => {

console.log("The data is = " + data);

}, error => {

console.log("The error is = " + error)

});

}

浏览器控制台显示:

XMLHttpRequest无法加载https://login.microsoftonline.com/common/oauth2/v2.0/token.请求的资源上不存在“Access-Control-Allow-Origin”标头.因此,不允许原点’http://localhost:4200‘进入.

zone.js:2019 XHR加载失败:POST“https://login.microsoftonline.com/common/oauth2/v2.0/token”.

outlook.service.ts:96错误是=响应状态:0表示URL:null

这是一个截图,以更好地展示它

cHO0W.png

现在真正的问题是我的请求成功如下所示:

YVgeR.png

并且响应显示了我的访问令牌.那么为什么我不能从代码中获取它呢?为什么它会出现错误条款.

解决方法:

当您将跨域POST发送到其响应中不包含Access-Control-Allow-Origin响应头的服务器时,您所看到的是预期的行为.

具体来说,只要您的跨源请求没有在执行POST请求之前导致浏览器执行preflight OPTIONS request的特性(您的请求没有),那么POST请求将在服务器端成功 – 但是,因为从服务器到该POST请求的响应不包括Access-Control-Allow-Origin响应头,您的浏览器阻止您的前端代码能够实际看到服务器发送的响应.

但是,如果您打开浏览器devtools,您仍然可以在那里看到响应.但仅仅因为浏览器收到了响应并且您可以在devtools中看到它,并不意味着浏览器会将响应暴露给您的代码.它只有在具有Access-Control-Allow-Origin时才会公开它.

这一切似乎都是违反直觉的,但如果你记得浏览器是强制执行跨源限制的唯一点,那一切都是有道理的.服务器不会阻止跨源请求.

当您发送该POST请求的服务器接收请求时,它不会检查原点以决定是否响应.服务器只接受POST请求并对其进行处理,然后发送响应.但随后浏览器阻止您的代码访问该响应.

但同样重要的是要记住,浏览器不会阻止您的代码发送该POST请求的跨源.当请求具有触发浏览器执行preflight的质量(如特殊标头)时,浏览器仅阻止发送跨源请求.

因此,由于您的POST请求不是触发预检的请求,因此浏览器会发送它并成功.

为了便于比较,请考虑跨源GET请求会发生什么.在这种情况下,只要GET请求不是触发预检的那个,浏览器就不会拒绝发送它.相反,浏览器将请求发送到服务器,无论如何.服务器接收该GET请求并发送响应.

只有当响应返回到浏览器时才会发生不同的事情 – 因为在这种情况下,如果响应不包含Access-Control-Allow-Origin响应头,那么您的浏览器将不允许您的前端JavaScript代码来访问它.

但很明显,因为发出GET请求的整个过程就是对响应执行某些操作,那么在这种情况下,如果您的代码无法访问响应,那么这是一个很难的完全失败 – 与POST请求的情况相反,请求正文实际上仍然按预期发布,但您只是没有办法让代码检查响应以查看请求是否成功.

标签:javascript,angular,typescript,http,cors

来源: https://codeday.me/bug/20190927/1825019.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值