允许我的API通过AJAX访问

问题描述:

我有一个API在服务器上获取某个日期。允许我的API通过AJAX访问

public function post_events() 
{ 
    header('Access-Control-Allow-Origin: *'); 
    header('Access-Control-Allow-Methods: GET, POST'); 
    header("Access-Control-Allow-Headers: X-Requested-With"); 

    $city = Input::post('city','all'); 
    $c = Model_chart::format_chart($city); 
    return $this->response($c); 
} 

它在通常的卷曲方法上工作正常。但我试图在Angular.js上使用$ http来访问它,它给我带来了这个错误。

XMLHttpRequest cannot load http://event.deremoe.com/vendor/events.json . No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin ' http://app.event.chart ' is therefore not allowed access.

正如你所看到的,我已经在函数中添加了标题。我也检查了curl,并且在我调用api时连接了标题Access-Control-Allow-Origin。

有什么我在这里失踪?

更多信息:这是通过正常卷曲返回给我的标题信息。

Remote Address:104.28.19.112:80 
Request URL:http://event.deremoe.com/vendor/events.json 
Request Method:OPTIONS 
Status Code:404 Not Found 

Request Headersview source 
Accept:*/* 
Accept-Encoding:gzip,deflate,sdch 
Accept-Language:en-US,en;q=0.8 
Access-Control-Request-Headers:accept, content-type 
Access-Control-Request-Method:POST 
Connection:keep-alive 
Host:event.deremoe.com 
Origin:http://app.event.chart 
Referer:http://app.event.chart/ 
User-Agent:Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36 

Response Headersview source 
CF-RAY:16f687416fe30c35-SEA 
Connection:keep-alive 
Content-Encoding:gzip 
Content-Type:text/html; charset=UTF-8 
Date:Thu, 25 Sep 2014 10:27:17 GMT 
Server:cloudflare-nginx 
Set-Cookie:__cfduid=d1a9e4283faacc0a2b029efef586b6b931411640837342; expires=Mon, 23-Dec-2019 23:50:00 GMT; path=/; domain=.deremoe.com; HttpOnly 
Transfer-Encoding:chunked 
X-Powered-By:PHP/5.4.30 
+1

你可以检查网络响应的ajax调用,如果头是真正设置? – 2014-09-25 09:58:04

+0

@johnSmith我该怎么做? ...我在上面添加了回应。 – 2014-09-25 09:58:46

+0

是您的ajax请求跨域?如果是这样的话,你需要使用jsonp并将回应包装在提供的回调中(如果存在),以便在通过cURL访问时不会出现乱码,因此它可以正常工作 – martincarlin87 2014-09-25 10:04:51

浏览器发出第一个飞行前的选项调用您的API,这是什么触发错误:Access-Control-Allow-Origin。你可以创建自己的API接受的所有选项请求一个端点,你必须也有设置的标头就像岗位事件:

header('Access-Control-Allow-Origin: *'); 

,你还会收到的404未找到的状态代码。这意味着无法找到OPTIONS端点。

+0

所以我必须添加头('访问控制 - 允许 - 方法:GET,POST','OPTIONS');?您能否提供更多解释? – 2014-09-26 01:12:50

+0

我想你上面发布的那段代码匹配一个端点 让我们假设/事件与POST方法匹配你的功能 当你试图做这个Ajax来自浏览器在接收到POST请求,您将在/ events上收到OPTIONS请求。 你在API中要做的是定义与以下函数匹配的OPTIONS/events端点: 'public function options_events(){ header('Access-Control-Allow-Origin:*'); }' – 2014-09-26 09:33:40

+0

看看这里也是特定的角度: [选项角](http://*.com/questions/21792759/confused-about-how-to-handle-cors-options-preflight-要求) – 2014-09-26 09:40:01