2017-01-19 3 views
0

У меня есть приложение Angular2, которое пытается позвонить на мой сервер Django.Angular2 http.get (url) возвращает 404 на действительном URL-адресе - не проблема CORS

У меня есть функция getObjects, которая вызывает внешний вызов API и должна возвращать список объектов. В качестве немного отладки я в настоящее время делаю XMLHttpRequest, который правильно захватывает данные с моего сервера.

Однако, когда я пытаюсь сделать запрос с использованием Http.http.get (url), я вижу ошибку 404. Я пробовал работать с несколькими заголовками HTTP, а также играл с некоторыми настройками на моем сервере, но я не могу понять, что не так.

Я предполагаю, что метод Http.http.get() делает что-то фанк за кулисами, о которых я не знаю. Странно то, что моя вкладка dev-network моего браузера даже не показывает попытку достичь моего внешнего браузера.

Любая помощь в этом вопросе была бы очень признательна, я могу предоставить любую дополнительную информацию об отладке и действительно использовать точку в правильном направлении.

ng --version 
angular-cli: 1.0.0-beta.24 
node: 6.9.1 
os: win32 x64 
@angular/common: 2.4.3 
@angular/compiler: 2.4.3 
@angular/core: 2.4.3 
@angular/forms: 2.4.3 
@angular/http: 2.4.3 
@angular/platform-browser: 2.4.3 
@angular/platform-browser-dynamic: 2.4.3 
@angular/router: 3.4.3 
@angular/compiler-cli: 2.4.3 

import { Injectable } from '@angular/core'; 
import { Headers, Http } from '@angular/http'; 
import 'rxjs/add/operator/toPromise'; 

... 
    constructor(private http: Http) { } 

    getObjects(): Promise<Object[]> { 
    function httpGet(theUrl) 
    { 
     var xmlHttp = new XMLHttpRequest(); 
     xmlHttp.open("GET", theUrl, false); // false for synchronous request 
     xmlHttp.send(null); 
     return xmlHttp.responseText; 
    } 

    var x = httpGet(this.myUrl); 
    console.log(x); // This works perfectly and I see an entry on my server log 

    this.http.get(this.myUrl) 
    .subscribe(res => console.log(res));// This throws a 404 and I see no entry on my server logs nor in my browser network tab 

    var headers = new Headers({'content-type': 'application/json'}); 

    this.http.get(this.myUrl, {headers: headers}) 
    .subscribe(res => console.log(res));// This throws a 404 and I see no entry on my server logs nor in my browser network tab 

    return this.http.get(this.myUrl) 
     .toPromise() 
     .then(response => response.json().data as Object[]) 
     .catch(this.handleError); //The original code that worked on an internal in-memory-api 
    } 
+0

Стоит отметить, что сообщение 404 распечатывает URL-адрес, к которому он не может получить доступ. Если я нажму на этот URL-адрес, он будет работать и, как показано в моем примере кода, XMLHttpRequest.open() использует одну и ту же переменную url; поэтому URL должен быть чистым. Я также могу установить соединение с использованием других библиотек, поэтому он не должен быть проблемой CORS или иметь какое-либо отношение к моему серверу API. Любые мысли? – SuperTetelman

+0

Просто была та же проблема, спасибо – Dan

ответ

3

Я был в состоянии найти рабочее исправление в другой переполнения стека вопрос:

Angular 2 HTTP GET returning URL null

Проблема была с InMemoryWebApiModule и решение заключалось в том, чтобы сделать следующее изменение конфигурации в файле app.module.ts:

- InMemoryWebApiModule.forRoot(InMemoryDataService), 
+ InMemoryWebApiModule.forRoot(InMemoryDataService, {passThruUnknownUrl: true}), 

Выполнение этого небольшого изменения конфигурации заставило приложение работать.

+0

Спасибо, человек, которого вы экономите весь день +1 –

2

Фактически нет 404, поскольку вы не выполняете свои запросы. Вам нужно subscribe() им, чтобы выполнить их. Несколько примеров:

this.http.get(this.myUrl).subscribe(res => console.log(res)); 
this.http.get(this.myUrl).subscribe(); 
let response: Observable<Response> = this.http.get(this.myUrl); 
response.subscribe(); 
response.subscribe(v => console.log(v); 

Вы можете прочитать о наблюдаемых здесь: http://reactivex.io/rxjs/manual/index.html

+0

Если вы посмотрите на дно моего кода, я конвертировал Observable в Promise в исходный код; Я забыл добавить некоторые строки в код отладки. В любом случае, строка ** this.http.get (this.myUrl) .subscribe (res => console.log (res)); ** Все еще возвращает мне 404. – SuperTetelman

+0

О, ты прав. Я пропустил это –

+0

Я только что обновил образец кода, чтобы это отразить. Спасибо, за улов. – SuperTetelman

0

Это может быть проблема с угловым2-in-memory-web-api. У меня была такая же проблема, но когда я удалил InMemoryWebApiModule из AppModule, вызовы API отлично работали.

 Смежные вопросы

  • Нет связанных вопросов^_^