Açısal HttpClient'e bir HTTP üstbilgisi eklemek üstbilgiyi göndermiyor, neden?


181

İşte benim kod:

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.');
            }
        }
    );
}

ve burada ağ hata ayıklama:

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

ve Veriler 'Yük Talep Et' bölümünde saklanır ancak sunucumda POST değerleri alınmaz:

print_r($_POST);
Array
(
)

Hatanın POST sırasında ayarlanmayan başlıktan geldiğine inanıyorum, ne yaptım?


Evet teşekkürler! Ancak Arka Uçumda veri almadıktan sonra / x-www-form-urlencoded uygulamasına gittim. Her neyse ana soru anserwerd
Frennetix

RESTFul API'sini özel üstbilgi ve Hata İşleme ile tüketmek için bu Açısal 8 HTTPClient örneğini kontrol edin freakyjolly.com/…
Code Spy

Yanıtlar:


311

Yeni HttpHeadersınıfın örnekleri değişmez nesnelerdir. Sınıf yöntemlerini çağırmak sonuç olarak yeni bir örneği döndürür. Temel olarak, aşağıdakileri yapmanız gerekir:

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

veya

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

Güncelleme: birden çok başlık ekleme

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

veya

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

Güncelleme: HttpClient üstbilgileri ve parametreleri için nesne haritasını kabul et

Yana 5.0.0-beta.6 bir oluşturulmasını atlamak artık mümkün HttpHeadersnesne bir doğrudan argüman olarak bir nesne harita geçmektedir. Şimdi aşağıdakileri yapmak mümkün:

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

50
İlginç. Yani, OO dünyasından gelen bizim için, setyöntem adı biraz yanıltıcı.
tishma

3
Birden çok başlık ayarlamak istersem ne olur? Ben yorum zincirini denedim HttpHeaders().set(..).set(..)ama şimdi yine başlıklar HTTP başlık alanlarına yazılmıyor ?!
görünen ad

Src github.com/angular/angular/blob/master/packages/common/http/src/… 'a göre düzgün çalışmalıdır . Sorununuz hakkında daha fazla bilgi almadan size daha fazla yardımcı
olamıyorum

Benim durumumda, argümanlar listesindeki başlıkları ve parametreleri bir işleve (her ikisi de bir json nesnesini kabul ettiğinden) değiştirerek bir hata yaptım. Yani sadece hatalara dikkat edin ve HttpHeaders türü olarak her şeyden önce iyi bir uygulamadır .. Konu dışı: Nesneleri her yerde kullanabildiğinizde TypeScript değil VanillaJS kullanın.
danger89

3
Üstbilgiler ve istekler neden değiştirilemedi? angular.io/guide/http#immutability
Drellgor

23

Birden çok parametre veya başlık eklemek için aşağıdakileri yapabilirsiniz:

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
Bu yöntem de işe yaramıyor gibi görünüyor. Yani, üstbilgileri ekleyebilirsiniz ve bunlar lazyUpdateözellikte gösterilecek, ancak sonunda CreateListFromArrayLikeisteği abone olarak etkin hale getirirken istisna ile çökecektir.
Jago

3
Birden çok başlık eklemek için şunu kullanın: başlıklar: HttpHeaders = new HttpHeaders ({'Application-Id': this.appId, "REST-API-Key": this.apiKey, "Content-Type": "application / json"});
Benson

13

http isteğinizde http üstbilgilerini aşağıdaki gibi ayarlayın

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

5

Bununla uzun süre mücadele ettim. Açısal 6 kullanıyorum ve buldum

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

işe yaramadı. Ama işe yarayan neydi

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

değişmez olduklarını fark ettiğinizde mantıklı. Yani bir başlık oluşturduktan sonra ona bir başlık ekleyemezsiniz. Denemedim, ama şüpheliyim

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

çok işe yarar.


İlk denemeniz işe yarayacak, ekleme sonucunu headers değişkenine atayacaksınız. Şu anda senin açıklaman bir anlam, bir ekleme olduğunu özel olarak son tahmin yapmaz let olabilir düzeltmek
Juan Mendes

3

Açısal 8 ile birlikteydim ve benim için çalışan tek şey şuydu:

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

2

Kılavuzda ( https://angular.io/guide/http ) Okudum: HttpHeaders sınıfı değiştirilemez, bu nedenle her set () yeni bir örnek döndürür ve değişiklikleri uygular.

Aşağıdaki kod açısal-4 ile benim için çalışıyor:

 return this.http.get (url, {headers: new HttpHeaders (). set ('UserEmail', e-posta)});

0

Benim eski app prototip js Array.from bu soruna neden açısal Array.from ile çelişiyordu. Angular'ın Array.from sürümünü kaydedip prototip yüklendikten sonra yeniden atayarak çözdüm.


-3

Hata İşleme ve Özel Başlığa Sahip Açısal 8 HttpClient Hizmeti örneği

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

      ....
      ....

resim açıklamasını buraya girin

Örnek öğreticinin tamamını buradan kontrol edin


3
Ben mi yoksa sorulan soru için bu biraz abartılı mı?
Ojonugwa Jude Ochalifu

3
Bu OP'lerin sorusunu cevaplamaya çalışmaz. Hiçbir açıklama ile kod sadece bir demet.
Jota.Toledo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.