API调用通过服务器端代码(node.js,php)工作,但不通过使用fetch()的浏览器中的JS工作

时间:2019-06-01 08:13:54

标签: javascript node.js api fetch

我正在尝试通过fetch()发出API POST请求。当我在服务器端(PHP或Node.js)执行它时,它可以正常工作。尝试在浏览器中执行它时,出现两个错误: 1)405错误-不允许使用方法 2)从源'null'的'url'处获取的访问已被CORS策略阻止:对预检请求的响应未通过访问控制检查:请求的资源上不存在'Access-Control-Allow-Origin'标头。如果不透明的响应满足您的需求,请将请求的模式设置为“ no-cors”,以在禁用CORS的情况下获取资源。

我尝试添加:模式:“ no-cors”。然后,我得到以下错误: “ 401未经授权” 响应如下: 401 response

这是我的标准js设置:

const TrailData = {
      email: "test@test.com",
      first_name: "sample string 5",
      last_name: "sample string 6",
      phone2: "12121212"
    };


    // TRAIL POST ( NOT WORKING )
    fetch('http://webapi.mymarketing.co.il/api/contacts', {
            method: "POST",
            mode: 'no-cors',
            headers: {
              "Authorization": "API CODE //here comes the API CODE",
              "Content-Type": "application/json"
            },
            body: JSON.stringify(TrailData)
          })
          .then(res => console.log(res) )
          .then(data => console.log(data))
          .catch(err => console.log(err))

我的Node js设置为:

var postData = {

    sms_status: "None",
    email: "test@test.com",
    first_name: "sample string 5",
    last_name: "sample string 6", 
  };

  let axiosConfig = {
headers: {
    "Authorization": "API CODE",
    'Content-Type': 'application/json;charset=UTF-8',
    "Access-Control-Allow-Origin": "*",
}
  };


const Trail = async () =>{
try {
    const response = await axios.post('http://webapi.mymarketing.co.il/api/contacts', postData, axiosConfig)
    console.log(response)
} catch (error) {
    throw new Error(error)
}


  }

 Trail()

Node JS有效。我得到200 OK响应。第一个没有!

API是否有可能阻止浏览器发出的请求? 我尝试了很多方法,但每次使用浏览器都失败了。

谢谢您的帮助!

1 个答案:

答案 0 :(得分:2)

没有CORS(Authorization标头),您就无法发送额外的标头

因为服务器不响应预检请求,所以您无法发送该请求

没有CORS,您只能发送“简单请求”,请参见https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#Simple_requests

请参阅https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS

https://developer.mozilla.org/en-US/docs/Glossary/Preflight_request

了解更多信息