0

I have a weird problem. I am testing this using Angular.js 1.2.15.

I want to send a POST request to a RESTful API backend on another domain (and I want to use $http directly, not $resource).

var mapData = {
'some': 'keys',
'other': 'keys'
}
$http.post(endPoint, mapData);

This is what happens: An OPTIONS request is sent first, with the following request headers:

OPTIONS /api/maps HTTP/1.1

Host: myhost.com

Connection: keep-alive

Access-Control-Request-Method: POST

Origin: http://0.0.0.0:9000

User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/36.0.1985.125 Chrome/36.0.1985.125 Safari/537.36

Access-Control-Request-Headers: accept, content-type

Accept: */*

Referer: http://0.0.0.0:9000/

Accept-Encoding: gzip,deflate,sdch

Accept-Language: en-US,en;q=0.8

The response clearly shows that requests from other origins and with every method are allowed:

HTTP/1.1 204 No content

Server: Varnish

Connection: keep-alive

Access-Control-Allow-Origin: *

Access-Control-Allow-Credentials: true

Access-Control-Allow-Methods: *

Access-Control-Allow-Headers: DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type

Access-Control-Max-Age: 0

Content-Type: text/plain charset=UTF-8

Accept-Ranges: bytes

Date: Tue, 02 Sep 2014 14:50:16 GMT

X-Varnish: 166874803

Age: 0

Via: 1.1 varnish

Connection: close

Cache-Control: max-age=0, private

X-Varnish-Cache: MISS

But then, the POST request is not even sent by the browser (Chromium 36), i.e. it does not show a POST request in the network tab of the dev console. Instead, the following is shown in the console: XMLHttpRequest cannot load http://myhost.com/api/maps. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://0.0.0.0:9000' is therefore not allowed access.

Now, what is totally weird: GET requests to the same API work, and are not preceded by an OPTIONS request (or maybe it is not shown in the network tab).

HTTP/1.1 304 Not Modified

Server: nginx/1.4.7

Content-Type: application/json; charset=utf-8

Status: 200 OK

X-UA-Compatible: IE=Edge,chrome=1

ETag: "baca3b7547fed3377088eb81fe083ff8"

X-Request-Id: b2552dc4fdef2541c841e3d5e12d337e

X-Runtime: 0.110003

X-Rack-Cache: miss

Access-Control-Allow-Origin: *

Access-Control-Allow-Credentials: true

Access-Control-Allow-Methods: GET, POST, PUT, OPTIONS

Access-Control-Allow-Headers: DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type

Accept-Ranges: bytes

Date: Tue, 02 Sep 2014 14:54:31 GMT

X-Varnish: 166874831 166874142

Age: 6223

Via: 1.1 varnish

Connection: keep-alive

Cache-Control: max-age=0, private

X-Varnish-Cache: HIT

I really have no clue what the problem could be here. Is it Angular's implementation? Or is it a misconfiguration on the server? The guys responsible for the API told me it usually works with all their web apps.

I understand that this is a CORS problem and I am by no means an expert when it comes to that, but hey, Access-Control-Allow-Origin: * should do the trick, shouldn't it?

UPDATE: It works when using plain XMLHttpRequest:

var http = new XMLHttpRequest();
var url = endPoint;
var params = JSON.stringify(mapData);
http.open("POST", url, true);

I get a 200 back. What is the matter here?

grssnbchr
  • 2,877
  • 7
  • 37
  • 71
  • possible duplicate of [Angular.js local development with $http.get from API](http://stackoverflow.com/questions/25568211/angular-js-local-development-with-http-get-from-api) – makeitmorehuman Sep 02 '14 at 15:41
  • No, certainly not. First of all, our server is configured for CORS, as it works with other apps. Secondly, I even configured $httpProvider according to the answer you pointed out even though, as some say, it is no longer needed in Angular > 1.2. – grssnbchr Sep 02 '14 at 15:43

1 Answers1

0

Nginx has to be compiled with http://nginx.org/en/docs/http/ngx_http_headers_module.html for Access-Control-Allow-Origin: * to work. Do you have this module installed?

location  / {
    add_header Access-Control-Allow-Origin *;
}
Chris Hawkes
  • 11,923
  • 6
  • 58
  • 68