Angular2 - Http POST अनुरोध पैरामीटर


91

मैं एक पोस्ट अनुरोध बनाने की कोशिश कर रहा हूं, लेकिन मैं इसे काम नहीं कर सकता:

testRequest() {
      var body = 'username=myusername?password=mypassword';
      var headers = new Headers();
      headers.append('Content-Type', 'application/x-www-form-urlencoded');

      this.http
        .post('/api',
          body, {
            headers: headers
          })
          .subscribe(data => {
                alert('ok');
          }, error => {
              console.log(JSON.stringify(error.json()));
          });
}

मैं मूल रूप से इस http अनुरोध (ajax नहीं) को दोहराना चाहता हूं जैसे कि यह HTML फॉर्म द्वारा उत्पन्न किया गया था:

URL: / एपी

Params: उपयोगकर्ता नाम और पासवर्ड


इस stackoverflow.com/a/34758630/5043867 पर एक नज़र डालें और stackoverflow.com/a/34823818/5043867 यह सभी POST अनुरोध के बारे में गहराई से बताएगा!
परदीप जैन

@PardeepJain मैं एक एपीआई का उपभोग करने की कोशिश नहीं कर रहा हूँ। बस एक html फॉर्म द्वारा उत्पन्न POST का अनुकरण करने के लिए।
क्रिस्टोफर

यहाँ भी देखें, एक फाइल पोस्ट करें user_nameऔर password, stackoverflow.com/a/45879409/2803344
बेल्टर

जवाबों:


49

मुझे लगता है कि application/x-www-form-urlencodedसामग्री प्रकार के लिए शरीर सही नहीं है । आप इसका उपयोग करने की कोशिश कर सकते हैं:

var body = 'username=myusername&password=mypassword';

आशा है कि यह आपकी मदद करता है, थियरी


हेडर में उस सामग्री प्रकार के साथ हाँ, यह एकमात्र तरीका है जो "पुराने तरीके से" मानों को स्ट्रिंग स्ट्रिंग के बजाय
Nather Webber

यह एक अच्छा जवाब नहीं है। इसके बजाय URLSearchParams का उपयोग करें, जैसे कि अधिक upvotes के साथ नीचे उल्लेख किया गया है।
मिक

भविष्य एक गूगल खोज से आने वाले से लोगों के लिए, यह है नहीं सर्वश्रेष्ठ उत्तर (कोई थियरी अपराध! आपका उत्तर अभी भी तकनीकी रूप से सही है :))। वी स्टोयकोव का जवाब अब तक सबसे सटीक है। ps यह सुनिश्चित करें import { URLSearchParams } from "@angular/http"कि डिफ़ॉल्ट 1 है इसलिए 1) आपको इस .toStringपर करने की आवश्यकता नहीं है, और 2) आपको सामग्री प्रकार सेट करने की आवश्यकता नहीं है। कोणीय अपने आप इसे आपके लिए देख लेगा (देखें github.com/angular/angular/blob/4.4.4/packages/http/src/… )
एरन मेडन

नमस्ते ! अगर मैं हेडर के साथ पोस्ट सेवा को पास करना चाहता हूं -> सामग्री प्रकार जैसे 'एप्लीकेशन / json' जो मुझे शरीर में पास करने की आवश्यकता है .... मैं json ऑब्जेक्ट पास करने की कोशिश कर रहा हूं, लेकिन यह ठीक से काम नहीं कर रहा है ...
VjyV

107

Angualar 4.3+ के लिए अपडेट करें

अब हम HttpClientइसके बजाय उपयोग कर सकते हैंHttp

गाइड यहाँ है

नमूना कोड

const myheader = new HttpHeaders().set('Content-Type', 'application/x-www-form-urlencoded')
let body = new HttpParams();
body = body.set('username', USERNAME);
body = body.set('password', PASSWORD);
http
  .post('/api', body, {
    headers: myheader),
  })
  .subscribe();

पदावनत

या आप इस तरह कर सकते हैं:

let urlSearchParams = new URLSearchParams();
urlSearchParams.append('username', username);
urlSearchParams.append('password', password);
let body = urlSearchParams.toString()

अद्यतन अक्टूबर / 2017

से angular4 + , हम की जरूरत नहीं है headers, या .toString()सामान। इसके बजाय, आप नीचे दिए गए उदाहरण की तरह कर सकते हैं

import { URLSearchParams } from '@angular/http';

POST / PUT विधि

let urlSearchParams = new URLSearchParams();
urlSearchParams.append('username', username);
urlSearchParams.append('password', password);
this.http.post('/api', urlSearchParams).subscribe(
      data => {
        alert('ok');
      },
      error => {
        console.log(JSON.stringify(error.json()));
      }
    )

GET / DELETE विधि

    let urlSearchParams = new URLSearchParams();
    urlSearchParams.append('username', username);
    urlSearchParams.append('password', password);
    this.http.get('/api', { search: urlSearchParams }).subscribe(
      data => {
        alert('ok');
      },
      error => {
        console.log(JSON.stringify(error.json()));
      }
    )

JSON application/jsonसामग्री-प्रकार के लिए

this.http.post('/api',
      JSON.stringify({
        username: username,
        password: password,
      })).subscribe(
      data => {
        alert('ok');
      },
      error => {
        console.log(JSON.stringify(error.json()));
      }
      )

14
URLSearchParams कक्षा आयात करने के लिए मत भूलनाimport { URLSearchParams } from "angular2/http"
सेबस्टियन हर्नांडेज़

10
मेरा आयात अलग दिखता है: '@ कोणीय / http' से आयात {URLSearchParams};
डांग

लेकिन, फॉर्म ऑब्जेक्ट भेजने के लिए और अधिक सरल तरीका नहीं है? मुझे URLSearchParams () का उपयोग करके किसी भी ट्यूटोरियल को आराम से बैकएंड के लिए पोस्ट करने के लिए नहीं देखा गया था। वे कैसे करते हैं? यह वापस करें। http: //Post (यह.आवेदन, निकाय, {शीर्ष लेख: यह। हेडर}) .मैप ((प्रतिक्रिया: प्रतिक्रिया) => प्रतिक्रिया.जॉसन ()) .catch (this.handleError);
स्टैकडेव

यह बूलियन के साथ कैसे काम करता है? यह कहते हुए एक त्रुटि हो रही है कि मैं बूलियन्स या संख्याओं को जोड़ नहीं सकता, बस तार (एपेंड में)
JohnAndrews

बूलियन के बारे में, शायद यह विषय आपकी मदद कर सकता है stackoverflow.com/questions/14774907/…
फ्रैंक

41

Angular2 के बाद के संस्करणों में मैन्युअल रूप से Content-Typeहेडर सेट करने और शरीर को एन्कोडिंग करने की कोई आवश्यकता नहीं है यदि आप सही प्रकार के ऑब्जेक्ट को पास करते हैं body

आप बस यह कर सकते हैं

import { URLSearchParams } from "@angular/http"


testRequest() {
  let data = new URLSearchParams();
  data.append('username', username);
  data.append('password', password);

  this.http
    .post('/api', data)
      .subscribe(data => {
            alert('ok');
      }, error => {
          console.log(error.json());
      });
}

इस तरह कोणीय आपके लिए शरीर को एन्कोड करेगा और सही Content-Typeहेडर सेट करेगा ।

भूल नहीं पी एस क्या आयात करने के लिए URLSearchParamsसे @angular/httpया यह काम नहीं करेगा।


2
@VStoykov यह काम नहीं करता है, आपको परमो पर .toString () करना होगा और आपको सामग्री प्रकार निर्दिष्ट करना होगा, और मैं कोणीय 4.0.3
कोनराड

1
@ i'myourhuckleberry को 4.0.3 पर भी काम करना चाहिए। स्रोत कोड github.com/angular/angular/blob/4.0.3/packages/http/src/…
VStoykov

