2017-01-19 3 views
0

Ich habe eine Angular2-App ausgeführt, die versucht, einen Anruf an meinen Django-Server zu machen.Angular2 http.get (URL) gibt 404 auf eine gültige URL zurück - kein CORS-Problem

Ich habe eine Funktion namens getObjects, die die externe API aufruft und sollte eine Liste von Objekten zurückgeben. Als kleines Debugging mache ich gerade eine XMLHttpRequest, die die Daten von meinem Server korrekt erfasst.

Wenn ich jedoch versuche, eine Anfrage mit Http.http.get (URL) zu machen, sehe ich einen Fehler 404. Ich habe versucht, mit einigen der HTTP-Header herumzuspielen und mit einigen Einstellungen auf meinem Server herumzuspielen, aber ich kann nicht herausfinden, was falsch ist.

Ich nehme an, dass die Http.http.get() -Methode etwas irre hinter den Kulissen tut, von dem ich nichts achte. Das Seltsame ist, dass mein Browser dev-network tab nicht einmal versucht, meinen externen Browser zu erreichen.

Jede Hilfe in der Sache würde sehr geschätzt werden, kann ich zusätzliche Debug-Informationen zur Verfügung stellen und könnte wirklich einen Punkt in die richtige Richtung verwenden.

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

Es ist erwähnenswert, dass die Nachricht 404 die URL ausgibt, auf die sie nicht zugreifen konnte. Wenn ich auf diese URL klicke, funktioniert es und wie in meinem Beispielcode zu sehen, verwendet die XMLHttpRequest.open() dieselbe URL-Variable; Also sollte die URL sauber sein. Ich bin auch in der Lage, eine Verbindung mit anderen Bibliotheken zu machen, so sollte es kein Problem mit CORS sein, oder etwas mit meinem API-Server zu tun haben. Irgendwelche Gedanken? – SuperTetelman

+0

Ich hatte gerade das gleiche Problem, danke – Dan

Antwort

3

konnte ich eine Arbeits fix in einem anderen Stack-Überlauf Frage finden:

Angular 2 HTTP GET returning URL null

Das Problem war, mit das InMemoryWebApiModule und die Lösung bestand darin, die folgende Konfigurationsänderung in meiner app.module.ts Datei vorzunehmen:

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

Durch diese kleine Konfigurationsänderung wurde die Anwendung funktionsfähig.

+0

Danke Mann, du sparst meinen ganzen Tag +1 –

2

In der Tat gibt es keine 404, weil Sie Ihre Anfragen nicht ausführen. Sie müssen subscribe() zu ihnen, um sie auszuführen. Einige Beispiele:

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); 

Sie können über Observablen hier lesen: http://reactivex.io/rxjs/manual/index.html

+0

Wenn Sie auf den Grund meines Codes schauen, konvertierte ich das Observable zu einem Versprechen im ursprünglichen Code; Ich habe vergessen, einige Zeilen im Debug-Code hinzuzufügen. In jedem Fall die Zeile ** this.http.get (this.myUrl) .subscribe (res => console.log (res)); ** Gibt immer noch eine 404 für mich zurück. – SuperTetelman

+0

Ohh du hast recht. Ich vermisse das –

+0

Ich habe gerade den Beispielcode aktualisiert, um das zu reflektieren. Danke, für den Fang. – SuperTetelman

0

Dies kann ein Problem mit angular2-in-memory-web-api sein. Ich hatte das gleiche Problem, aber als ich die InMemoryWebApiModule aus dem AppModule entfernte, funktionierten die API-Aufrufe perfekt.

Verwandte Themen