jquery - Why does my JavaScript code receive a "No 'Access-Control-Allow-Origin' header is present on the requested resource" error, while Postman does not?

ID : 208

viewed : 258

Tags : javascriptjquerycorssame-origin-policyflask-restlessjavascript

Top 5 Answer for jquery - Why does my JavaScript code receive a "No 'Access-Control-Allow-Origin' header is present on the requested resource" error, while Postman does not?

vote vote


If I understood it right you are doing an XMLHttpRequest to a different domain than your page is on. So the browser is blocking it as it usually allows a request in the same origin for security reasons. You need to do something different when you want to do a cross-domain request. A tutorial about how to achieve that is Using CORS.

When you are using Postman they are not restricted by this policy. Quoted from Cross-Origin XMLHttpRequest:

Regular web pages can use the XMLHttpRequest object to send and receive data from remote servers, but they're limited by the same origin policy. Extensions aren't so limited. An extension can talk to remote servers outside of its origin, as long as it first requests cross-origin permissions.

vote vote


WARNING: Using Access-Control-Allow-Origin: * can make your API/website vulnerable to cross-site request forgery (CSRF) attacks. Make certain you understand the risks before using this code.

It's very simple to solve if you are using PHP. Just add the following script in the beginning of your PHP page which handles the request:

<?php header('Access-Control-Allow-Origin: *'); ?> 

If you are using Node-red you have to allow CORS in the node-red/settings.js file by un-commenting the following lines:

// The following property can be used to configure cross-origin resource sharing // in the HTTP nodes. // See https://github.com/troygoode/node-cors#configuration-options for // details on its contents. The following is a basic permissive set of options: httpNodeCors: {  origin: "*",  methods: "GET,PUT,POST,DELETE" }, 

If you are using Flask same as the question; you have first to install flask-cors

$ pip install -U flask-cors 

Then include the Flask cors in your application.

from flask_cors import CORS 

A simple application will look like:

from flask import Flask from flask_cors import CORS  app = Flask(__name__) CORS(app)  @app.route("/") def helloWorld():   return "Hello, cross-origin-world!" 

For more details, you can check the Flask documentation.

vote vote


$.ajax({type: "POST" - calls OPTIONS
$.post( - Calls POST

Both are different. Postman calls "POST" properly, but when we call it, it will be "OPTIONS".

For C# web services - Web API

Please add the following code in your web.config file under <system.webServer> tag. This will work:

<httpProtocol>     <customHeaders>         <add name="Access-Control-Allow-Origin" value="*" />     </customHeaders> </httpProtocol> 

Please make sure you are not doing any mistake in the Ajax call


$.ajax({     url: 'http://mysite.microsoft.sample.xyz.com/api/mycall',     headers: {         'Content-Type': 'application/x-www-form-urlencoded'     },     type: "POST", /* or type:"GET" or type:"PUT" */     dataType: "json",     data: {     },     success: function (result) {         console.log(result);     },     error: function () {         console.log("error");     } }); 

Note: If you are looking for downloading content from a third-party website then this will not help you. You can try the following code, but not JavaScript.

System.Net.WebClient wc = new System.Net.WebClient(); string str = wc.DownloadString("http://mysite.microsoft.sample.xyz.com/api/mycall"); 
vote vote


In the below investigation as API, I use http://example.com instead of http://myApiUrl/login from your question, because this first one working.

I assume that your page is on http://my-site.local:8088.

The reason why you see different results is that Postman:

  • set header Host=example.com (your API)
  • NOT set header Origin

This is similar to browsers' way of sending requests when the site and API has the same domain (browsers also set the header item Referer=http://my-site.local:8088, however I don't see it in Postman). When Origin header is not set, usually servers allow such requests by default.

Enter image description here

This is the standard way how Postman sends requests. But a browser sends requests differently when your site and API have different domains, and then CORS occurs and the browser automatically:

  • sets header Host=example.com (yours as API)
  • sets header Origin=http://my-site.local:8088 (your site)

(The header Referer has the same value as Origin). And now in Chrome's Console & Networks tab you will see:

Enter image description here

Enter image description here

When you have Host != Origin this is CORS, and when the server detects such a request, it usually blocks it by default.

Origin=null is set when you open HTML content from a local directory, and it sends a request. The same situation is when you send a request inside an <iframe>, like in the below snippet (but here the Host header is not set at all) - in general, everywhere the HTML specification says opaque origin, you can translate that to Origin=null. More information about this you can find here.

fetch('http://example.com/api', {method: 'POST'});
Look on chrome-console > network tab

If you do not use a simple CORS request, usually the browser automatically also sends an OPTIONS request before sending the main request - more information is here. The snippet below shows it:

fetch('http://example.com/api', {    method: 'POST',    headers: { 'Content-Type': 'application/json'}  });
Look in chrome-console -> network tab to 'api' request.  This is the OPTIONS request (the server does not allow sending a POST request)

You can change the configuration of your server to allow CORS requests.

Here is an example configuration which turns on CORS on nginx (nginx.conf file) - be very careful with setting always/"$http_origin" for nginx and "*" for Apache - this will unblock CORS from any domain.

location ~ ^/index\.php(/|$) {     ...      add_header 'Access-Control-Allow-Origin' "$http_origin" always;      add_header 'Access-Control-Allow-Credentials' 'true' always;      if ($request_method = OPTIONS) {          add_header 'Access-Control-Allow-Origin' "$http_origin"; # DO NOT remove THIS LINES (doubled with outside 'if' above)          add_header 'Access-Control-Allow-Credentials' 'true';          add_header 'Access-Control-Max-Age' 1728000; # cache preflight value for 20 days          add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';          add_header 'Access-Control-Allow-Headers' 'My-First-Header,My-Second-Header,Authorization,Content-Type,Accept,Origin';          add_header 'Content-Length' 0;          add_header 'Content-Type' 'text/plain charset=UTF-8';          return 204;      }  }

Here is an example configuration which turns on CORS on Apache (.htaccess file)

# ------------------------------------------------------------------------------  # | Cross-domain Ajax requests                                                 |  # ------------------------------------------------------------------------------    # Enable cross-origin Ajax requests.  # http://code.google.com/p/html5security/wiki/CrossOriginRequestSecurity  # http://enable-cors.org/    # <IfModule mod_headers.c>  #    Header set Access-Control-Allow-Origin "*"  # </IfModule>    # Header set Header set Access-Control-Allow-Origin "*"  # Header always set Access-Control-Allow-Credentials "true"    Access-Control-Allow-Origin "http://your-page.com:80"  Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT"  Header always set Access-Control-Allow-Headers "My-First-Header,My-Second-Header,Authorization, content-type, csrf-token"

vote vote


Applying a CORS restriction is a security feature defined by a server and implemented by a browser.

The browser looks at the CORS policy of the server and respects it.

However, the Postman tool does not bother about the CORS policy of the server.

That is why the CORS error appears in the browser, but not in Postman.

Top 3 video Explaining jquery - Why does my JavaScript code receive a "No 'Access-Control-Allow-Origin' header is present on the requested resource" error, while Postman does not?