web-dev-qa-db-ja.com

POST 2でAngular JSONを使用するにはどうすればよいですか?

私が間違っていることを理解していません。jsonを取得しようとすると、サーバーは「undefined」を返します。

POST(url, data) {
        var headers = new Headers(), authtoken = localStorage.getItem('authtoken');
        headers.append("Content-Type", 'application/json');

        if (authtoken) {
        headers.append("Authorization", 'Token ' + authtoken)
        }
        headers.append("Accept", 'application/json');

        var requestoptions = new RequestOptions({
            method: RequestMethod.Post,
            url: this.apiURL + url,
            headers: headers,
            body: data
        })

        return this.http.request(new Request(requestoptions))
        .map((res: Response) => {
            if (res) {
                return { status: res.status, json: res.json() }
            }
        });
    }

そして私の機能:

login(username, password) {
        this.POST('login/', {test: 'test'}).subscribe(data => {
            console.log(data)
        })
    }

これを試すと、リクエストの本文は次のようになります。

enter image description here

したがって、実際のjsonを送信する代わりに、単に「[object Object]」を送信します。 「リクエストペイロード」の代わりに「JSON」にする必要があります。私は何を間違えていますか?

24
Sebastian Olsen

ペイロードを文字列化する必要があります

var requestoptions = new RequestOptions({
            method: RequestMethod.Post,
            url: this.apiURL + url,
            headers: headers,
            body: JSON.stringify(data)
        })
13
Ankit Singh

しばらくの間、jsonデータをAngularに投稿する質問に対する視覚的な答えを探していましたが、役に立ちませんでした。私は最終的に何かが機能するようになったので、共有しましょう:

インライン

タイプTのjsonレスポンスボディを期待していると仮定しましょう。

const options = {headers: {'Content-Type': 'application/json'}};
this.http.post<T>(url, JSON.stringify(data), options).subscribe(
    (t: T) => console.info(JSON.stringify(t))
);

公式ドキュメント

拡張可能なクラス

import { HttpClient, HttpHeaders } from '@angular/common/http';

export class MyHttpService {
  constructor(protected http: HttpClient) {}

  headers = new HttpHeaders({
    'Content-Type': 'application/json'
  });

  postJson<T>(url: string, data: any): Observable<T> {
    return this.http.post<T>(
      url,
      JSON.stringify(data),
      {headers: this.headers}
    )
  }

要旨

最初は、このような入れ子になったcontent-typeを渡す方法を見逃していました。

{headers:{'Content-Type': 'application/json'}}
20
Arnaud P

ヘッダーは

'Content-Type': 'application/json'

そして

 body: data

あるべき

 body: JSON.stringify(data);
1