Ionic 2 http.get() проблема

Я попытался сделать вызов http.get() с помощью этих двух методов.

Первый:

getResults(){
    return this.http.get('http://localhost/api.php')
    .toPromise()
    .then( data => data.json() );
}

Показана ошибка:

3     122412   error    EXCEPTION: Uncaught (in promise): Response with status:0  for URL: null
4     122413   error    ORIGINAL STACKTRACE:
5     122413   error    Error: Uncaught (in promise): Response with status: 0  for URL: null
..........

Второй:

getResults(){
    return new Promise((resolve, reject) => {
      this.http.get('http://localhost/api.php')
        .map(res => res.json())
        .subscribe(data => {
          resolve(data);
        }, (err) => {
          reject(err);
        });
    });
}

Показана ошибка:

2     925052   error    EXCEPTION: Uncaught (in promise): Response with status:0  for URL: null
3     925052   error    ORIGINAL STACKTRACE:
4     925053   error    Error: Uncaught (in promise): Response with status: 0  for URL: null
.......

Какой метод выбрать и в чем может быть проблема?


person Gamal Anwar    schedule 01.11.2016    source источник


Ответы (3)


Ответ со статусом: 0 для URL: null

Похоже, это связано с проблемой CORS... проверьте, включен ли CORS в вашем внутреннем коде.

Какой способ я должен использовать?

http.get() возвращает Observable, поэтому одним из способов его использования будет

getResults(){
  this.http.get('http://localhost/api.php')
           .map(res => res.json());
}

И затем, когда вы вызываете этот метод, вам нужно сделать это следующим образом:

this.yourService.getResults().subscribe((data) => { console.log(data); });

Если вам нужно вернуть обещание, то вы можете сделать это так:

getResults(){
  this.http.get('http://localhost/api.php')
           .map(res => res.json())
           .toPromise();
}

И использовать это так

this.yourService.getResults().then((data) => { console.log(data); });
person sebaferreras    schedule 01.11.2016

Если вы тестируете в браузере и сталкиваетесь с проблемами CORS, у ionic есть решение для этого. Вы должны поместить что-то подобное в ionic.config, и при запуске ionic serve это проксирует API для вас без CORS.

{
  // ...
  "proxies": [{
    "path": "/api",
    "proxyUrl": "http://xxxxxxxxx"
  }]
}

Подробнее здесь: http://blog.ionic.io/handling-cors-issues-in-ionic/

person ApriOri    schedule 26.07.2017

Похоже, это проблема CORS. Обычно вам нужно внести в белый список все домены, которым разрешен доступ к вашему API. Но поскольку вы пишете приложение Ionic, это не будет иметь значения, как только вы создадите свое приложение и запустите его на своем устройстве. Вот почему я предлагаю установить плагин для браузера, который позволяет отключить CORS.

Оба ваших фрагмента кода делают одно и то же. Если вы не хотите использовать наблюдаемые, я бы, вероятно, выбрал первый вариант:

getResults() {
    return this.http.get('http://localhost/api.php')
                    .toPromise();
}

А потом:

this.service.getResults().then(data => {
    // Do something with data
});
person Andreas Gassmann    schedule 02.11.2016