Làm cách nào để chuyển đối số url (chuỗi truy vấn) cho yêu cầu HTTP trên Angular?


265

Tôi đang tạo một yêu cầu HTTP trên Angular, nhưng tôi không biết cách thêm đối số url (chuỗi truy vấn) vào nó.

this.http.get(StaticSettings.BASE_URL).subscribe(
  (response) => this.onGetForecastResult(response.json()),
  (error) => this.onGetForecastError(error.json()),
  () => this.onGetForecastComplete()
);

Bây giờ, StaticSinstall.BASE_URL của tôi giống như một url không có chuỗi truy vấn như: http://atsomeplace.com/ nhưng tôi muốn nó là http://atsomeplace.com/?var1=val1&var2=val2

Trường hợp var1 và var2 phù hợp với đối tượng yêu cầu http của tôi? Tôi muốn thêm chúng như một đối tượng.

{
  query: {
    var1: val1,
    var2: val2
  }
}

và sau đó chỉ cần mô-đun http thực hiện công việc phân tích nó thành chuỗi truy vấn URL.


stackoverflow.com/questions/26541801/ từ tham khảo điều này. Tạo URL trước khi gọi và chuyển nó đến chức năng đăng ký thay cho BASE_URL. 2cents
pratikpawar

Câu trả lời:


329

Các HttpClient phương pháp cho phép bạn thiết lập các params trong các tùy chọn của nó.

Bạn có thể định cấu hình nó bằng cách nhập httpClientModule từ gói @ angular / common / http.

import {HttpClientModule} from '@angular/common/http';

@NgModule({
  imports: [ BrowserModule, HttpClientModule ],
  declarations: [ App ],
  bootstrap: [ App ]
})
export class AppModule {}

Sau đó, bạn có thể tiêm httpClient và sử dụng nó để thực hiện yêu cầu.

import {HttpClient} from '@angular/common/http'

@Component({
  selector: 'my-app',
  template: `
    <div>
      <h2>Hello {{name}}</h2>
    </div>
  `,
})
export class App {
  name:string;
  constructor(private httpClient: HttpClient) {
    this.httpClient.get('/url', {
      params: {
        appid: 'id1234',
        cnt: '5'
      },
      observe: 'response'
    })
    .toPromise()
    .then(response => {
      console.log(response);
    })
    .catch(console.log);
  }
}

Đối với các phiên bản góc cạnh trước phiên bản 4, bạn có thể thực hiện tương tự bằng cách sử dụng HTTP dịch vụ .

Các Http.get phương pháp có một đối tượng mà cụ RequestOptionsArgs như một tham số thứ hai.

Trường tìm kiếm của đối tượng đó có thể được sử dụng để đặt chuỗi hoặc URLSearchParams đối tượng .

Một ví dụ:

 // Parameters obj-
 let params: URLSearchParams = new URLSearchParams();
 params.set('appid', StaticSettings.API_KEY);
 params.set('cnt', days.toString());

 //Http request-
 return this.http.get(StaticSettings.BASE_URL, {
   search: params
 }).subscribe(
   (response) => this.onGetForecastResult(response.json()), 
   (error) => this.onGetForecastError(error.json()), 
   () => this.onGetForecastComplete()
 );

Các tài liệu cho lớp http có nhiều chi tiết hơn. Nó có thể được tìm thấy ở đây và một ví dụ làm việc ở đây .


2
Một ý chính: gist.github.com/MiguelLattuada/bb502d84854ad9fc26e0 cách sử dụng đối tượng URLSearchParams, cảm ơn một lần nữa @toskv
Miguel Lattuada

1
Siêu hấp dẫn với URLSearchParams! Đã giải quyết vấn đề của tôi với việc tuần tự hóa đối tượng JSON.
Logan H

2
@SukumarMS thực sự không cần bất cứ điều gì đặc biệt vì đó là một phần của con đường. Chỉ cần nối chuỗi 'blabla.com/page/' + page + '/ activeFilter' + activeFilter. Hoặc nếu bạn muốn sử dụng mẫu chữ `blabla.com/page / $ {page} / $ {activeFilter}`.
toskv

