2016-11-01 15 views
2

Я попытался сделать вызов http.get() этими двумя способами.Ionic 2 http.get() issue

Первое:

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 
....... 

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

ответ

3

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

Это, кажется, связано с вопросом 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); }); 
0

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

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

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

А потом:

this.service.getResults().then(data => { 
    // Do something with data 
}); 
1

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

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

Больше информации здесь: http://blog.ionic.io/handling-cors-issues-in-ionic/

+0

Да. Это исправило мою проблему. 1 голос вверх;) –