AngularJS $ http এবং $ উত্স $


257

আমার কিছু ওয়েব পরিষেবাদি রয়েছে যা আমি কল করতে চাই। $resourceবা $http, আমার কোনটি ব্যবহার করা উচিত?

$resource: https://docs.angularjs.org/api/ngResource/service/$resource

$http: https://docs.angularjs.org/api/ng/service/$http

উপরের দুটি এপিআই পৃষ্ঠা পড়ার পরে আমি হারিয়ে গেছি।

আপনি কি দয়া করে আমাকে সরল ইংরেজিতে ব্যাখ্যা করতে পারবেন যে পার্থক্য কী এবং আমি কোন পরিস্থিতিতে তাদের ব্যবহার করব? আমি কীভাবে এই কলগুলি কাঠামোগত করব এবং ফলাফলগুলি সঠিকভাবে js অবজেক্টে পড়ব?


25
$ সংস্থানটি $ http এর শীর্ষে নির্মিত এবং অন্তর্নিহিত যোগাযোগগুলি থেকে আরও বিমূর্ততা সরবরাহ করে। এটির জন্য একটি বিশ্রামের শেষ পয়েন্টও দরকার যা $ সংস্থানসমূহের নিদর্শনগুলির সাথে সামঞ্জস্য করে। যেহেতু আপনি জিজ্ঞাসা করছেন, আমার পরামর্শটি $ http দিয়ে শুরু করা, পরিচিত হওয়া এবং পরে আপনি যদি $ সংস্থানটিতে স্থানান্তর করতে পারেন তবে দেখুন।
ডেভিড রিক্সিটেলি

4
উত্তর করার জন্য ধন্যবাদ. সুতরাং, কোন পরিস্থিতিতে $ এইচটিপি কখনও অপরিহার্য over সংস্থানগুলি বাদে আমি এপিআইয়ের সাথে পরিচিত হতে পারি?
টম

উত্তর:


168

$httpসাধারণ উদ্দেশ্যে এজেএক্স। বেশিরভাগ ক্ষেত্রে এটিই আপনি ব্যবহার করছেন। সঙ্গে $httpআপনি উপার্জন করা চলুন GET, POST, DELETEটাইপ নিজে কল এবং প্রক্রিয়াকরণের তারা আপনার নিজের উপর আসতে অবজেক্ট।

$resource$httpRESTful ওয়েব API পরিস্থিতিতে ব্যবহারের জন্য মোড়ানো ।


খুব সাধারণভাবে বলতে: একটি RESTful ওয়েব পরিষেবা যে HTTP- র পদ্ধতি পছন্দ উপর ভিত্তি করে যে ডাটা টাইপ সঙ্গে বিভিন্ন জিনিস আছে একটি ডাটা টাইপ জন্য এক শেষবিন্দু দিয়ে একটি সেবা হতে হবে GET, POST, PUT, DELETE, ইত্যাদি সুতরাং একটি সঙ্গে $resource, আপনি একটি কল করতে পারেন GETরিসোর্স পেতে একটি জাভাস্ক্রিপ্ট অবজেক্ট হিসাবে, তারপরে এটি পরিবর্তন করুন এবং এটি দিয়ে আবার প্রেরণ করুন POSTবা এটি দিয়ে মুছুন DELETE

... যদি তা বোঝা যায়।


1
সুতরাং $ রিসোর্স বিশ্রামিত পরিষেবাগুলি পরিচালনা করে, এর অর্থ এটি সাধারণ ওয়েব পরিষেবাদি কল করতেও ব্যবহৃত হতে পারে? যেহেতু এটি পোস্ট ডিলিট পুটটি করে দেয়। সুতরাং, কোন পরিস্থিতিতে $ HTTP $ উত্সের চেয়ে বেশি পছন্দ করে?
টম

7
সত্যিই যে কোনও সময় আপনি সত্যিকারের বিশ্রামের শেষ পয়েন্টটি নিয়ে কাজ করছেন না। উদাহরণস্বরূপ, যদি আপনার শেষ পয়েন্টটি কেবল জিইটিকে অনুমতি দেয় তবে আপনার প্রচুর কার্যকারিতা যুক্ত করে।
বেন লেশ