10
cái này hiệu quả với tôi:http.get(url, {params: {var1: val1, var2: val2}})
Alexander Suvorov

8
searchtài sản đã được phân bổ từ 4.0.0 -> sử dụng paramsthay thế
Botanman

180

Chỉnh sửa góc> = 4.3.x

HttpClient đã được giới thiệu cùng với HttpParams . Dưới đây là một ví dụ về việc sử dụng:

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

constructor(private http: HttpClient) { }

let params = new HttpParams();
params = params.append('var1', val1);
params = params.append('var2', val2);

this.http.get(StaticSettings.BASE_URL, {params: params}).subscribe(...);

(Câu trả lời cũ)

Chỉnh sửa góc> = 4.x

requestOptions.searchđã bị phản đối Sử dụng requestOptions.paramsthay thế:

let requestOptions = new RequestOptions();
requestOptions.params = params;

Câu trả lời gốc (Góc 2)

Bạn cần nhập URLSearchParamsnhư bên dưới

import { Http, RequestOptions, URLSearchParams } from '@angular/http';

Và sau đó xây dựng các tham số của bạn và thực hiện yêu cầu http như sau:

let params: URLSearchParams = new URLSearchParams();
params.set('var1', val1);
params.set('var2', val2);

let requestOptions = new RequestOptions();
requestOptions.search = params;

this.http.get(StaticSettings.BASE_URL, requestOptions)
    .toPromise()
    .then(response => response.json())
...

3
Không làm việc cho tôi. Tôi đã đào sâu vào mã nguồn và thấy rằng tham số thứ hai của http.get mong đợi giao diện RequestOptionsArss, mà URLSearchParams không triển khai. Bao bọc searchParams bên trong một đối tượng RequestOptions hoạt động. Sẽ rất tốt để có một phím tắt mặc dù.
hardsetting

3
Bạn hoàn toàn đúng, tôi quên mất RequestOptions. Tôi cập nhật câu trả lời của tôi.
Radouane ROUFID

1
Cảm ơn đã chỉ ra sự phản đối của search. Đã sửa lỗi thăm dò của tôi
Hayden Braxton

Cảm ơn bạn đã chỉ ra sự thay đổi này! Tất cả các tài liệu và vấn đề tôi tìm thấy trong nhiều giờ đã bảo tôi gắn params vào searchtài sản.
rayepps

63

Phiên bản 5+

Với Angular 5 trở lên, bạn KHÔNG phải sử dụng HttpParams . Bạn có thể trực tiếp gửi đối tượng json của bạn như dưới đây.

let data = {limit: "2"};
this.httpClient.get<any>(apiUrl, {params: data});

Xin lưu ý rằng các giá trị dữ liệu phải là chuỗi, nghĩa là; { params: {limit: "2"}}

Phiên bản 4.3.x +

Sử dụng HttpParams, HttpClient từ @ angular / common / http

import { HttpParams, HttpClient } from '@angular/common/http';
...
constructor(private httpClient: HttpClient) { ... }
...
let params = new HttpParams();
params = params.append("page", 1);
....
this.httpClient.get<any>(apiUrl, {params: params});

Có thể giúp một số!


@BrunoPeres thử xâu chuỗi đối tượng lồng nhau của bạn bằng cách sử dụngJSON.stringify()
Rahmathullah M

1
@RahmathullahM - bichu, THX :)
Jamsheer

12

Góc 6

Bạn có thể truyền các tham số cần thiết để nhận cuộc gọi bằng cách sử dụng params:

this.httpClient.get<any>(url, { params: x });

trong đó x = {thuộc tính: "123"}.

Đối với chức năng api ghi "123":

router.get('/example', (req, res) => {
    console.log(req.query.property);
})

2
Đó là một thay đổi được thêm vào trong phiên bản 5. Đã được thêm vào đây stackoverflow.com/a/45455904/3276721
Miguel Lattuada

9

Ví dụ của tôi

private options = new RequestOptions({headers: new Headers({'Content-Type': 'application/json'})});