1
@VStoykov यह मेरे लिए काम नहीं करता है और मैंने इसे गितुब पर एक बग के रूप में रिपोर्ट किया है
कोनराड

1
ठीक है। Nvm मुझे इसे "@ कोणीय / http" से आयात करना था अन्यथा यह प्रकार को पहचानता है लेकिन यह कोणीय प्रकार नहीं है।
कोनराड

1
@ i'myourhuckleberry आयात मेरे उदाहरण में पहली पंक्ति थी, लेकिन शायद आपने इसे याद किया। से ब्राउज़र में प्रकार में बनाया आप उपयोग कर सकते हैं FormData, और कोणीय सेट हो जाएगा Content-Typeके रूप में multipart/form-dataजो भी काम करते हैं।
VStoykov

10

तो बस इसे पूरा जवाब देने के लिए:

login(username, password) {
        var headers = new Headers();
        headers.append('Content-Type', 'application/x-www-form-urlencoded');
        let urlSearchParams = new URLSearchParams();
        urlSearchParams.append('username', username);
        urlSearchParams.append('password', password);
        let body = urlSearchParams.toString()
        return this.http.post('http://localHost:3000/users/login', body, {headers:headers})
            .map((response: Response) => {
                // login successful if there's a jwt token in the response
                console.log(response);
                var body = response.json();
                console.log(body);
                if (body.response){
                    let user = response.json();
                    if (user && user.token) {
                        // store user details and jwt token in local storage to keep user logged in between page refreshes
                        localStorage.setItem('currentUser', JSON.stringify(user)); 
                    }
                }
                else{
                    return body;
                }
            });
    }

1
[ts] प्रकार का तर्क '{हेडर: रिक्वेस्ट; } 'RequestOptionsArgs' के प्रकार के लिए असाइन नहीं किया जा सकता है
सोनिक सोल

2
@ सोनिक सोल बस: .. पोस्ट ('/ / एपी', बॉडी, हेडर) ... बिना {} हेडर के आसपास
Guenther

5

ये उत्तर Http के बजाय HttpClient का उपयोग करने वालों के लिए सभी पुराने हैं। मैं यह सोचकर पागल होने लगा था, "मैंने URLSearchParams का आयात कर लिया है, लेकिन यह अभी भी .toString () और स्पष्ट हेडर के लिए काम नहीं करता है!"

HttpClient के साथ, URLSearchParams के बजाय HttpParams का उपयोग करें और body = body.append()शरीर में एक से अधिक पैरा प्राप्त करने के लिए वाक्यविन्यास पर ध्यान दें क्योंकि हम एक अपरिवर्तनीय वस्तु के साथ काम कर रहे हैं:

login(userName: string, password: string): Promise<boolean> {
    if (!userName || !password) {
      return Promise.resolve(false);
    }

    let body: HttpParams = new HttpParams();
    body = body.append('grant_type', 'password');
    body = body.append('username', userName);
    body = body.append('password', password);

    return this.http.post(this.url, body)
      .map(res => {
        if (res) {          
          return true;
        }
        return false;
      })
      .toPromise();
  }

उपरोक्त समाधान के लिए धन्यवाद। लेकिन जब एनजी बिल्ड चल रहा है - मेरे शरीर के परम को "परम" की तरह देख रहे हैं: {"कच्चेप्रेम": "", "क्वेरीइंकोडर": {}, "पैरामैस्पर": {}}}: "। क्या आसपास कोई काम है?
हेमंत पोलुरु

4

यदि कोई कोणीय संस्करण 4+ से संघर्ष कर रहा है (मेरा 4.3.6 था) । यह नमूना कोड था जो मेरे लिए काम करता था।

पहले आवश्यक आयात जोड़ें

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

फिर एपीआई समारोह के लिए। यह एक लॉगिन नमूना है जिसे आपकी आवश्यकताओं के अनुसार बदला जा सकता है।

