কৌণিক 4.3 - এইচটিটিপি ক্লায়েন্ট সেট প্যারাম


94
let httpParams = new HttpParams().set('aaa', '111');
httpParams.set('bbb', '222');

কেন এটি কাজ করে না? এটি কেবল 'আ' সেট করে এবং 'বিবিবি' নয়

এছাড়াও, আমার একটি অবজেক্ট রয়েছে {আআআআআ: 111, বিবিবি: 222 I আমি কীভাবে লুপিং ছাড়াই সমস্ত মান সেট করতে পারি?

আপডেট (এটি মনে হচ্ছে কাজ করে তবে লুপটি কীভাবে এড়ানো যায়?)

let httpParams = new HttpParams();
Object.keys(data).forEach(function (key) {
     httpParams = httpParams.append(key, data[key]);
});

4
আমি আপনার সাথে একমত যে httpParams.set('bbb', '222');কাজ করা উচিত। আমি প্রথমে চেষ্টা করেছিলাম এবং খুব বিভ্রান্ত হয়েছিলাম। তবে সেই লাইনটি httpParams = httpParams.set('bbb','222');কাজের সাথে প্রতিস্থাপন করুন । যারা কেবল 2 সেট করছেন, তাদের জন্য নীচে অন্য ব্যবহারকারীর জবাব দেওয়াও দুর্দান্ত।
অ্যাঞ্জেলা পি

4
@ অংগেলাপান যেমন পরামর্শ দিয়েছে ঠিক তেমন অ্যাসাইনমেন্ট (=) ব্যবহার করুন এবং আপনাকে লুপ ব্যবহার করতে হবে না। পরিবর্তনীয় এবং অপরিবর্তনীয় সম্পর্কেও পড়ুন।
জুনেদ

দয়া করে শর্তযুক্ত HTTPParams সেট আপডেট বৈশিষ্ট্যের জন্য ভোট দিন: github.com/angular/angular/issues/26021
সার্জ

উত্তর:


94

5.0.0-beta.6 এর আগে

let httpParams = new HttpParams();
Object.keys(data).forEach(function (key) {
     httpParams = httpParams.append(key, data[key]);
});

5.0.0-beta.6 থেকে

5.0.0-beta.6 (2017-09-03) থেকে তারা নতুন বৈশিষ্ট্য যুক্ত করেছে (এইচটিটিপি ক্লায়েন্ট শিরোনাম এবং প্যারামের জন্য বস্তুর মানচিত্র গ্রহণ করুন)

এগিয়ে যেতে অবজেক্টটি সরাসরি এইচটিপিপিরামগুলির পরিবর্তে পাস করা যেতে পারে।

getCountries(data: any) {
    // We don't need any more these lines
    // let httpParams = new HttpParams();
    // Object.keys(data).forEach(function (key) {
    //     httpParams = httpParams.append(key, data[key]);
    // });

    return this.httpClient.get("/api/countries", {params: data})
}

আমি 5.2.6 ব্যবহার করছি এবং আমি স্পষ্টভাবে এটিকে না বললে এটি অবশ্যই প্যারাম পিসের জন্য একটি অভিধান নেবে না any। এটা কি আসলে ব্যবহারের?
গারগোল

6
@ গ্রাগোয়েল - { params: <any>params }টিএস সংকলক সমস্যাগুলি এড়াতে আপনি কেবল নিজের বিষয়টিকে কাস্ট করতে পারেন
কিয়েরান

4
টাইপ স্ট্রিংগুলির প্যারামগুলি যে নাল হয় তা "নাল" ফিরে আসবে এবং সংখ্যা, বুলিয়ান এবং তারিখ সমর্থন করে না
ওমর এমজেজগ

সংখ্যা, বুলিয়ান এবং তারিখ সহায়তার অভাবের জন্য বাগের প্রতিবেদনের লিঙ্কটি এখানে রয়েছে: github.com/angular/angular/issues/23856
এপিকভয়েজ

83

HttpParams অপরিবর্তনীয় উদ্দেশ্যে করা হয়। setএবং appendপদ্ধতি বিদ্যমান উদাহরণস্বরূপ পরিবর্তন করবেন না। পরিবর্তে পরিবর্তিত প্রয়োগের সাথে সাথে তারা নতুন দৃষ্টান্ত ফেরত দেয়।

let params = new HttpParams().set('aaa', 'A');    // now it has aaa
params = params.set('bbb', 'B');                  // now it has both

পদ্ধতিটি শৃঙ্খলাবদ্ধতার সাথে এই পদ্ধতিটি ভালভাবে কাজ করে:

const params = new HttpParams()
  .set('one', '1')
  .set('two', '2');

... যদিও আপনার যদি শর্তে তাদের কোনও জড়ানোর দরকার হয় তবে এটি বিশ্রী হতে পারে।

আপনার লুপটি কাজ করে কারণ আপনি ফিরে আসা নতুন দৃষ্টান্তের কোনও রেফারেন্স ধরছেন। আপনি যে কোড পোস্ট করেছেন তা কাজ করে না, কাজ করে না। এটি কেবল সেট () কল করে তবে ফলাফলটি গ্রহণ করে না।

let httpParams = new HttpParams().set('aaa', '111'); // now it has aaa
httpParams.set('bbb', '222');                        // result has both but is discarded

4
অবিচ্ছিন্ন এইচটিপিপিআরমগুলির পছন্দটি কী উদ্ভট, এটিই ছিল ব্লকিং পয়েন্ট এবং গ্রহণযোগ্য উত্তর হওয়া উচিত
নিকোলাস

45

এর আরও সাম্প্রতিক সংস্করণগুলিতে @angular/common/http(5.0 এবং তার উপরে, এর চেহারা অনুসারে) আপনি অবজেক্টটি সোজা প্রবেশ করার জন্য fromObjectকীটি ব্যবহার করতে পারেন HttpParamsOptions:

let httpParams = new HttpParams({ fromObject: { aaa: 111, bbb: 222 } });

এটি কেবল ফণা নীচে একটি forEachলুপ চালায় , যদিও:

this.map = new Map<string, string[]>();
Object.keys(options.fromObject).forEach(key => {
  const value = (options.fromObject as any)[key];
  this.map !.set(key, Array.isArray(value) ? value : [value]);
});

আপনি কেন অবজেক্ট থেকে বলছেন? এটি যে কোনও বস্তু হতে পারে।
খ্রিস্টান ম্যাথু

@ ক্রিশ্চিয়ানমঠহ এইচটিপিপিরামস এর নির্মাতা "কোনও বস্তু" নিতে পারবেন না , এটি HTTPParamsOptions লাগে। যদি আপনি বোঝাতে চান যে কোনও অনুরোধের জন্য আপনি কোনও বস্তুকে প্যারাম হিসাবে পাস করতে পারেন: হ্যাঁ, তবে কেবল ভি 5 থেকে। নইলে আমি নিশ্চিত নই আপনি কী জিজ্ঞাসা করছেন।
jonrsharpe

অবজেক্ট থেকে << এই শব্দটি সঠিকভাবে কী
খ্রিস্টান ম্যাথিউ

পছন্দ করেছেন আপনি কি সেই সম্পত্তি কী তা জানতে চান? আপনি কি API ডক্সটি দেখেছেন? বা উত্তরে উদাহরণ?
জুনশারপে

4
পছন্দ করেছেন "এপিআই সংস্করণ" বলতে আপনার অর্থ কী? কৌনিক সংস্করণ? উত্তরে আমি কোন অঙ্গীকারের সাথে লিঙ্ক করেছি তা আপনি দেখতে পারেন এবং আমি স্পষ্টভাবে বলেছিলাম যে এটি 5.0 এ চালু হয়েছিল। আপনি এখনই এটিকে মাস্টারটিতে দেখতে এবং দেখতে পারেন: github.com/angular/angular/blob/master/packages/common/http/src/… । আপনার কী সমস্যা আছে তা আমার কাছে পরিষ্কার নয় ।
জুনশারপে

21

আমার হিসাবে, শৃঙ্খলা setপদ্ধতি সবচেয়ে পরিষ্কার উপায়

const params = new HttpParams()
.set('aaa', '111')
.set('bbb', "222");

4
এইচটিপিপিরামগুলি এইচটিপিএইচইডার্সের মতো অপরিবর্তনীয়, যার অর্থ দ্বিতীয় .set () কল এই ক্ষেত্রে কাজ করবে না। এটি একটি হিটতে সেট করা দরকার বা ওপেন তার আপডেটের পরামর্শ অনুসারে একটি নতুন পরিবর্তনশীলকে আউটপুট বরাদ্দ করে .append () পদ্ধতির সাথে যেতে হবে।
ডাব্লু পলম্বিনী

4
@ ডাব্লু পালোম্বিনী আমি কেবল মাইকের চেইন সেটটি চেষ্টা করেছি। এবং এটি কাজ করে! আমি মনে করি এটি কেবল 2 প্যারামিটারযুক্ত লোকের পক্ষে ভাল। এটা বোঝা সহজ।
অ্যাঞ্জেলা পি

19

সহজ বিকল্পগুলির দম্পতি

HttpParamsঅবজেক্ট ব্যবহার না করেই

let body = {
   params : {
    'email' : emailId,
    'password' : password
   }
}

this.http.post(url, body);

HttpParamsঅবজেক্টস ব্যবহার করা

let body = new HttpParams({
  fromObject : {
    'email' : emailId,
    'password' : password
  }
})

this.http.post(url, body);

এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। সহজ এবং পরিষ্কার।
কারসুস

14

এটি করার আরেকটি বিকল্প হ'ল:

this.httpClient.get('path', {
    params: Object.entries(data).reduce(
    (params, [key, value]) => params.set(key, value), new HttpParams());
});

আপনি একটি polyfill (যোগ করতে পারেন stackoverflow.com/questions/42410029/... )
Leibale Eidelman

এই উইজার্ডারিটি চেষ্টা করে দেখতে হবে
খ্রিস্টান ম্যাথিউ

9

যেহেতু এইচটিটিপি প্যারাম ক্লাস অপরিবর্তনীয় তাই আপনাকে সেট পদ্ধতিটি চেইন করতে হবে:

const params = new HttpParams()
.set('aaa', '111')
.set('bbb', "222");

7

এটি ব্যবহার করে আপনি লুপ এড়াতে পারবেন।

// obj is the params object with key-value pair. 
// This is how you convert that to HttpParams and pass this to GET API. 

const params = Object.getOwnPropertyNames(obj)
               .reduce((p, key) => p.set(key, obj[key]), new HttpParams());

তদ্ব্যতীত, আমি আপনার সাধারণত ব্যবহৃত পরিষেবাতে HTTPParams ফাংশন করার পরামর্শ দিচ্ছি । সুতরাং আপনি এইচটিচপিপ্যারামগুলিতে রূপান্তর করতে ফাংশনটি কল করতে পারেন ।

/**
 * Convert Object to HttpParams
 * @param {Object} obj
 * @returns {HttpParams}
 */
toHttpParams(obj: Object): HttpParams {
    return Object.getOwnPropertyNames(obj)
        .reduce((p, key) => p.set(key, obj[key]), new HttpParams());
}

হালনাগাদ:

5.0.0-beta.6 (2017-09-03) থেকে তারা নতুন বৈশিষ্ট্য যুক্ত করেছে ( এইচটিটিপি ক্লায়েন্ট শিরোনাম এবং প্যারামের জন্য বস্তুর মানচিত্র গ্রহণ করুন )

এগিয়ে যেতে অবজেক্টটি সরাসরি এইচটিপিপিরামগুলির পরিবর্তে পাস করা যেতে পারে।

এটি অন্য কারণ হিসাবে যদি আপনি উপরে উল্লিখিত টু এইচটিপিআরমগুলির মতো একটি সাধারণ ক্রিয়া ব্যবহার করেন তবে আপনি সহজেই এটিকে সরাতে পারেন বা প্রয়োজনে পরিবর্তনগুলি করতে পারেন।


হাই এটির কাজ ঠিক আছে তবে পরম হিসাবে অতিরিক্ত অপরিজ্ঞাত কী মান যুক্ত করুন
অভিজিৎ জগতাপ

3

যতদূর আমি https://github.com/angular/angular/blob/master/packages/common/http/src/params.ts এ বাস্তবায়ন থেকে দেখতে পাচ্ছি

আপনাকে পৃথকভাবে মান সরবরাহ করতে হবে - আপনি আপনার লুপ এড়াতে সক্ষম নন।

এখানে এমন একটি কনস্ট্রাক্টর রয়েছে যা প্যারামিটার হিসাবে স্ট্রিং নেয় তবে এটি রূপে param=value&param2=value2তাই আপনার জন্য কোনও চুক্তি নেই (উভয় ক্ষেত্রেই আপনি নিজের অবজেক্টটি লুপ করে শেষ করবেন)।

আপনি কৌনিকটিতে সর্বদা একটি সমস্যা / বৈশিষ্ট্য অনুরোধের প্রতিবেদন করতে পারেন, আমি যা দৃ strongly়ভাবে পরামর্শ দিই: https://github.com/angular/angular/issues

PS: setএবং appendপদ্ধতির মধ্যে পার্থক্য সম্পর্কে মনে রাখবেন ;)