Phương pháp của tôi

  getUserByName(name: string): Observable<MyObject[]> {
    //set request params
    let params: URLSearchParams = new URLSearchParams();
    params.set("name", name);
    //params.set("surname", surname); for more params
    this.options.search = params;

    let url = "http://localhost:8080/test/user/";
    console.log("url: ", url);

    return this.http.get(url, this.options)
      .map((resp: Response) => resp.json() as MyObject[])
      .catch(this.handleError);
  }

  private handleError(err) {
    console.log(err);
    return Observable.throw(err || 'Server error');
  }

trong thành phần của tôi

  userList: User[] = [];
  this.userService.getUserByName(this.userName).subscribe(users => {
      this.userList = users;
    });

Bởi người đưa thư

http://localhost:8080/test/user/?name=Ethem

6

Trong Angular 7/8 mới nhất, bạn có thể sử dụng cách tiếp cận đơn giản nhất: -

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

getDetails(searchParams) {
    const httpOptions = {
        headers: { 'Content-Type': 'application/json' },
        params: { ...searchParams}
    };
    return this.http.get(this.Url, httpOptions);
}

Điều này sẽ không hoạt động nếu bất kỳ searchParamsthuộc tính 'nào không phải là stringgiá trị.
Yulian

5

Nếu bạn có kế hoạch gửi nhiều hơn một tham số.

Thành phần

private options = {
  sort:   '-id',
  select: null,
  limit:  1000,
  skip:   0,
  from:   null,
  to:     null
};

constructor(private service: Service) { }

ngOnInit() {
  this.service.getAllItems(this.options)
    .subscribe((item: Item[]) => {
      this.item = item;
    });
}

Dịch vụ

private options = new RequestOptions({headers: new Headers({'Content-Type': 'application/json'})});
constructor(private http: Http) { }

getAllItems(query: any) {
  let params: URLSearchParams = new URLSearchParams();
  for(let key in query){
    params.set(key.toString(), query[key]);
  }
  this.options.search = params;
  this.header = this.headers();

Và tiếp tục với yêu cầu http của bạn như cách @ethemsulan đã làm.

Tuyến bên máy chủ

router.get('/api/items', (req, res) => {
  let q = {};
  let skip = req.query.skip;
  let limit = req.query.limit;
  let sort  = req.query.sort;
  q.from = req.query.from;
  q.to = req.query.to;

  Items.find(q)
    .skip(skip)
    .limit(limit)
    .sort(sort)
    .exec((err, items) => {
      if(err) {
        return res.status(500).json({
          title: "An error occurred",
          error: err
        });
      }
      res.status(200).json({
        message: "Success",
        obj:  items
      });
    });
});

Trong yêu cầu nhận dịch vụ của bạn, tôi thiếu cách bạn xử lý yêu cầu nhận.
Winnemucca

Ồ tôi đoán bạn sẽ đặt yêu cầu nhận http trong phương thức đó như một sự trở lại giống như câu trả lời của
ethumsulan

2

Bạn có thể sử dụng HttpParams từ @ angular / common / http và truyền một chuỗi với truy vấn. Ví dụ:

import { HttpClient, HttpParams } from '@angular/common/http';
const query = 'key=value' // date=2020-03-06

const options = {
  params: new HttpParams({
    fromString: query
  })
}

Bây giờ trong mã của bạn

this.http.get(urlFull, options);

Và điều này làm việc cho bạn :)

Tôi nhảy giúp bạn


0
import ...
declare var $:any;
...
getSomeEndPoint(params:any): Observable<any[]> {
    var qStr = $.param(params); //<---YOUR GUY
    return this._http.get(this._adUrl+"?"+qStr)
      .map((response: Response) => <any[]> response.json())
      .catch(this.handleError);
}

với điều kiện bạn đã cài đặt jQuery , tôi làm npm i jquery --savevà đưa apps.scriptsvàoangular-cli.json


0
import { Http, Response } from '@angular/http';
constructor(private _http: Http, private router: Router) {
}

return this._http.get('http://url/login/' + email + '/' + password)
       .map((res: Response) => {
           return res.json();
        }).catch(this._handleError);

0

Bạn có thể sử dụng Thông số Url từ tài liệu chính thức.

Thí dụ: this.httpClient.get(this.API, { params: new HttpParams().set('noCover', noCover) })

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.