login(username: string, password: string) {
    var headers = new Headers();
    headers.append('Content-Type', 'application/x-www-form-urlencoded');
    let urlSearchParams = new URLSearchParams();
    urlSearchParams.append('email', username);
    urlSearchParams.append('password', password);
    let body = urlSearchParams.toString()

    return this.http.post('http://localhost:3000/api/v1/login', body, {headers: headers})
        .map((response: Response) => {
            // login successful if user.status = success in the response
            let user = response.json();
            console.log(user.status)
            if (user && "success" == user.status) {
                // store user details and jwt token in local storage to keep user logged in between page refreshes
                localStorage.setItem('currentUser', JSON.stringify(user.data));
            }
        });
}

0

मुझे कई मापदंडों का उपयोग करके हर दृष्टिकोण के साथ समस्या हो रही थी, लेकिन यह एकल ऑब्जेक्ट के साथ काफी अच्छी तरह से काम करता है

एपीआई:

    [HttpPut]
    [Route("addfeeratevalue")]
    public object AddFeeRateValue(MyValeObject val)

कोणीय:

var o = {ID:rateId, AMOUNT_TO: amountTo, VALUE: value};
return this.http.put('/api/ctrl/mymethod', JSON.stringify(o), this.getPutHeaders());


private getPutHeaders(){
    let headers = new Headers();
    headers.append('Content-Type', 'application/json');
    return new RequestOptions({
        headers: headers
        , withCredentials: true // optional when using windows auth
    });
}

1
ओपी की समस्या एप्लिकेशन / x-www-form-urlencoded की सामग्री-प्रकार है, आपका उत्तर बिल्कुल अलग समस्या है।
क्रिश्चियन उलब्रिच

0
angular: 
    MethodName(stringValue: any): Observable<any> {
    let params = new HttpParams();
    params = params.append('categoryName', stringValue);

    return this.http.post('yoururl', '', {
      headers: new HttpHeaders({
        'Content-Type': 'application/json'
      }),
      params: params,
      responseType: "json"
    })
  }

api:   
  [HttpPost("[action]")]
  public object Method(string categoryName)

नमस्ते और Stackoverflow में आपका स्वागत है। इस प्रश्न का उत्तर देने के लिए धन्यवाद, लेकिन सिर्फ ओपी या भविष्य में इस प्रश्न के पार आने वाले किसी भी व्यक्ति के लिए कोड को ब्लॉक करना कठिन है। क्या आप अपने प्रश्न को संपादित कर सकते हैं और एक (संक्षिप्त) स्पष्टीकरण दे सकते हैं कि आप क्या समस्या हल कर रहे थे, और आपने इसे कैसे हल किया, ताकि हम आपके समाधान को बेहतर ढंग से समझ सकें?
प्लूटियन

1
हाय @Putian जब मैंने पोस्ट पैरामीटर के 2 मान पर यह निवेदन किया कि यह मुझे एपीआई पर शून्य मान लौटाता है तो मैं उस 2 पैरामीटर को खाली स्ट्रिंग के रूप में पारित करता हूं और मैंने मानदंड को 3 पैरामीटर के गुण पर पारित किया है, इसलिए इस विधि ने मेरे लिए काम किया
मुन्नन

-2

मैं यहां उतरा जब मैं एक समान काम करने की कोशिश कर रहा था। किसी एप्लिकेशन / x-www-form-urlencoded सामग्री प्रकार के लिए, आप इसे शरीर के लिए उपयोग करने का प्रयास कर सकते हैं:

var body = 'username' =myusername & 'password'=mypassword;

आपके द्वारा शरीर को सौंपे गए मूल्य को करने की कोशिश के साथ एक स्ट्रिंग होगी।


जैसा कि यहोशू ने बताया, यह जावास्क्रिप्ट और न ही टाइपस्क्रिप्ट मान्य नहीं है। मुझे लगता है कि आपका मतलब क्या है जो वर्तमान में स्वीकृत उत्तर है।
क्रिश्चियन उलब्रिच
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.