@blesh ব্যবহার তাই $resourceসেবা শুধুমাত্র কথ্য / ভাল যদি বিশ্রাম শেষবিন্দু সমর্থন হবে GET, POST, এবং DELETE ? দস্তাবেজগুলি ( docs.angularjs.org/api/ngResource.$resource ) দেখায় যে আপনি এই 3 টি আরইএসটি পদ্ধতিতে পান $resource
কেভিন মেরেডিথ

9
@ কেভিনমারেডিথ: বা এটি যে কোনও পদ্ধতি। আপনি যোগ করতে পারেন PUTবা অন্য কিছু আপনি চাই, GET, POSTএবং DELETEমাত্র অক্ষমতা আছে। যদি আপনার কোনও শেষ পয়েন্ট থাকে যা একই সংস্থানটির (যে গুরুত্বপূর্ণ) একাধিক এইচটিটিপি পদ্ধতির জন্য ডিল করে , তবে $resourceএটি একটি ভাল পছন্দ।
বেন লেশ

এমনকি কোনও অ-বিশ্রামিত শেষ পয়েন্টের জন্যও, আমি জিইটি এবং QUERY টাইপ ডেটার জন্য রিসোর্স ব্যবহার করা সুবিধাজনক বলে মনে করেছি। পথ দেওয়া .$promiseসুষ্ঠু কর্ম সঞ্চালনে সহায়ক resolveরাউটিং ও বাঁধাই জন্য।
কেভিন

210

আমি অনুভব করি যে অন্য উত্তরগুলি, সঠিক হলেও, প্রশ্নের মূলটিকে পুরোপুরি ব্যাখ্যা করবে না: RESTএটি একটি উপসেট HTTP। এর অর্থ হল যে যা করা যায় তার মাধ্যমে করা RESTযেতে পারে HTTPতবে যা করা যায় তার মাধ্যমেই করা যায় HTTPনা REST। যে কারণে অভ্যন্তরীণভাবে $resourceব্যবহার $httpকরে।

তো, একে অপরকে কখন ব্যবহার করবেন?

আপনার যা যা প্রয়োজন তা হ'ল REST, অর্থাৎ, আপনি কোনও RESTfulওয়েবসার্ভিস অ্যাক্সেস করার চেষ্টা করছেন , $resourceসেই ওয়েবসার্ভিসের সাথে ইন্টারঅ্যাক্ট করা অত্যন্ত সহজ করে তুলছে।

পরিবর্তে, আপনি যে কোনও RESTfulওয়েবসার্ভিস নয় এমন কোনও কিছুই অ্যাক্সেস করার চেষ্টা করছেন , আপনার সাথে যেতে হবে $http। মনে রাখবেন, আপনি কোনও ওয়েব RESTfulসার্ভিসের মাধ্যমেও অ্যাক্সেস করতে পারেন $http, এটি কেবল তার চেয়ে অনেক বেশি জটিল $resource। বেশিরভাগ লোক এঙ্গুলারজেএস এর বাইরে এটি ব্যবহার করে চলেছে jQuery.ajax( অ্যাংুলারের সমতুল্য $http)।


21
সুন্দর উত্তর, এটি গ্রহণ করা উচিত, শীর্ষে থাকা নয়
আন্দ্রেজ রেহমান

2
এর অর্থ আমাদের কাছে RESTful কল করার তিনটি উপায় আছে ?? $ রিসোর্স, $ http এবং jquery.ajax ব্যবহার করে আমি ঠিক আছি ??
জেক হুয়াং

4
@ জেকহুয়াং আপনি কোনও লাইব্রেরি ছাড়াই এটিকে কল করতে পারেন, এটি করার অনেক উপায় আছে। আমি সবেমাত্র অ্যাঙ্গুলারজেএস জগতের 2 সবচেয়ে জনপ্রিয় পদ্ধতির এবং এর বাইরের সর্বাধিক প্রচলিত পদ্ধতির বিষয়টি উন্মোচিত করেছি।
ব্লুহল্লু

আমি জানতে পারি অ্যাঙ্গুলারজেএস-এর 2 জনপ্রিয় পন্থাগুলি কী? : পি
জেক হুয়াং

41

