无法从Angular UI调用POST Give 405

时间:2019-05-29 18:54:56

标签: angular post angular-httpclient

我知道已经有100个问题了,但是因为他们没有解决我的问题而将其发布

因此,我有一个已启动并正在运行的多链网络设置。我们有API可以访问网络。问题是我可以从POSTMAN调用POST请求,但是当我从Angular UI调用POST请求时,它根本无法工作。

只需添加一下,我就很了解浏览器和POSTMAN如何处理POST请求,但是很遗憾,我无法使它正常工作。

我很清楚,当我们调用“ POST”方法时,浏览器发送了“ OPTIONS”请求,但我一直收到405。我已经检查了代码,但找不到答案。以下是我的Angular代码:-

 var surl = "URL";

        let headers = new HttpHeaders({
          "Content-Type": "application/json"
       });

  headers.append("apikey","<mykey>");

       let options = {
          headers: headers
       }

        this.httpClient.post(surl,'{"method": "listpermissions", "params": []}',options).subscribe(value => {
            console.log(value);
          });

我也尝试过如下所示的标题,但是它不起作用:-

   const httpOptions = {
    headers: new HttpHeaders({
      'Content-Type':'application/json',
      'apikey': '<apikey>'
    })
  };

也这样:-

let oheaders: HttpHeaders = new HttpHeaders();
oheaders = oheaders.set('Content-Type','text/plain');
oheaders = oheaders.set('apikey','<apikey>');

有帮助吗??

以防万一有人想看看请求和响应头。

enter image description here

预先感谢, Vishesh。

3 个答案:

答案 0 :(得分:4)

修改

我错过了提到多链的部分。由于无法绕开CORS,因此在多链前面添加代理服务器可能是唯一的解决方案(直到他们添加CORS支持)https://www.multichain.com/qa/9805/how-to-enable-cors-in-multichain

原始答案

您应该阅读有关CORS的内容,但是基本上,您的浏览器正在向您的API发送OPTIONS预检请求,因为您的后端与角度前端应用程序位于不同的域/端口上。因此,浏览器实际上正在使用该OPTIONS请求与后端进行检查,是否允许它向API发出POST请求。

它可以在POSTMAN中使用,因为只有浏览器实现了CORS,而没有其他客户端(例如POSTMAN)实现。

问题是您的后端服务器不允许OPTIONS请求,并返回405状态代码以表明不允许此方法。您需要启用该方法以实现CORS。

您可以直接在您的后端应用程序代码中(使用nodejs,php,.net ...)或在Web服务器级别(nginx / apache / IIS)中启用CORS

当遇到OPTIONS请求时,您的后端应返回200 http状态代码(而不是405)以及以下标头

Access-Control-Allow-Origin: http://yoursite.com (or use * for debugging)
Access-Control-Allow-Methods: GET, POST, OPTIONS (and PUT/DELETE if needed)
Access-Control-Allow-HEADERS: apikey, content-type

我暂时可能还没有想到更多的标题,但是如果缺少某些内容,您会收到一条不同的错误消息

答案 1 :(得分:-1)

您应该使用此chrome扩展程序启用Cors起源。这里的a link或后端开发人员应在其服务方法代码中添加标头。

答案 2 :(得分:-1)

CORS问题

405 “(不允许使用方法)” 响应,指出Foursquare API端点未配置为处理OPTIONS请求。因此,预检失败,您的浏览器再也不会继续执行POST请求它尝试发送的代码了。