পার্থক্য কি?
খ্রিস্টান ম্যাথিউ

2

যেহেতু @ ম্যাসিজেট্রেডার নিশ্চিত করেছেন যে আমাদের লুপ করতে হবে, তাই এখানে একটি মোড়ক দেওয়া optionচ্ছিকভাবে আপনাকে ডিফল্ট প্যারামের একটি সেট যুক্ত করতে দেবে:

function genParams(params: object, httpParams = new HttpParams()): object {
    Object.keys(params)
        .filter(key => {
            let v = params[key];
            return (Array.isArray(v) || typeof v === 'string') ? 
                (v.length > 0) : 
                (v !== null && v !== undefined);
        })
        .forEach(key => {
            httpParams = httpParams.set(key, params[key]);
        });
    return { params: httpParams };
}

আপনি এটি এর মতো ব্যবহার করতে পারেন:

const OPTIONS = {
    headers: new HttpHeaders({
        'Content-Type': 'application/json'
    }),
    params: new HttpParams().set('verbose', 'true')
};
let opts = Object.assign({}, OPTIONS, genParams({ id: 1 }, OPTIONS.params));
this.http.get(BASE_URL, opts); // --> ...?verbose=true&id=1

2

আমার সহায়ক শ্রেণি (টিএস) কোনও জটিল ডিটিও অবজেক্টকে (কেবল "স্ট্রিং অভিধান" নয়) কে এইচটিপিপিআরমে রূপান্তর করতে:

