(Browser-as-Client)$ .ajax上的HTTP 405发布到Node服务

背景

首先,我有一个运行在Node上的Restify服务,当我使用一个GUI HTTP客户端时,它是完美的。 我只是说,以前强调,这是一个以浏览器为中心的问题。 如果需要服务器端的解决scheme,它是适应浏览器…

以下是使用我的Restify Web服务和GUI HTTP客户端的100%functionHTTP请求和响应:

要求

POST /appointments HTTP/1.1 Content-Type: application/json Accept: application/json Host: localhost:8085 Connection: close User-Agent: Paw/2.1.1 (Macintosh; OS X/10.10.1) GCDHTTPRequest Content-Length: 142 { "eventName": "Fiesta Forever", "time": "Fri Dec 19 2014 15:55:00 GMT-0600 (CST)", "phoneNumber": "13125555555" } 

回应

 HTTP/1.1 201 Created Access-Control-Allow-Origin: * Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept Access-Control-Allow-Methods: POST, GET, OPTIONS Access-Control-Max-Age: 1000 Content-Type: application/json Content-Length: 37 Date: Fri, 19 Dec 2014 23:01:29 GMT Connection: close {"message":"Alright Alright Alright"} 

更重要的是,我的服务器创build了一个未来的cron作业,可以在我的服务器控制台中看到:

 Created: Fri Dec 19 2014 14:55:00 GMT-0600 (CST) 


问题

我的问题是,我试图编写一个浏览器界面到我的服务。 而且,当我尝试使用Ajax进行相同的HTTP请求时,出现错误。 我创build了以下testing函数,它使HTTP请求:

 function testPost() { var jsonBody = "{\"eventName\": \"Fiesta Forever\",\"time\": \"Fri Dec 19 2014 14:15:00 GMT-0600 (CST)\",\"phoneNumber\": \"13125555555\"}"; $.ajax({ url: 'http://localhost:8085/appointments', accepts: 'application/json', type: 'POST', data: jsonBody, contentType: 'application/json', crossDomain: true, headers: { "Access-Control-Allow-Origin":true } }); } 

然后在我的iOS模拟器中加载包含该函数的页面,然后从Safari Developer控制台调用该函数。 我收到以下错误:

在这里输入图像说明

编辑:删除请求标题时,我收到: Failed to load resource: the server responded with a status of 406 (Not Acceptable)

服务器的代码

这是我的服务器上的代码。 我从Express文档中获取了以下代码,因为它们是唯一一个似乎为每个响应添加正确标题的解决scheme:

 //CORS server.use(function(req, res, next) { res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); res.header("Access-Control-Allow-Methods", "POST, GET, OPTIONS"); res.header("Access-Control-Max-Age", "1000"); next(); }); 

任何人都可以帮助我弄清楚如何使用$ .ajax进行跨域HTTP请求,它携带和接收JSON?

首先, Access-Control-Allow-Origin是一个响应头,必须由服务器发送 – 将它作为请求头发送给客户端请求不仅没有意义,而且似乎是使服务器拒绝的原因你的请求在这里 – 因为Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept它告诉你它将接受什么请求头,而Access-Control-Allow-Origin不在其中。

之后,你得到了406 Not Acceptable意思,这意味着服务器没有看到自己能够响应通过Accept标头请求的内容types的数据。 所以删除accepts: 'application/json'确实让jQuery不再告诉服务器,你期望一个特定的内容types,但只是“给我任何你有” – 在这种情况下,似乎满足服务器…

…并使其与Content-Type: application/json进行响应,这有点奇怪,因为这应该正是jQuery所要求的(也是通过GUI显示的第一个请求)。 我不知道jQuery是否让这个设置的其他东西(你可以尝试看看你的浏览器的开发工具networking面板显示任何请求头错误),但问题解决了,这是什么计数,对不对? 🙂