วิธีส่งอาร์กิวเมนต์ url (สตริงแบบสอบถาม) ไปยังคำขอ HTTP บน Angular ได้อย่างไร


265

ฉันกำลังสร้างคำขอ HTTP บน Angular แต่ฉันไม่ทราบวิธีเพิ่มอาร์กิวเมนต์ url (สตริงแบบสอบถาม)

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

ตอนนี้ StaticSettings.BASE_URL ของฉันเป็นเหมือน url ที่ไม่มีสตริงข้อความค้นหา: http://atsomeplace.com/แต่ฉันต้องการให้เป็นhttp://atsomeplace.com/?var1=val1&var2=val2

ที่ var1 และ var2 พอดีกับวัตถุขอ Http ของฉัน ฉันต้องการที่จะเพิ่มพวกเขาเหมือนวัตถุ

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

จากนั้นเพียงแค่โมดูล Http ทำงานเพื่อแยกมันลงในสตริงการสืบค้น URL


stackoverflow.com/questions/26541801/…อ้างถึงสิ่งนี้ สร้าง URL ก่อนการโทรและส่งผ่านไปยังฟังก์ชันสมัครสมาชิกแทนที่ BASE_URL 2
เซ็นต์

คำตอบ:


329

HttpClientวิธีช่วยให้คุณสามารถตั้งค่าพารามิเตอร์ในตัวเลือกของมัน

คุณสามารถกำหนดค่าได้โดยการนำเข้าHttpClientModuleจากแพ็คเกจ @ angular / common / http

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

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

หลังจากนั้นคุณสามารถฉีดHttpClientและใช้เพื่อดำเนินการตามคำขอ

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

สำหรับเวอร์ชันเชิงมุมก่อนหน้าเวอร์ชัน 4 คุณสามารถทำได้เช่นเดียวกันโดยใช้บริการHttp

กระบวนการHttp.getใช้วัตถุที่ใช้RequestOptionsArgsเป็นพารามิเตอร์ที่สอง

การค้นหาข้อมูลของวัตถุที่สามารถนำมาใช้ในการตั้งสตริงหรือURLSearchParamsวัตถุ

ตัวอย่าง:

 // 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()
 );

เอกสารสำหรับคลาสHttpมีรายละเอียดเพิ่มเติม มันสามารถพบได้ที่นี่และตัวอย่างการทำงานที่นี่


2
สรุปสาระสำคัญ: gist.github.com/MiguelLattuada/bb502d84854ad9fc26e0วิธีใช้วัตถุ URLSearchParams ขอขอบคุณอีกครั้ง @toskv
Miguel Lattuada

1
ลื่นสุด ๆ ด้วย URLSearchParams! แก้ไขปัญหาของฉันด้วยวัตถุ JSON เป็นอันดับ
Logan H

2
@SukumarMS ไม่จำเป็นต้องมีอะไรเป็นพิเศษเพราะมันเป็นส่วนหนึ่งของเส้นทาง เพียงเชื่อมสตริง 'blabla.com/page/' + page + '/ activeFilter' + activeFilter หรือถ้าคุณต้องการใช้เทมเพลตตัวอักษร `blabla.com/page / $ {page} / $ {activeFilter}`
toskv

10
สิ่งนี้ใช้ได้กับฉัน:http.get(url, {params: {var1: val1, var2: val2}})
Alexander Suvorov

8
searchพร็อพเพอร์ตี้ได้รับการแทนที่จาก 4.0.0 -> ใช้paramsแทน
BotanMan

180

แก้ไข Angular> = 4.3.x

HttpClientได้รับการแนะนำพร้อมกับHttpParams ตัวอย่างการใช้งานด้านล่าง:

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(...);

(คำตอบเก่า)

แก้ไขเชิงมุม> = 4.x

requestOptions.searchเลิกใช้แล้ว ใช้requestOptions.paramsแทน:

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

คำตอบเดิม (เชิงมุม 2)

คุณต้องนำเข้าURLSearchParamsดังนี้

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

