Angular HttpClientにHTTPヘッダーを追加してもヘッダーが送信されないのはなぜですか?


181

これが私のコードです:

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

logIn(username: string, password: string) {
    const url = 'http://server.com/index.php';
    const body = JSON.stringify({username: username,
                                 password: password});
    const headers = new HttpHeaders();
    headers.set('Content-Type', 'application/json; charset=utf-8');
    this.http.post(url, body, {headers: headers}).subscribe(
        (data) => {
            console.log(data);
        },
        (err: HttpErrorResponse) => {
            if (err.error instanceof Error) {
                console.log('Client-side error occured.');
            } else {
                console.log('Server-side error occured.');
            }
        }
    );
}

そしてここでネットワークデバッグ:

Request Method:POST
Status Code:200 OK
Accept:application/json, text/plain, */*
Accept-Encoding:gzip, deflate
Accept-Language:en-US,en;q=0.8
Cache-Control:no-cache
Connection:keep-alive
Content-Length:46
Content-Type:text/plain

データは「リクエストペイロード」に保存されていますが、サーバーでPOST値を受信して​​いません。

print_r($_POST);
Array
(
)

エラーはPOST中に設定されなかったヘッダーが原因であると思います。


はい、ありがとう!しかし、バックエンドでデータを受信しなかった後、application / x-www-form-urlencodedに行きました。とにかく、主な質問は答えです
Frennetix

取り扱いカスタムヘッダーとエラーでRESTfulなAPIを消費するには、この角度8 HTTPClientの例をチェックfreakyjolly.com/...を
コードスパイ

回答:


310

新しいHttpHeaderクラスのインスタンスは不変のオブジェクトです。クラスメソッドを呼び出すと、結果として新しいインスタンスが返されます。したがって、基本的には、次のことを行う必要があります。

let headers = new HttpHeaders();
headers = headers.set('Content-Type', 'application/json; charset=utf-8');

または

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

更新:複数のヘッダーを追加する

let headers = new HttpHeaders();
headers = headers.set('h1', 'v1').set('h2','v2');

または

const headers = new HttpHeaders({'h1':'v1','h2':'v2'});

更新:HttpClientヘッダーとパラメーターのオブジェクトマップを受け入れる

5.0.0-beta.6以降、HttpHeadersオブジェクトの作成をスキップして、オブジェクトマップを引数として直接渡すことができるようになりました。したがって、次のことが可能になります。

http.get('someurl',{
   headers: {'header1':'value1','header2':'value2'}
});

50
面白い。したがって、OOの世界から来た私たちにとって、setメソッド名はやや誤解を招きやすいものです。
tishma 2017

3
複数のヘッダーを設定する場合はどうなりますか?コメントをチェーニングしようとしましたHttpHeaders().set(..).set(..)が、ヘッダーがHTTPヘッダーフィールドに書き込まれません。
displayname '11

srcgithub.com/angular/angular/blob/master/packages/common/http/src/…に従って、正常に動作するはずです。私はあなたの問題(コード)に関する詳細な情報なしでこれ以上あなたを助けることはできません
Jota.Toledo

したがって、私の場合、引数のリストのヘッダーとパラメーターを関数に切り替えることでミスを犯しました(どちらもjsonオブジェクトを受け入れたため)。つまり、間違いに注意し、タイプとしてのHttpHeadersは結局のところ良い習慣です。オフトピック:オブジェクトをどこでも使用できる場合は、TypeScriptではなくVanillaJSを使用してください。
–danger89

3
ヘッダーとリクエストが不変になっているのはなぜですか?angular.io/guide/http#immutability
Drellgor

23

複数のパラメーターまたはヘッダーを追加するには、次の操作を実行できます。

constructor(private _http: HttpClient) {}

//....

const url = `${environment.APP_API}/api/request`;

let headers = new HttpHeaders().set('header1', hvalue1); // create header object
headers = headers.append('header2', hvalue2); // add a new header, creating a new object
headers = headers.append('header3', hvalue3); // add another header

let params = new HttpParams().set('param1', value1); // create params object
params = params.append('param2', value2); // add a new param, creating a new object
params = params.append('param3', value3); // add another param 

return this._http.get<any[]>(url, { headers: headers, params: params })

1
この方法も機能しないようです。つまり、ヘッダーを追加すると、ヘッダーがlazyUpdateプロパティに表示されますが、CreateListFromArrayLikeサブスクライブしてリクエストを有効にすると、最終的に例外が発生してクラッシュします。
Jago 2017年

3
複数のヘッダーを追加するには、以下を使用します。headers:HttpHeaders = new HttpHeaders({'Application-Id':this.appId、 "REST-API-Key":this.apiKey、 "Content-Type": "application / json"});
ベンソン2017

13

以下のようにhttpヘッダーをhttpリクエストに設定します

return this.http.get(url, { headers: new HttpHeaders({'Authorization': 'Bearer ' + token})
 });

5

私はこれに長い間苦労しました。私はAngular 6を使用していますが、

let headers = new HttpHeaders();
headers = headers.append('key', 'value');

動作しませんでした。しかし、うまくいったのは

let headers = new HttpHeaders().append('key', 'value');

不変であることに気づくとき、それは理にかなっています。したがって、ヘッダーを作成すると、それに追加することはできません。私は試していませんが、疑っています

let headers = new HttpHeaders();
let headers1 = headers.append('key', 'value');

も動作します。


最初の試みはうまくいくはずです。追加の結果をheaders変数に割り当てます。現在、あなたの説明は意味をなしません、特にあなたの最後の推測は、追加するlet ことでそれを修正できるかもしれないと思っています
Juan Mendes

3

私はAngular 8を使用していましたが、私のために機能したのはこれだけでした:

  getCustomHeaders(): HttpHeaders {
    const headers = new HttpHeaders()
      .set('Content-Type', 'application/json')
      .set('Api-Key', 'xxx');
    return headers;
  }

2

マニュアル(https://angular.io/guide/http)では、次のように書いています:HttpHeadersクラスは不変なので、すべてのset()が新しいインスタンスを返し、変更を適用します。

次のコードは、angular-4で動作します。

 return this.http.get(url、{headers:new HttpHeaders()。set( 'UserEmail'、email)});

0

私のレガシーアプリでは、プロトタイプjsのArray.fromがAngularのArray.fromと競合していたため、この問題が発生していました。私はangularのArray.fromバージョンを保存し、プロトタイプのロード後に再割り当てすることで解決しました。


-3

エラー処理カスタムヘッダーを含むAngular 8 HttpClientサービスの例

    import { Injectable } from '@angular/core';
    import { HttpClient, HttpHeaders, HttpErrorResponse } from '@angular/common/http';
    import { Student } from '../model/student';
    import { Observable, throwError } from 'rxjs';
    import { retry, catchError } from 'rxjs/operators';

    @Injectable({
      providedIn: 'root'
    })
    export class ApiService {

      // API path
      base_path = 'http://localhost:3000/students';

      constructor(private http: HttpClient) { }

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

      // Handle API errors
      handleError(error: HttpErrorResponse) {
        if (error.error instanceof ErrorEvent) {
          // A client-side or network error occurred. Handle it accordingly.
          console.error('An error occurred:', error.error.message);
        } else {
          // The backend returned an unsuccessful response code.
          // The response body may contain clues as to what went wrong,
          console.error(
            `Backend returned code ${error.status}, ` +
            `body was: ${error.error}`);
        }
        // return an observable with a user-facing error message
        return throwError(
          'Something bad happened; please try again later.');
      };


      // Create a new item
      createItem(item): Observable<Student> {
        return this.http
          .post<Student>(this.base_path, JSON.stringify(item), this.httpOptions)
          .pipe(
            retry(2),
            catchError(this.handleError)
          )
      }

      ....
      ....

ここに画像の説明を入力してください

完全な例のチュートリアルをここで確認してください


3
それは私ですか、それとも質問に対するこのようなやりすぎですか?
Ojonugwa Jude Ochalifu

3
これはOPの質問に答えようとするものではありません。何の説明もないコードの集まりです。
Jota.Toledo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.