从外部API

时间:2016-08-11 14:41:29

标签: javascript ajax

我有一个包含Google ADWords的HTML页面,以及来自外部网址的ajax来电,我想从网址获取json个数据。 外部API也是由我制作的。 API Controller(在Laravel 5.2中):

public function index()
{
    $data = WeatherData::orderBy('created_at', 'DESC')->first();

    return Response::json($data);
}

HTML ADWords代码:

$.ajax({
        url: 'https://weather.mnsc.com/api/v1/data',
        type: 'POST',
        dataType: 'JSON',
        cors: true,
        success: function (data) {
            console.log(data);
        }
    });

但我在Chrome中遇到错误:

XMLHttpRequest无法加载https://weather.mnsc.com/api/v1/data。请求的资源上不存在“Access-Control-Allow-Origin”标头。因此不允许原点'null'访问。响应的HTTP状态代码为500。

我需要在Laravel API中设置标头吗?

3 个答案:

答案 0 :(得分:1)

您需要AJAX请求的crossDomain: true属性,而不是正常的属性。另外,$.ajax()没有cors选项,所以我删除了它。有关所有可用选项,请参阅文档页面上的jQuery.ajax() settings

$.ajax({
    url: 'https://weather.mnsc.com/api/v1/data',
    type: 'POST',
    dataType: 'JSON',
    crossDomain: true,
    success: function (data) {
        console.log(data);
    }
});

答案 1 :(得分:0)

在你的ajax调用之前加上这行代码。我必须始终设置此项以使跨域jquery ajax工作。

$.support.cors = true;

答案 2 :(得分:0)

好吧,我发现可能是什么问题。问题在于请求类型。 我在post电话中从get切换到ajax,现在它似乎按预期工作了。

$.ajax({
  url: 'https://weather.mnsc.com/api/v1/data',
  type: 'GET',
  dataType: 'JSON',
  crossDomain: true,
  success: function (data) {
     console.log(data);
  }
});

但这对我没有帮助,因为Google AdWords只需要发布请求...

我还怀疑这是Laravel API的一个问题,必须要设置一些内容才能使用post个请求。

<强>更新

正如我所怀疑的,post请求中的问题是Larvael's csrf token.。我通过评论Kernel.php中的行来做出解决方法。