import { HttpParams } from "@angular/common/http";

export class HttpHelper {
  static toHttpParams(obj: any): HttpParams {
    return this.addToHttpParams(new HttpParams(), obj, null);
  }

  private static addToHttpParams(params: HttpParams, obj: any, prefix: string): HttpParams {    
    for (const p in obj) {
      if (obj.hasOwnProperty(p)) {
        var k = p;
        if (prefix) {
          if (p.match(/^-{0,1}\d+$/)) {
            k = prefix + "[" + p + "]";
          } else {
            k = prefix + "." + p;
          }
        }        
        var v = obj[p];
        if (v !== null && typeof v === "object" && !(v instanceof Date)) {
          params = this.addToHttpParams(params, v, k);
        } else if (v !== undefined) {
          if (v instanceof Date) {
            params = params.set(k, (v as Date).toISOString()); //serialize date as you want
          }
          else {
            params = params.set(k, v);
          }

        }
      }
    }
    return params;
  }
}

console.info(
  HttpHelper.toHttpParams({
    id: 10,
    date: new Date(),
    states: [1, 3],
    child: {
      code: "111"
    }
  }).toString()
); // id=10&date=2019-08-02T13:19:09.014Z&states%5B0%5D=1&states%5B1%5D=3&child.code=111

আপনার সত্যিই params.tsএটির দরকার নেই, কৌণিকের নিজস্ব এনকোডিং রয়েছে। বাস্তবায়নটি দেখুন: github.com/angular/angular/blob/master/packages/common/http/src/…
ডেভিডাস

1

কেবলমাত্র এটি যুক্ত করতে চেয়েছিলেন আপনি যদি একই মূল নামের সাথে কয়েকটি পরামিতি যুক্ত করতে চান তবে: www.test.com/home?id=1&id=2

let params = new HttpParams();
params = params.append(key, value);

অ্যাপেন্ড ব্যবহার করুন, যদি আপনি সেট ব্যবহার করেন তবে এটি একই কী নামের সাথে পূর্বের মানটি ওভাররাইট করে।


0

এই সমাধানগুলি আমার পক্ষে কাজ করে,

let params = new HttpParams(); Object.keys(data).forEach(p => { params = params.append(p.toString(), data[p].toString()); });

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.