จากนั้นสร้างพารามิเตอร์ของคุณและทำการร้องขอ http ดังต่อไปนี้:

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
ไม่ทำงานสำหรับฉัน ฉันขุดลงในซอร์สโค้ดและพบว่าพารามิเตอร์ตัวที่สองของ http.get คาดว่าจะมีส่วนต่อประสาน RequestOptionsArgs ซึ่ง URLSearchParams ไม่ได้ใช้งาน การห่อ searchParams ภายในวัตถุ RequestOptions ทำงาน จะดีถ้ามีทางลัด
hardsetting

3
RequestOptionsคุณมีสิทธิทั้งหมดผมลืม ฉันปรับปรุงคำตอบของฉัน
Radouane ROUFID

1
searchขอขอบคุณที่ชี้ออกมาคัดค้านของ แก้ไขปัญหาของฉัน
Hayden Braxton

ขอบคุณสำหรับการชี้การเปลี่ยนแปลงนี้! เอกสารและปัญหาทั้งหมดที่ฉันพบมาหลายชั่วโมงได้บอกให้ฉันแนบ params เข้ากับsearchอสังหาริมทรัพย์
rayepps

63

รุ่น 5+

ด้วยเชิงมุม 5 ขึ้นไปคุณจะได้ไม่ต้องใช้ HttpParams คุณสามารถส่งวัตถุ json ของคุณโดยตรงตามที่แสดงด้านล่าง

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

โปรดทราบว่าค่าข้อมูลควรเป็นสตริงเช่น { params: {limit: "2"}}

เวอร์ชัน 4.3.x +

ใช้HttpParams, HttpClientจาก@ 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});

อาจช่วยได้บ้าง!


@BrunoPeres ลอง stringifying วัตถุที่ซ้อนกันของคุณโดยใช้JSON.stringify()
Rahmathullah M

1
@RahmathullahM - bichu, THX :)
Jamsheer

12

เชิงมุม 6

คุณสามารถส่งผ่านพารามิเตอร์ที่จำเป็นสำหรับการโทรโดยใช้พารามิเตอร์:

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

โดยที่ x = {property: "123"}

สำหรับฟังก์ชัน api ที่บันทึก "123":

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

2
นั่นคือการเปลี่ยนแปลงที่เพิ่มเข้ามาในเวอร์ชัน 5 เพิ่มแล้วที่นี่stackoverflow.com/a/45455904/3276721
Miguel Lattuada

9

ตัวอย่างของฉัน

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

วิธีการของฉัน

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

ในองค์ประกอบของฉัน

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

โดยบุรุษไปรษณีย์

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

6

ใน Angular 7/8 ล่าสุดคุณสามารถใช้วิธีที่ง่ายที่สุด: -

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

สิ่งนี้จะไม่ทำงานหากsearchParamsคุณสมบัติ ' ใด ๆไม่ใช่stringค่า
Yulian

5

หากคุณวางแผนที่จะส่งมากกว่าหนึ่งพารามิเตอร์

ตัวแทน

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

บริการ

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();

และดำเนินการตามคำขอ http ของคุณตามที่ @ethemsulan ทำ

เส้นทางฝั่งเซิร์ฟเวอร์

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

ในคำขอรับบริการของคุณฉันพลาดวิธีที่คุณจัดการคำขอรับ
Winnemucca

โอ้ฉันเดาว่าคุณจะให้ http ได้รับการร้องขอในวิธีการนั้นเป็นการกลับมาเหมือนคำตอบของ
ethumsulan

2

คุณสามารถใช้HttpParamsจาก @ angular / common / http และส่งผ่านสตริงด้วยแบบสอบถาม ตัวอย่างเช่น:

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

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

ตอนนี้ในรหัสของคุณ

this.http.get(urlFull, options);

และนี่เหมาะสำหรับคุณ :)

ฉัน hoppe ช่วยคุณ


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

โดยที่คุณได้ติดตั้ง jQueryฉันจะทำnpm i jquery --saveและรวมไว้apps.scriptsในangular-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);

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.