কৌণিক 2 - এইচটিপি পোস্টের অনুরোধের পরামিতিগুলি


94

আমি একটি পোস্ট অনুরোধ করার চেষ্টা করছি কিন্তু আমি এটি কাজ করতে পারি না:

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

আমি মূলত এই এইচটিএমএল অনুরোধটির (যেমন আজাক্স নয়) প্রতিলিপি তৈরি করতে চাই যেমন এটি এইচটিএমএল ফর্মের দ্বারা উদ্ভূত হয়েছিল:

ইউআরএল: / এপিআই

প্যারাম: ব্যবহারকারীর নাম এবং পাসওয়ার্ড


এই স্ট্যাকওভারফ্লো.com/ a/ 34758630/5043867 এবং স্ট্যাকওভারফ্লো. com/ a/ 34823818 / 5043867 এ দেখুন, এটি পোস্টের অনুরোধ সম্পর্কে গভীরভাবে ব্যাখ্যা করবে!
পারদীপ জৈন

@ পারদীপজাইন আমি কোনও এপিআই গ্রাস করার চেষ্টা করছি না। এইচটিএমএল ফর্মের মাধ্যমে উত্পন্ন কোনও পোস্টের সকল করতে।
ক্রিস্টোফার

এখানেও চেক করুন user_nameএবং স্ট্যাকওভারফ্লো.compassword
2803344

উত্তর:


49

আমি মনে করি যে কোনও application/x-www-form-urlencodedসামগ্রী ধরণের জন্য শরীর সঠিক নয় । আপনি এটি ব্যবহার করার চেষ্টা করতে পারেন:

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

আশা করি এটি আপনাকে সহায়তা করবে, থিয়েরি


হ্যাঁ, শিরোনামে সামগ্রীর প্রকারের সাথে, এটি কেবলমাত্র
জসন

এটি একটি ভাল উত্তর নয়। পরিবর্তে ইউআরএল সার্চপ্যারামগুলি ব্যবহার করুন, যেমন আরও উত্সাহের সাথে নীচে উল্লিখিত রয়েছে।
মিক

ভবিষ্যতে একটি Google অনুসন্ধান থেকে আসছে মানুষের জন্য, এই হল না সর্বোত্তম উত্তর (কোন থিয়েরি অপরাধ! আপনার উত্তর এখনো টেকনিক্যালি সঠিক :))। ভি স্টয়কভের উত্তর এখন পর্যন্ত সবচেয়ে সঠিক। পিএস নিশ্চিত করুন import { URLSearchParams } from "@angular/http"এবং এটি ডিফল্ট নয় তাই 1) আপনার .toStringএটি করার দরকার নেই এবং 2) আপনার সামগ্রীর ধরণ সেট করার দরকার নেই। কৌনিকটি আপনার জন্য এটি স্বয়ংক্রিয়ভাবে অনুমান করবে ( github.com/angular/angular/blob/4.4.4/packages/http/src/… দেখুন )
মেডান

ওহে ! যদি আমি শিরোনামের সাথে পোস্ট পরিষেবাটি পাস করতে চাই -> কনটেন্ট টাইপের মতো 'অ্যাপ্লিকেশন / জেসন' আমার শরীরে কী পাস করতে হবে .... আমি
জসন

107

অ্যাঙ্গুয়ালার 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 আপডেট করুন

কৌণিক 4 + থেকে , আমাদের স্টাফheaders বা দরকার নেই .toString()। পরিবর্তে, আপনি নীচের উদাহরণ পছন্দ করতে পারেন

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

পোস্ট / পুট পদ্ধতি

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

জিইটি / ডিলেট করুন পদ্ধতি

    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
ইউআরএল সার্চপ্যারাম ক্লাস আমদানি করতে ভুলবেন নাimport { URLSearchParams } from "angular2/http"
সেবাস্তিয়ান হার্নান্দেজ

10
আমার আমদানিটি দেখতে অন্যরকম দেখাচ্ছে: '@ কৌনিক / http' থেকে import URLS SearchParams import আমদানি করুন;
ডাং

তবে, কোনও ফর্ম অবজেক্ট পাঠানোর আরও সহজ কোনও উপায় নেই? বিশ্রামের সাথে ব্যাকএন্ডের জন্য পোস্ট প্রেরণের জন্য আমি ইউআরএল সার্চপ্যারাম () ব্যবহার করে কোনও টিউটোরিয়াল দেখিনি। তারা কিভাবে? ফেরত দিন এই।
স্ট্যাকডেভ

