【问题标题】:Restler 2 cross domain POST AJAX callRestler 2 跨域 POST AJAX 调用
【发布时间】:2014-05-17 18:05:19
【问题描述】:

我已经使用Restler 2 使用简单的REST API 构建了我的服务器。现在我尝试使用AJAX 从本地主机向该API 发出POST 请求,我看到之前发送了OPTIONS 请求,而Restler 没有处理它。

我添加了这个

header('Access-Control-Allow-Origin:  *');
header('Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, PATCH, DELETE');
header('Access-Control-Max-Age: 1000');
header('Access-Control-Allow-Headers: *');

到我的服务器的index.php,正如为 Restler 3 建议的here 一样,但这并没有解决它。 我还查看了this question 并尝试了最后两个答案的建议(与以前几乎相同),但也没有用。我真的需要使用jsonp(第一个答案提到的问题)吗?实际上发送GET 请求而不是POST 不是很尴尬吗?

我的 AJAX 调用:

$.ajax({
    type: "post",
    url: "http://{MY_URL}/index.php/paint", 
    dataType: "json",
    contentType: "application/json",
    data: JSON.stringify(data), 
    success: function(data){ 
        console.log("post success " + data);
    },
    error: function(xhr,err){
            console.log("readyState: "+xhr.readyState+"\nstatus: "+xhr.status);
            console.log("responseText: "+xhr.responseText);
            console.log(err);
    }
});

输出是:

OPTIONS http://{MY_URL}/index.php/paint 404 (Not Found) jquery-1.10.2.js:8706
XMLHttpRequest cannot load http://{MY_URL}/index.php/paint. Invalid HTTP status code 404 

【问题讨论】:

  • 问题也可能是其他问题。当一切都在同一个域中时,您是否确保它们正常工作?
  • @Luracast 是的。使用本地主机上的服务器,它工作得很好。可能我无法在服务器上发送标头,因为我无法配置它,并且不允许我发送其他标头? (不过不确定)。
  • @Luracast 如果我遵循此选项github.com/Luracast/Restler/issues/17,添加新的支持格式,这意味着我必须将我的“假定”POST 请求作为GET 请求处理?我看到了这些例子,我得到了它的工作,但它们是GETrequests。我现在如何处理POST 请求?
  • 您坚持使用 Restler 2 是否有特定原因? Restler 3 已经有 JsFormat (JSONP) 和简单的选项来打开 CORS Defaults::$crossOriginResourceSharing = true;
  • 是的,我的主机的 PHP 版本已经很老了。不过,我找到了解决方案,稍后会发布。

标签: ajax rest cross-domain restler


【解决方案1】:

供遇到同样问题的人将来参考。

仅在 index.php 上添加此标头不起作用。

header('Access-Control-Allow-Origin:  *');
header('Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, PATCH, DELETE');
header('Access-Control-Max-Age: 1000');
header('Access-Control-Allow-Headers: *');

但是,在this post 中找到了解决方案。因此,我在index.php 的开头添加了以下代码,它适用于简单的json 请求(不需要jsonp)。

// Allow from any origin
if (isset($_SERVER['HTTP_ORIGIN'])) {
    header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
    header('Access-Control-Allow-Credentials: true');
    header('Access-Control-Max-Age: 86400');    // cache for 1 day
}

// Access-Control headers are received during OPTIONS requests
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {

    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
        header("Access-Control-Allow-Methods: GET, POST, OPTIONS");         

    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
        header("Access-Control-Allow-Headers:        {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");

    exit(0);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-20
    • 2012-04-15
    • 2011-02-03
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    相关资源
    最近更新 更多