$httpসাধারণ উদ্দেশ্যে এজেএক্স কল করে, যার সাধারণ অর্থ এটি RESTful এপিআই প্লাস নন-রেস্টস্টুল এপিআই অন্তর্ভুক্ত করতে পারে ।

এবং $resourceএই বিশ্রামের অংশের জন্য বিশেষায়িত ।

রেস্টফুল এপি সাম্প্রতিক বছরগুলিতে প্রচলিত হয়েছে কারণ প্রোগ্রামারদের দ্বারা তৈরি এলোমেলো url এর পরিবর্তে ইউআরএলটি আরও ভালভাবে সংগঠিত হয়েছে।

আমি url তৈরির জন্য যদি একটি RESTful API ব্যবহার করি তবে এটি এমন কিছু হবে /api/cars/:carId

$resource ডেটা আনার উপায়

angular.module('myApp', ['ngResource'])

    // Service
    .factory('FooService', ['$resource', function($resource) {
        return $resource('/api/cars/:carId')
    }]);

    // Controller
    .controller('MainController', ['FooService', function(FooService){
        var self = this;
        self.cars = FooService.query();
        self.myCar = FooService.get('123');

    }]);

এই আপনি একটি দেব রিসোর্স বস্তুর , যা দিয়ে সম্ভব না get, save, query, remove, deleteপদ্ধতি স্বয়ংক্রিয়ভাবে।

$http ডেটা আনার উপায়