বুলিয়ানদের সাথে এটি কীভাবে কাজ করে? আমি বুলিয়ান বা সংখ্যা যুক্ত করতে পারছি না বলে একটি ত্রুটি পেয়েছি, কেবল স্ট্রিং (
সংযোজনে

বুলিয়ান সম্পর্কে, সম্ভবত এই বিষয় আপনাকে স্ট্যাকওভারফ্লো
ফ্রাঙ্ক এনগুইন

41

অ্যাঙ্গুলার 2 এর পরবর্তী সংস্করণগুলিতে ম্যানুয়ালি 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অথবা এটি কাজ করবে না।


4
@ ভিস্টোইকভ এটি কাজ করে না, আপনাকে প্যারামগুলিতে .to স্ট্রিং () করতে হবে এবং আপনাকে বিষয়বস্তুর ধরণটি নির্দিষ্ট করতে হবে এবং আমি কৌণিক 4.0.3.3 ব্যবহার করেছি
কনরাড

4
@ আইম্যুরহাকলেবেরি এটি এমনকি 4.0.3 এ কাজ করা উচিত। সোর্স কোডটি দেখুন github.com/angular/angular/blob/4.0.3/packages/http/src/…
ভিএসটোয়কভ

4
@ ভিস্টোইকোভ এটি আমার পক্ষে কাজ করে না এবং আমি এটি গিথুব
কনরাড

4
ঠিক আছে. এনভিএম আমাকে এটি "@ কৌনিক / HTTP" থেকে আমদানি করতে হয়েছিল অন্যথায় এটি প্রকারটি স্বীকৃতি দেয় তবে এটি কৌণিকের ধরণের নয়।
Konrad

4
@ আইম্যুরহাকলেবেরি আমদানিটি আমার উদাহরণের প্রথম লাইন ছিল তবে সম্ভবত আপনি এটি মিস করেছেন। থেকে ব্রাউজারে ধরনের সালে নির্মিত আপনি ব্যবহার করতে পারেন FormData, এবং কৌণিক সেট হবে Content-Typeযেমন multipart/form-dataযা হবে।
ভিএসটোয়কভ

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

4
[ts] '' শিরোনামের প্রকারের আর্গুমেন্ট: রিকোয়েস্টঅ্যাপশনস; 'রিকোয়েস্টঅপশনস অর্গস' টাইপের প্যারামিটারে} 'নির্ধারিত নয়
সোল

4
@ সোনিক সোল এটি ঠিক: .. পোস্ট ('/ এপিআই', দেহ, শিরোনাম) ... শিরোনামের চারপাশে without without ছাড়াই
গেন্টার

5

এই উত্তরগুলি এইচটিটিপি-র পরিবর্তে এইচটিটিপিপ্লিনেন্ট ব্যবহার করার জন্য পুরানো। আমি পাগল হয়ে ভাবতে শুরু করছিলাম, "আমি ইউআরএলস অনুসন্ধানেরামগুলি আমদানি করে ফেলেছি তবে এটি এখনও। স্ট্রিং () এবং সুস্পষ্ট শিরোনাম ছাড়া কাজ করে না!"

এইচটিটিপিকলেন্ট সহ, ইউআরএল সার্চপ্যারামগুলির পরিবর্তে এইচটিপিপ্যারাম ব্যবহার করুন এবং শরীরে 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();
  }

উপরের সমাধানের জন্য ধন্যবাদ। তবে যখন এনজি বিল্ড - প্রোড চালাচ্ছেন তখন আমার শরীরের পরমগুলি "{" প্যারামস ": raw" কাঁচা প্যারামস ":" "," ক্যোয়ারি এনকোডার ": {}," প্যারামম্যাপ ": {}}}:" এর মতো দেখাচ্ছে। আশেপাশে কোনও কাজ আছে?
হেমন্ত পোলুরু

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

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

হাই এবং স্ট্যাকওভারফ্লোতে আপনাকে স্বাগতম। এই প্রশ্নের উত্তরের জন্য আপনাকে ধন্যবাদ, তবে ওপি বা ভবিষ্যতে এই প্রশ্নটি যে কেউ আসছেন তার পক্ষে কেবল একটি ব্লক কোড পোস্ট করা বোঝা মুশকিল। আপনার সমাধানটি আরও ভালভাবে বুঝতে আমাদের সহায়তা করার জন্য আপনি কী আপনার প্রশ্নটি সম্পাদনা করতে এবং সমস্যাটি কীভাবে সমাধান করেছেন এবং আপনি কীভাবে সমাধান করেছেন সে সম্পর্কে একটি (সংক্ষিপ্ত) ব্যাখ্যা দিতে সক্ষম হবেন ?
প্লুটিয়ান

4
হাই @ প্লুটিয়ান যখন আমি পোস্টের অনুরোধের দ্বিতীয় প্যারামিটারে মানটি পাস করেছি তখন এটি আমাকে এপিআইয়ের নাল মানগুলি ফিরিয়ে দেয় তাই আমি ২ য় প্যারামিটারটি খালি স্ট্রিং হিসাবে পাস করেছি এবং আমি তৃতীয় প্যারামিটারের সম্পত্তিগুলির মানগুলি পাস করেছি যাতে এই পদ্ধতিটি আমার পক্ষে কাজ করে
মুনিয়ান

0

একাধিক পরামিতি ব্যবহার করে আমার প্রতিটি পদ্ধতির সাথে সমস্যা ছিল, তবে এটি একক বস্তুর সাথে বেশ ভাল কাজ করে well

এপিআই:

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

4
ওপির সমস্যাটি হ'ল অ্যাপ্লিকেশন / x-www-form-urlencoded বিষয়বস্তু, আপনার উত্তর সম্পূর্ণ ভিন্ন সমস্যা is
খ্রিস্টান উলব্রিচ

-2

আমি যখন এখানে অনুরূপ কিছু করার চেষ্টা করছিলাম তখন আমি এখানে অবতরণ করেছি। কোনও অ্যাপ্লিকেশন / x-www-form-urlencoded সামগ্রীর ধরণের জন্য, আপনি এটি শরীরের জন্য ব্যবহার করার চেষ্টা করতে পারেন:

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

আপনি যা চেষ্টা করেছেন তা দিয়ে শরীরের জন্য নির্ধারিত মানটি একটি স্ট্রিং হবে।


জোশুয়া যেমন উল্লেখ করেছেন, এটি বৈধ জাভাস্ক্রিপ্ট বা টাইপস্ক্রিপ্ট নয়। আমি মনে করি আপনি যা বোঝাতে চেয়েছিলেন তা হ'ল বর্তমানে গৃহীত উত্তর।
খ্রিস্টান উলব্রিচ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.