2016-08-11 5 views
1

マイAngular2(RC4)次のスニペットを使用して、私のWepApiからデータを取得します。Mozillaのカント解析JSON

getAppointment(id: number): Observable<Event> { 
    return this._http.get(this._serviceUrl + 'get/' + id) 
     .map(this.extractData) 
     .catch(this.handleError); 
} 

this.extractDataは以下のん:

private extractData(res: Response) { 
     let body = res.json(); 
     return body || {}; 
} 

をChromeで期待されるように、このすべての作品、 IE、エッジが、このエラーを投げMozillaで失敗:

JSON.parse: unexpected character at line 1 column 1 of the JSON data 

これはバック@ angluar2/HTTPモジュールstatic_response.d.tsにつながります。

static_response.d.jsで
/** 
* Attempts to return body as parsed `JSON` object, or raises an exception. 
*/ 
json(): any; 

ので:

/** 
* Attempts to return body as parsed `JSON` object, or raises an exception. 
*/ 
Response.prototype.json = function() { 
    var jsonResponse; 
    if (http_utils_1.isJsObject(this._body)) { 
     jsonResponse = this._body; 
    } 
    else if (lang_1.isString(this._body)) { 
     jsonResponse = lang_1.Json.parse(this._body); 
    } 
    return jsonResponse; 
}; 

なぜMozillaでこの仕事をdoesntの? これは@ angular2/httpのバグですか?

+1

'console.log(res.text());'を 'extractData'の先頭に追加してみてください。そこにあるものを見ることができますか?おそらく、最初の文字は '<'です。なぜなら、APIから404があるからです。 – rinukkusu

+0

実際には「<」で始まる「通常の」XMLがテキストに表示されます。 – Paul

+0

これはAPIからのエラーメッセージだと思いますか? – rinukkusu

答えて

0

私も同じ問題を抱えています。

しかし、私はブラウザの設定を変更して解決し、それが動作します。

これを行う(適切ではないが動作する)。

Open about:config in FFのタブ。 Network.http.accept.defaultを見つけてください。

値= text/htmlの、アプリケーション/ XHTML + xmlの、アプリケーション/ XML、Q = 0.9、/; Q = 0.8

新しい値= text/htmlの、アプリケーション/ XHTML + xmlの、アプリケーション/ JSON; q = 0.9、/; q = 0.8

+0

魅力的なように動作しますが、エンドユーザーにどのように伝えますか? – Paul

+0

これはあなたを助けると思う:http:// stackoverflow。com/questions/9847564/how-do-i-get-asp-net-web-api-to-return-json-xml-using-chromeの代わりに –

+0

私は顧客にこれをするように頼むことができますか? 300以上のオフィス? – bunjeeb

0

Since this is too long for a comment, I added this as an answer - if it doesn't work I'll remove it.


あなたはそうのように、あなたが誤ってXMLを取得しないように、レスポンスとしてあなたはJSON文字列を期待してサーバーに伝えるために、試してみて、明示的にAcceptヘッダを追加することができます。

getAppointment(id: number): Observable<Event> { 
    let headers = new Headers(); 
    headers.append('Accept', 'application/json'); 
    let options = new RequestOptions({ headers: headers }); 

    return this._http.get(this._serviceUrl + 'get/' + id, options) 
     .map(this.extractData) 
     .catch(this.handleError); 
} 
+0

申し訳ありません...何の変化は全く.. – Paul

+0

がお書きませんでしたあなた自身のAPI? – rinukkusu

+0

これはVSで作られた標準WebApiです。 同じようにChromeとIEがWebApiを消費していて問題は全くありません.... – Paul