无法使用 Angular 向本地 JSON 文件发出 $http.get 请求
Unable to make a $http.get request to a local JSON file using Angular
我正在制作一个天气应用程序,我需要从我的控制器中获取本地 JSON 文件,然后对数据进行处理。但是,出于某种原因,我无法获得 local $http.get
工作请求。我该怎么办?
这是我当前的代码:
var weatherApp = angular.module('weatherApp', []);
weatherApp.controller('weatherCtrl', function ($scope, $http) {
$scope.cities = [],
$scope.getCities = (function() {
$http.get('http://localhost:81/Webb/angular projekt/jsons/cities.json')
.success(function(data, status, headers, config) {
console.log(data);
})
.error(function(data, status, headers, config) {
console.log(status);
});
}())
}
这给了我这个错误:
SyntaxError: Unexpected token { angular.js:11598
at Object.parse (native)
at oc (https://ajax.googleapis.com/ajax/libs/angularjs/1.3.10/angular.min.js:14:156)
at Yb (https://ajax.googleapis.com/ajax/libs/angularjs/1.3.10/angular.min.js:77:190)
at https://ajax.googleapis.com/ajax/libs/angularjs/1.3.10/angular.min.js:78:50
at s (https://ajax.googleapis.com/ajax/libs/angularjs/1.3.10/angular.min.js:7:302)
at Yc (https://ajax.googleapis.com/ajax/libs/angularjs/1.3.10/angular.min.js:78:32)
at c (https://ajax.googleapis.com/ajax/libs/angularjs/1.3.10/angular.min.js:79:165)
at https://ajax.googleapis.com/ajax/libs/angularjs/1.3.10/angular.min.js:112:343
at l.$eval (https://ajax.googleapis.com/ajax/libs/angularjs/1.3.10/angular.min.js:126:193)
at l.$digest (https://ajax.googleapis.com/ajax/libs/angularjs/1.3.10/angular.min.js:123:286)
我也试过使用 jsons/cities.json
但是会抛出这个错误:
Cross origin requests are only supported for protocol schemes: http, data, chrome-extension, https, chrome-extension-resource.
向外部资源发出获取请求工作正常,但每当我在本地执行时,事情似乎就不起作用了。
我尝试获取的 JSON 文件如下所示:
{"cities": {
{
city: "Stockholm",
latitud: "59",
longitud: "18",
id: "sthlm"
},
{
city: "Göteborg",
latitud: "58",
longitud: "12",
id: "gbg"
},
{
city: "Malmö",
latitud: "55",
longitud: "13",
id: "malmo"
},
{
city: "Umeå",
latitud: "63",
longitud: "20",
id: "umea"
}
}
}
尝试使用相对路径而不是绝对路径:
$http.get('jsons/cities.json')
或类似的内容,具体取决于您的文件夹结构。
编辑:Here's a Plunkr 显示它正在运行。
编辑 2:看来问题实际上是 JSON 格式错误。正确的格式是:
{
"cities": [
{
"city": "Stockholm",
"latitud": "59",
"longitud": "18",
"id": "sthlm"
},
{
"city": "Göteborg",
"latitud": "58",
"longitud": "12",
"id": "gbg"
},
{
"city": "Malmö",
"latitud": "55",
"longitud": "13",
"id": "malmo"
},
{
"city": "Umeå",
"latitud": "63",
"longitud": "20",
"id": "umea"
}
]
}
您不能对本地文件进行跨源请求。否则网站可以随意请求您计算机上的文件。
有关详细信息,请参阅 this question。建议的解决方案包括 运行 在您的计算机中安装一个服务器,以便您最终通过 HTTP 调用该文件。 file://
不适合拨打 AJAX 电话 "protocol"。
'http://localhost:81/Webb/angular projekt/jsons/cities.json' 中有一个 space。您可以尝试消除 'angular' 和 'projekt' 之间的 space 吗?
Making a get request to an external resource works fine, but whenever I do it locally things just doesn't seem to work.
您是否将服务器的 Access-Control-Allow-Origin 响应 header 设置为匹配您请求的来源 header?将响应 header 设置为原始请求 header 有效。
另外,您如何访问 Angular 页面?
在您的 local 文件中,您遇到 JSON 解析异常,因为您的 JSON 格式严重错误。试试这个格式:
{
"cities": [
{
"city": "Stockholm",
"latitud": "59",
"longitud": "18",
"id": "sthlm"
}
]
}
我使用 $http.get('../jsons/cities.json') 之类的相对路径,但没有用。直到我像这样
在 web.config 中添加对 .json 文件的支持
<staticContent>
<mimeMap fileExtension=".json" mimeType="application/json" />
</staticContent>
假定这将是静态数据。定义一个对象并将其作为脚本引用。
Include reference into index.html (or whatever)
<script src="../jsons/citiesJSON.js"></script>
create an object and pump in the data
var GLOBALDATA = {};
GLOBALDATA.citiesJSON =
{"cities": {
{
city: "Stockholm",
latitud: "59",
longitud: "18",
id: "sthlm"
},
{
city: "Göteborg",
latitud: "58",
longitud: "12",
id: "gbg"
},
{
city: "Malmö",
latitud: "55",
longitud: "13",
id: "malmo"
},
{
city: "Umeå",
latitud: "63",
longitud: "20",
id: "umea"
}
}
} ; // <-- it's a statement now
no need to request the data via HTTP
$scope.cities = GLOBALDATA.citiesJson;
我正在制作一个天气应用程序,我需要从我的控制器中获取本地 JSON 文件,然后对数据进行处理。但是,出于某种原因,我无法获得 local $http.get
工作请求。我该怎么办?
这是我当前的代码:
var weatherApp = angular.module('weatherApp', []);
weatherApp.controller('weatherCtrl', function ($scope, $http) {
$scope.cities = [],
$scope.getCities = (function() {
$http.get('http://localhost:81/Webb/angular projekt/jsons/cities.json')
.success(function(data, status, headers, config) {
console.log(data);
})
.error(function(data, status, headers, config) {
console.log(status);
});
}())
}
这给了我这个错误:
SyntaxError: Unexpected token { angular.js:11598
at Object.parse (native)
at oc (https://ajax.googleapis.com/ajax/libs/angularjs/1.3.10/angular.min.js:14:156)
at Yb (https://ajax.googleapis.com/ajax/libs/angularjs/1.3.10/angular.min.js:77:190)
at https://ajax.googleapis.com/ajax/libs/angularjs/1.3.10/angular.min.js:78:50
at s (https://ajax.googleapis.com/ajax/libs/angularjs/1.3.10/angular.min.js:7:302)
at Yc (https://ajax.googleapis.com/ajax/libs/angularjs/1.3.10/angular.min.js:78:32)
at c (https://ajax.googleapis.com/ajax/libs/angularjs/1.3.10/angular.min.js:79:165)
at https://ajax.googleapis.com/ajax/libs/angularjs/1.3.10/angular.min.js:112:343
at l.$eval (https://ajax.googleapis.com/ajax/libs/angularjs/1.3.10/angular.min.js:126:193)
at l.$digest (https://ajax.googleapis.com/ajax/libs/angularjs/1.3.10/angular.min.js:123:286)
我也试过使用 jsons/cities.json
但是会抛出这个错误:
Cross origin requests are only supported for protocol schemes: http, data, chrome-extension, https, chrome-extension-resource.
向外部资源发出获取请求工作正常,但每当我在本地执行时,事情似乎就不起作用了。
我尝试获取的 JSON 文件如下所示:
{"cities": {
{
city: "Stockholm",
latitud: "59",
longitud: "18",
id: "sthlm"
},
{
city: "Göteborg",
latitud: "58",
longitud: "12",
id: "gbg"
},
{
city: "Malmö",
latitud: "55",
longitud: "13",
id: "malmo"
},
{
city: "Umeå",
latitud: "63",
longitud: "20",
id: "umea"
}
}
}
尝试使用相对路径而不是绝对路径:
$http.get('jsons/cities.json')
或类似的内容,具体取决于您的文件夹结构。
编辑:Here's a Plunkr 显示它正在运行。
编辑 2:看来问题实际上是 JSON 格式错误。正确的格式是:
{
"cities": [
{
"city": "Stockholm",
"latitud": "59",
"longitud": "18",
"id": "sthlm"
},
{
"city": "Göteborg",
"latitud": "58",
"longitud": "12",
"id": "gbg"
},
{
"city": "Malmö",
"latitud": "55",
"longitud": "13",
"id": "malmo"
},
{
"city": "Umeå",
"latitud": "63",
"longitud": "20",
"id": "umea"
}
]
}
您不能对本地文件进行跨源请求。否则网站可以随意请求您计算机上的文件。
有关详细信息,请参阅 this question。建议的解决方案包括 运行 在您的计算机中安装一个服务器,以便您最终通过 HTTP 调用该文件。 file://
不适合拨打 AJAX 电话 "protocol"。
'http://localhost:81/Webb/angular projekt/jsons/cities.json' 中有一个 space。您可以尝试消除 'angular' 和 'projekt' 之间的 space 吗?
Making a get request to an external resource works fine, but whenever I do it locally things just doesn't seem to work.
您是否将服务器的 Access-Control-Allow-Origin 响应 header 设置为匹配您请求的来源 header?将响应 header 设置为原始请求 header 有效。
另外,您如何访问 Angular 页面?
在您的 local 文件中,您遇到 JSON 解析异常,因为您的 JSON 格式严重错误。试试这个格式:
{
"cities": [
{
"city": "Stockholm",
"latitud": "59",
"longitud": "18",
"id": "sthlm"
}
]
}
我使用 $http.get('../jsons/cities.json') 之类的相对路径,但没有用。直到我像这样
在 web.config 中添加对 .json 文件的支持<staticContent>
<mimeMap fileExtension=".json" mimeType="application/json" />
</staticContent>
假定这将是静态数据。定义一个对象并将其作为脚本引用。
Include reference into index.html (or whatever)
<script src="../jsons/citiesJSON.js"></script>
create an object and pump in the data
var GLOBALDATA = {};
GLOBALDATA.citiesJSON =
{"cities": {
{
city: "Stockholm",
latitud: "59",
longitud: "18",
id: "sthlm"
},
{
city: "Göteborg",
latitud: "58",
longitud: "12",
id: "gbg"
},
{
city: "Malmö",
latitud: "55",
longitud: "13",
id: "malmo"
},
{
city: "Umeå",
latitud: "63",
longitud: "20",
id: "umea"
}
}
} ; // <-- it's a statement now
no need to request the data via HTTP
$scope.cities = GLOBALDATA.citiesJson;