2016-11-20 4 views
0

Я создаю приложение для простой погоды, которое дает погоду для любого города. Для этого API существует два этапа: 1) вы вводите название города, получите его «где на земле ID» (woeid). 2) используйте woeid для поиска погоды.Получение данных из API метаданных на страницу angularjs

Это API: https://www.metaweather.com/api/

Например: https://www.metaweather.com/api/location/search/?query=london Вы получите этот JSON: [{ "Название": "Лондон", "LOCATION_TYPE": "Город", "WOEID": 44418, «lat_long»: «51.506321, -0.12714»}]

Для начала, просто чтобы получить woeid было бы здорово. Не удается подключиться к API, но когда я набираю его вручную, он работает.

app.js:

var app = angular.module('weatherApp', []); 
app.controller('weatherCtrl', ['$scope', 'weatherService', function($scope, weatherService) { 
function fetchWoeid(city) { 
    weatherService.getWoeid(city).then(function(data){ 
     $scope.place = data; 
    }); 
} 

fetchWoeid('london'); 

$scope.findWoeid = function(city) { 
    $scope.place = ''; 
    fetchWoeid(city); 
}; 
}]); 

app.factory('weatherService', ['$http', '$q', function ($http, $q){ 
function getWoeid (city) { 
    var deferred = $q.defer(); 
    $http.get('https://www.metaweather.com/api/location/search/?query=' + city) 
     .success(function(data){ 
      deferred.resolve(data); 
     }) 
     .error(function(err){ 
      console.log('Error retrieving woeid'); 
      deferred.reject(err); 
     }); 
    return deferred.promise; 
} 

return { 
    getWoeid: getWoeid 
}; 
}]); 

index.html:

<!DOCTYPE html> 
<html ng-app="weatherApp"> 

<head> 
<meta charset="utf-8" /> 
<title>Weather App</title> 
<link data-require="[email protected]" data-semver="3.1.1" rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css" /> 
<script>document.write('<base href="' + document.location + '" />');</script> 
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script> 
<script data-require="[email protected]*" data-semver="2.0.3" src="http://code.jquery.com/jquery-2.0.3.min.js"></script> 
<script data-require="[email protected]*" data-semver="3.1.1" src="//netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js"></script> 
<script src="app.js"></script> 
</head> 

<body ng-controller="weatherCtrl"> 
<form> 
<div class="form-group"> 
    <input class="form-control" type="text" ng-model="city" placeholder="e.g. london" /> 
    <input class="btn btn-default" type="submit" value="Search" ng-click="findWoeid(city)" /> 
</div> 
</form> 
<p ng-show="city">Searching the forecasts for: {{city}}</p> 
<div> 
<h1>WOEID is: {{ place }}</h1> 
<a ng-click="findWeather('london'); city = ''">reset</a> 
</div> 
</body> 

</html> 

ответ

1

Оказывается, у вас возникли проблемы Cross Origin. Это не похоже на то, что Metaweather поддерживает JSONP, поэтому исправление для этого немного сложнее. Вы должны запускать свою страницу через сервер, который может поддерживать прокси-сервер. Одним из таких примеров является https://www.npmjs.com/package/cors-anywhere. Если вы установили, что с использованием значений по умолчанию, то измените вызов AJAX для:

$http.get('http://localhost:8080/https://www.metaweather.com/api/location/search/?query=' + city)

+0

Я попробую это. благодаря –