angular.module('myApp', [])

    // Service
    .factory('FooService', ['$http', function($http){
        return {
            query: function(){
                return $http.get('/api/cars');
            },

            get: function(){
                return $http.get('/api/cars/123');
            }
            // etc...
        }

RESTFul API এ প্রতিটি সাধারণ ক্রিয়াকলাপ কীভাবে আমাদের সংজ্ঞায়িত করতে হয় তা দেখুন । এছাড়াও একটি পার্থক্য হ'ল $httpপ্রত্যাবর্তন করার promiseসময় $resourceকোনও বস্তু ফিরে আসে। রেষ্টাঙ্গুলারের মতো RESTFul এপিআইয়ের সাথে কৌণিক চুক্তিতে সহায়তা করার জন্য তৃতীয় পক্ষের প্লাগইন রয়েছে


যদি এপিআই কিছু থাকে /api/getcarsinfo। আমাদের জন্য সমস্ত অবশিষ্ট রয়েছে $http


4
এই উত্তর দেওয়া উচিত।
রই নমির 21

1
যদি এপিআই হয় তবে /api/getcarsinfoআমি অনুমান করি যে আমরা এখনও ব্যবহার করতে পারি$resource
কিট্টু

1
এই উত্তর দেওয়া উচিত। যখন আপনি বলেছিলেন "এছাড়াও একটি পার্থক্য হ'ল $ এইচটিপি প্রতিশ্রুতি দেয় যখন $ রিসোর্স কোনও বস্তু ফেরত দেয়" - এর অর্থ কি আমার ব্যবহার করা উচিত নয়? $ সংস্থান দিয়ে? 2- এছাড়াও একটি অগ্রণী ব্যক্তি হিসাবে এবং এটি নির্বাক শোনায় আমি কীভাবে জানতে পারি যে এপিআই শান্ত আছে বা না? ধন্যবাদ
shireef katab

1
@ শশীফখাতাব ১. হ্যাঁ, ST সংস্থানগুলি আরইএসটিএফএল এপিআই সংযোগের জন্য $ HTTP এর একটি উচ্চ স্তরের বিমূর্ততা। ডক উদাহরণ শো এটি কিভাবে ব্যবহার করতে। 2. এটি সম্পূর্ণরূপে নির্ভর করে যে কীভাবে আপনার ব্যাকএন্ড লোকটি ইউআরএল ডিজাইন করে। যদি তিনি RESTFul এপিআই দৃষ্টান্তের সাথে সামঞ্জস্য করতে চান তবে আপনি যেতে ভাল
কিয়াং

30

আমি মনে করি উত্তর যারা সম্পর্কে আরো নির্ভর করে আপনি সময় আপনি কোড লেখার দিকে রয়েছে। ব্যবহারের $httpআপনি, কৌণিক করতে চলেছেন নতুন যতক্ষণ না আপনি জানেন আপনি কেন প্রয়োজন হলে $resourceযতক্ষণ না আপনি কিভাবে কংক্রিট অভিজ্ঞতা থাকতে $httpআপনি ফিরে অধিষ্ঠিত করা হয়, এবং আপনি ব্যবহার প্রভাব বুঝতে $resourceমধ্যে আপনার কোড সঙ্গে, লাঠি $http

এটি আমার অভিজ্ঞতা ছিল: আমি আমার প্রথম কৌণিক প্রকল্পটি শুরু করেছি, আমাকে একটি রেস্ট্রুলফুল ইন্টারফেসে এইচটিটিপি অনুরোধ করা দরকার ছিল, সুতরাং আপনি এখন একই গবেষণা চালিয়ে যাচ্ছেন did আমি এর মতো এসও প্রশ্নগুলিতে যে আলোচনাটি পড়েছি তার উপর ভিত্তি করে আমি সাথে যেতে বেছে নিয়েছি $resourceএই ভুলটি আমি চাই যদি আমি পূর্বাবস্থাপন করতে পারি। কারণটা এখানে:

  1. $httpউদাহরণগুলি প্রচুর পরিমাণে, সহায়ক এবং সাধারণত আপনার যা প্রয়োজন। সুস্পষ্ট $resourceউদাহরণগুলি দুর্লভ এবং (আমার অভিজ্ঞতায়) খুব কমই আপনার প্রয়োজন সমস্ত কিছুই everything কৌণিক নবাগত মহিলার জন্য, আপনি পরবর্তীকালে নিজের পছন্দটির প্রভাবগুলি বুঝতে পারবেন না, যখন আপনি ডকুমেন্টেশনটি নিয়ে বিস্মিত হয়ে আটকে থাকবেন এবং রাগ করছেন যে আপনাকে $resourceসহায়তা করার জন্য সহায়ক উদাহরণগুলি খুঁজে পাচ্ছেন না ।
  2. $httpআপনি যা খুঁজছেন তা সম্ভবত 1-থেকে -1 মানসিক মানচিত্র। আপনি কী পাবেন তা বুঝতে আপনাকে নতুন ধারণাটি শিখতে হবে না $http$resourceআপনার কাছে এখনও মানসিক মানচিত্র নেই বলে প্রচুর উপদ্রব নিয়ে আসে।
  3. ওফ, আমি কি বলেছিলাম যে আপনাকে নতুন ধারণাটি শিখতে হবে না? কৌনিক নবাগত হিসাবে আপনি কি প্রতিশ্রুতি সম্পর্কে জানতে হবে। $httpএকটি প্রতিশ্রুতি দেয় এবং .thenসক্ষম হয়, যাতে আপনি কৌণিক এবং প্রতিশ্রুতি সম্পর্কে শিখছেন এমন নতুন জিনিসগুলির সাথে এটি খাপ খায়। $resource, যা সরাসরি কোনও প্রতিশ্রুতি দেয় না, কৌণিক মৌলিক বিষয়গুলিতে আপনার অভ্যাসগত জটিলটিকে জটিল করে তোলে।
  4. $resourceশক্তিশালী কারণ এটি RESTful CRUD কলগুলির কোড এবং ইনপুট এবং আউটপুটের জন্য রূপান্তরকে ঘনীভূত করে। আপনি $httpনিজের ফলাফলগুলি প্রক্রিয়া করতে বারবার কোড লিখতে অসুস্থ হলে তা দুর্দান্ত । অন্য কারও $resourceকাছে সিনট্যাক্স এবং প্যারামিটার পাসিংয়ের একটি ক্রিপ্টিক স্তর যুক্ত করে যা বিভ্রান্তিকর।

আমি আশা করি আমি 3 মাস আগে আমাকে চিনতাম, এবং আমি দৃ emp়তার সাথে নিজেকে বলব: " $httpবাচ্চা সঙ্গে লাঠি এটি ঠিক আছে" "


1
আমি আপনার উত্তরটি পছন্দ করি, বিশেষত শেষ পংক্তিটি। আমি বর্তমানে $ রিসোর্স বনাম $ HTTP ব্যবহারের স্থান পরিবর্তন করছি। আমি যে জিনিসটি যুক্ত করেছিলাম তা হ'ল $ সংস্থানগুলি সত্যই কেবল কার্যকর হয় এবং আপনি যখন একই এপিআই বিশেষ্য ব্যবহার করেন /user/:userIdবা পছন্দ করেন তখন আসলে সহায়তা করে /thing। একবার সরানোর /users/roles/:roleIdপরে আপনাকে প্রতি ক্রিয়া ভিত্তিতে $ রিসোর্স ইউআরএল এবং প্যারামগুলি সংশোধন করতে হবে এবং আপনি সেই সময়ে at এইচটিপি ব্যবহার করতে পারেন।
coblr

3
আমার নিজের উত্তরে মন্তব্য করার জন্য আমাকে সিজোফ্রেনিক বলুন, তবে আমি ভেবেছিলাম আমি আরও সাম্প্রতিক অভিজ্ঞতা উল্লেখ করব। আমি স্থানগুলিতে সরিয়ে $resourceএবং স্যুইচ করতে রিফ্যাক্টর করছি $http। আমি কখনই পূরণ করতে পারি না এমন ইচ্ছা কতটা ইচ্ছা জোর দিয়ে বলতে পারি না $resource। আমি সম্ভবত $resourceকয়েক মাসের সংক্ষিপ্তসারগুলি তাড়া করে এক সপ্তাহেরও বেশি সময় নষ্ট করেছি । $httpএত সহজ এবং সোজা, যে কোনও লাভই $resourceশেখার বক্ররেখার দ্বারা পুরোপুরি মুছে ফেলা হয়েছিল।
ম্যাথু মেরিচিবা

24

আমি মনে করি যে জোর দেওয়া জরুরী যে $ সংস্থানটি কোনও কাঁচা স্ট্রিং নয়, সার্ভারের কাছ থেকে প্রতিক্রিয়া হিসাবে অবজেক্ট বা অ্যারের প্রত্যাশা করে। সুতরাং প্রতিক্রিয়া হিসাবে যদি আপনার কাছে কাঁচা স্ট্রিং (বা অবজেক্ট এবং অ্যারে ব্যতীত অন্য কিছু) থাকে তবে আপনাকে $ http ব্যবহার করতে হবে


এর অর্থ কি $ http কোনও অবজেক্ট এবং অ্যারে সমর্থন করে না? শুধু স্পষ্ট করতে চেয়েছিলেন।
শারদুল

আমি বিশ্বাস করি $ এইচটিপি অবজেক্টস, অ্যারে এবং স্ট্রিংগুলিকে সমর্থন করে - আমার যদিও
এটির

@ শারদুল, আমি বুঝতে পেরেছিলাম যে $ এইচটিপি কোনও ধরণের প্রতিক্রিয়া নিয়ে কাজ করে তবে $ সংস্থানগুলি কেবলমাত্র বস্তু এবং অ্যারেগুলির সাথেই ডিল করে।
শিরিফ খাতব

সত্য নয়, আপনি এখনও একটি স্ট্রিং ফিরিয়ে দেওয়ার জন্য $ সংস্থান ব্যবহার করতে পারেন। কোনও অবজেক্টে ফিরে আসা স্ট্রিং মোড়ানোর জন্য আপনার ফ্রন্টএন্ড কোডে 'ট্রান্সফর্মআরস্পোন' ব্যবহার করুন।
টেরি ডেঙ্গ

7

প্রযুক্তিগতভাবে কথা বলার $httpবা চয়ন করার ক্ষেত্রে যখন $resourceকোনও সঠিক বা ভুল উত্তর নেই তখন উভয়ই একই কাজ করবে।

এর উদ্দেশ্যটি $resourceহ'ল প্যারামিটারের মানগুলির সাথে আপনাকে কোনও টেম্পলেট স্ট্রিং (একটি স্ট্রিং যাতে স্থানধারক রয়েছে) পাস করার অনুমতি দেওয়া। টেমপ্লেট স্ট্রিং থেকে স্থানধারকগুলিকে পরামিতি মানগুলির সাথে $resourceপ্রতিস্থাপন করবে যা বস্তু হিসাবে পাস হচ্ছে। আরআরএসএফুল ডেটাসোর্সের সাথে ইন্টারঅ্যাক্ট করার সময় এটি বেশিরভাগ কার্যকর কারণ তারা ইউআরএল সংজ্ঞায়িত করতে অনুরূপ নীতিগুলি ব্যবহার করে।

$httpঅ্যাসিক্রোনাস এইচটিটিপি অনুরোধগুলি সম্পাদন করা কি ।


1
এটি একটি ভাল উত্তর কারণ এটি উল্লেখ করে যে $ HTTP হ'ল $ সংস্থান থেকে অনুরোধগুলিকে শক্তি দেয় এবং তা হয় মূলত একই জিনিসটি করে।
coblr

@Dalorzo তাই আপনি বলতে চাওয়ার কথা বলছেন $resourceঅ্যাসিঙ্ক্রোনাস সঞ্চালন করা সম্ভব নয়? কেবল স্পষ্ট করে বলতে চেয়েছিলেন
কিট্টু

না, আমি যেটা উল্লেখ করেছি তা $http$resource
হ'ল শেষটি হ'ল অ্যাসিনক্রোনাস

2

রিসর্ট এপিএসআইয়ের সাথে কাজ করার জন্য রিসোর্স পরিষেবা কেবল দরকারী পরিষেবা useful যখন আপনি এটি ব্যবহার করেন আপনি নিজের CRUD পদ্ধতিগুলি লিখবেন না (তৈরি করুন, পড়া, আপডেট করুন এবং মুছুন)

যতদূর আমি এটি দেখছি, সংস্থান পরিষেবাটি একটি শর্টকাট, আপনি HTTP পরিষেবা দিয়ে যে কোনও কিছু করতে পারেন।


আমি নিশ্চিত নই যে আমি শর্টকাট হিসাবে $ সংস্থানটি শ্রেণিবদ্ধ করব। এটি $ HTTP এর জন্য একটি মোড়ক, সুতরাং $ http ব্যবহার করা সরাসরি "খাটো" হবে। এটি আপনার জন্য $ http কনফিগার করার একটি উপায় যাতে $ http ব্যবহার করার সময় আপনার সম্ভাব্য কম কোড থাকে। এক ক্ষেত্রে $http.get('/path/to/thing', params)বনাম myResource.get(params)প্লাস আসলে কনফিগারেশন করা myResource। আরও কোড আপ ফ্রন্ট এবং কেবল সত্যই একই এপিআই বিশেষ্যটির সাথে সাঁতার কাটে। অন্যথায়, আপনি ঠিক তেমন কোডিং করছেন যেমন আপনি $ http ব্যবহার করেছেন।
coblr

2

একটি জিনিস noticed HTTP- র উপর $ HTTP ব্যবহার করার সময় আমি লক্ষ্য করেছি আপনি যদি নেট নেট এ ওয়েব এপিআই ব্যবহার করছেন

$ সংস্থানটিকে একটি নিয়ামকের সাথে আবদ্ধ করা হয় যা একক উদ্দেশ্য সম্পাদন করে।

$ রিসোর্স ('/ ইউজার /: ইউজারআইডি', {ইউজারআইডি: '@ আইডি';);

[HttpGet]
public bool Get(int id)
{
    return "value"
}

public void Post([FromBody]string value)
{
}

public void Put(int id, [FromBody]string value)
{
}

public void Delete(int id)
{
}

যদিও $ http কিছু হতে পারে। শুধু ইউআরএল নির্দিষ্ট করুন।

$ http.get - "এপিআই / প্রমাণীকরণ"

[HttpGet]
public bool Authenticate(string email, string password)
{
    return _authenticationService.LogIn(email, password, false);
}

এটা আমার মতামত।


0

$ রিসোর্স পরিষেবা বর্তমানে প্রতিশ্রুতিগুলি সমর্থন করে না এবং তাই $ HTTP পরিষেবাটির জন্য আলাদা আলাদা ইন্টারফেস রয়েছে।


1
$ সংস্থান পরিষেবাটি প্রতিশ্রুতিগুলি সমর্থন করে, তবে এটি কোনও $ প্রতিশ্রুতি সরাসরি like HTTP-র মতো দেয় না। তোমার মত এটা করতে হবে var myResource = $resource(...config...);সেবা আপনি না তারপর অন্য কোথাও return myResource.get(..params...)বা আপনি কি করতে পারেনvar save = myResource.save(); save.$promise.then(...fn...); return save;
coblr
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.