আমাদের কেন থেকে ফায়ারবাডি এবং ফিউউরি নির্দিষ্ট করতে হবে?


157

কেন FromBodyএবংFromUri বৈশিষ্ট্যাবলী ASP.NET ওয়েব API` প্রয়োজন?

বৈশিষ্ট্যগুলি ব্যবহার করা এবং সেগুলি ব্যবহার না করার মধ্যে কী পার্থক্য রয়েছে?


11
[ফ্রমবিডি] টীকাটি কখন ব্যবহার করা কার্যকর হতে পারে সে সম্পর্কে কেবল একটি ইঙ্গিত দেওয়ার জন্য: উদাহরণস্বরূপ ইউআরএল-এ এনকোড করা প্যারামিটারের মতো ব্যবহারকারীর নাম / পাসওয়ার্ডের মতো স্থির শংসাপত্রগুলি পাঠানো দুর্বল অনুশীলন। যদিও এসএসএল-এনক্রিপশন কোনও তৃতীয় পক্ষের ইউআরএল-এর মধ্যে প্যারামিটারগুলিতে পঠন অ্যাক্সেস পেতে পারে তা রোধ করতে পারে, তবুও এটি খারাপ অভ্যাস থেকে যায়, কারণ এই শংসাপত্রগুলি ব্রাউজার লগ এবং সমতুল্যে সঞ্চিত থাকতে পারে যা অবশ্যই পছন্দসই নয়। এই জাতীয় ক্ষেত্রে, কেউ এইচটিটিপি বার্তার প্রধান অংশের মধ্যে একটি প্যারামিটার সঞ্চয় করতে বাধ্য করতে, একটি উচ্চতর পরিচয় করিয়ে দিয়ে [ফ্রিবিডি] টীকাটি ব্যবহার করতে পারে
ক্রিস

উত্তর:


193

ASP.NET ওয়েব এপিআই একটি নিয়ামক উপর একটি পদ্ধতি কল, তখন তা মান পরামিতি জন্য, একটি প্রক্রিয়া নামক সেট করতে হবে বাঁধাই প্যারামিটার

ডিফল্টরূপে, ওয়েব এপিআই প্যারামিটারগুলি আবদ্ধ করতে নিম্নলিখিত বিধিগুলি ব্যবহার করে:

  • যদি প্যারামিটারটি একটি "সাধারণ" প্রকারের হয় তবে ওয়েব এপিআই ইউআরআই থেকে মানটি পাওয়ার চেষ্টা করে । সাধারণ ধরণের মধ্যে .NET আদিম প্রকারগুলি (ইনট, বুল, ডাবল এবং আরও এগিয়ে), এবং টাইমস্প্যান, ডেটটাইম, গাইড, দশমিক এবং স্ট্রিং অন্তর্ভুক্ত থাকে এবং কোনও ধরণের রূপান্তরকারী স্ট্রিং থেকে রূপান্তর করতে পারে এমন কোনও ধরণের থাকে।

  • জটিল ধরণের জন্য , ওয়েব এপিআই একটি মিডিয়া-টাইপ ফর্ম্যাটর ব্যবহার করে বার্তাটির প্রধান অংশ থেকে মানটি পড়ার চেষ্টা করে।

সুতরাং, আপনি যদি উপরের ডিফল্ট আচরণটি ওভাররাইড করতে চান এবং ওয়েব এপিআইকে ইউআরআই থেকে কোনও জটিল ধরণের পড়তে বাধ্য [FromUri]করেন তবে প্যারামিটারে বৈশিষ্ট্য যুক্ত করুন । অনুরোধ সংস্থা থেকে ওয়েব এপিআইকে একটি সাধারণ প্রকারটি পড়তে বাধ্য [FromBody]করতে, প্যারামিটারে অ্যাট্রিবিউট যুক্ত করুন ।

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

নেই অনেক বেশি তথ্য ওয়েবে যদি আপনি Google "ওয়েব এপিআই বাঁধাই পরামিতি"।


2
@ ব্যবহারকারী 3510527: আপনি না চাইলে এই বৈশিষ্ট্যগুলি ব্যবহার করতে হবে না, যতক্ষণ না আপনি ডিফল্ট আচরণ অনুসরণ করেন। আপনি যদি ডিফল্ট আচরণ পরিবর্তন করতে চান তবে আপনার সেগুলি ব্যবহার করা দরকার।
jজিকায়ে

1
যদি এটির ডিফল্ট আচরণ হয় তবে আমাদের কেন ওভারভারাইড করা দরকার এবং আমরা যদি এই গুণটি উল্লেখ করেছি তবে আমরা কী উপকার পাব?
রজনীশ

1
@ user3510527 আপনার ওভাররাইড করার দরকার নেই । আপনি কেবল ডিফল্ট আচরণ ব্যবহার করতে পারেন। একটি উদাহরণ যেখানে কেউ ওভাররাইড করতে চাইলে তা হ'ল যদি তারা অনুরোধের শুরুর দিকে কোনও সাধারণ পূর্ণসংখ্যার সরবরাহ করতে চান কারণ, ডিফল্টরূপে, এটি ইউআরআই-তে এটি খুঁজে পাওয়ার আশা করবে। মূলত, আপনি চাইলে আপনি কেবল ডিফল্ট আচরণ ছেড়ে দিতে পারেন বা আপনি ওভাররাইড করতে পারেন, এটি কেবল আপনার কাছে একটি বিকল্প। বিভ্রান্তি কী তা আমি বুঝতে পারছি না।
djikay

আমি কেবলমাত্র যদি আমরা ফর্মের বৈশিষ্ট্যটি ব্যবহার করি তবে অভ্যন্তরীণ কাজ প্রক্রিয়াটি জানতে চাই, তাই সরাসরি এটির মান পাওয়া যাবে এবং কোনও ইউরি বা জবরদস্তি যাচাই করা হবে না ...
রজনীশ

7
আমি ভাবছি যদি এক একটি বৈশিষ্ট্য বলা বানাতে পারে JustGetItযা মত একাধিক গুণাবলীকে যোগ করার একই উদ্দেশ্য করে তোলে [FromBody, FromQuery]ইত্যাদি
মাফিন ম্যান

93

ডিফল্ট আচরণটি হ'ল:

  1. প্যারামিটারটি হলে আদিম প্রকার ( int, bool, double, ...), ওয়েব এপিআই চেষ্টা থেকে মান পেতে কোনো URI HTTP অনুরোধ করুন।

  2. জন্য জটিল ধরনের (আপনার নিজের বস্তু, উদাহরণস্বরূপ: Person), ওয়েব এপিআই চেষ্টা থেকে মান পড়তে শরীর HTTP অনুরোধ করুন।

সুতরাং, যদি আপনি:

  • ইউআরআইতে একটি আদিম ধরণ, বা
  • শরীরে একটি জটিল ধরনের

... তাহলে আপনাকে কোনও বৈশিষ্ট্য যুক্ত করতে হবে না ( [FromBody]নাও [FromUri])।

কিন্তু, যদি আপনি একটি আছে আদিম টাইপ মধ্যে শরীর , তাহলে আপনি যোগ আছে[FromBody] আপনার WebAPI নিয়ামক পদ্ধতি আপনার আদিম টাইপ প্যারামিটার সামনে। (কারণ, ডিফল্টরূপে, ওয়েবএপিআই এইচটিটিপি অনুরোধের ইউআরআইতে আদিম ধরণের সন্ধান করছে))

অথবা, আপনার ইউআরআইতে যদি কোনও জটিল ধরণের থাকে তবে আপনাকে অবশ্যই যুক্ত করতে হবে[FromUri] । (কারণ, ডিফল্টরূপে, ওয়েবএপিআই ডিফল্টরূপে HTTP অনুরোধের শরীরে জটিল ধরণের সন্ধান করছে is)

আদিম ধরণের:

public class UsersController : ApiController
{
    // api/users
    public HttpResponseMessage Post([FromBody]int id)
    {

    }
    // api/users/id
    public HttpResponseMessage Post(int id)
    {

    }       
}

জটিল ধরণের:

public class UsersController : ApiController
{       
    // api/users
    public HttpResponseMessage Post(User user)
    {

    }

    // api/users/user
    public HttpResponseMessage Post([FromUri]User user)
    {

    }       
}

এটি আপনার HTTP অনুরোধে কেবলমাত্র একটি প্যারামিটার প্রেরণ না করা পর্যন্ত এটি কাজ করেএকাধিক পাঠানোর সময় আপনাকে একটি কাস্টম মডেল তৈরি করতে হবেযা আপনার সমস্ত পরামিতি এর মতো:

public class MyModel
{
    public string MyProperty { get; set; }
    public string MyProperty2 { get; set; }
}

[Route("search")]
[HttpPost]
public async Task<dynamic> Search([FromBody] MyModel model)
{
    // model.MyProperty;
    // model.MyProperty2;
}

মাইক্রোসফ্টের এএসপি.নেট ওয়েব এপিআই-তে পরামিতি বাইন্ডিংয়ের ডকুমেন্টেশন থেকে :

যখন কোনও প্যারামিটারে [ফ্রমবিডি] থাকে, ওয়েব এপিআই একটি ফর্ম্যাটর নির্বাচন করতে সামগ্রী-প্রকারের শিরোনাম ব্যবহার করে। এই উদাহরণে, সামগ্রীর ধরণটি হ'ল "অ্যাপ্লিকেশন / জসন" এবং অনুরোধের বডিটি একটি কাঁচা জেএসএন স্ট্রিং (কোনও জেএসএন বস্তু নয়)। সর্বাধিক একটি প্যারামিটার বার্তার মূল অংশ থেকে পড়ার অনুমতি দেওয়া হয়।

এই কাজ করা উচিত:

public HttpResponseMessage Post([FromBody] string name) { ... }

এটি কাজ করবে না:

// Caution: This won't work!    
public HttpResponseMessage Post([FromBody] int id, [FromBody] string name) { ... }

এই নিয়মের কারণ হ'ল অনুরোধের শরীরটি একটি নন-বাফার স্ট্রিমে সঞ্চিত থাকতে পারে যা কেবল একবারই পড়তে পারে।


5
"সর্বাধিক একটি প্যারামিটারটি বার্তার মূল অংশ থেকে পড়ার অনুমতি রয়েছে" বিশেষত সহায়ক তথ্য ছিল
রায়ান

15

উপরের উত্তরের সাথে কেবল যুক্ত করুন ..

[ফ্রিউরি] কোয়েরিস্ট্রিং থেকে প্যারামিটারগুলি পাস করার পরিবর্তে ইউরি পরামিতিগুলি থেকে জটিল ধরণের বাঁধতেও ব্যবহার করা যেতে পারে

প্রাক্তন জন্য ..

public class GeoPoint
{
    public double Latitude { get; set; } 
    public double Longitude { get; set; }
}

[RoutePrefix("api/Values")]
public ValuesController : ApiController
{
    [Route("{Latitude}/{Longitude}")]
    public HttpResponseMessage Get([FromUri] GeoPoint location) { ... }
}

যেমন বলা যেতে পারে:

http://localhost/api/values/47.678558/-122.130989

12

যখন কোনও প্যারামিটারে [ফ্রমবিডি] থাকে, ওয়েব এপিআই একটি ফর্ম্যাটর নির্বাচন করতে সামগ্রী-প্রকারের শিরোনাম ব্যবহার করে। এই উদাহরণে, সামগ্রীর ধরণটি হ'ল "অ্যাপ্লিকেশন / জসন" এবং অনুরোধের বডিটি একটি কাঁচা জেএসএন স্ট্রিং (কোনও জেএসএন বস্তু নয়)।

সর্বাধিক একটি প্যারামিটার বার্তার মূল অংশ থেকে পড়ার অনুমতি দেওয়া হয়। সুতরাং এটি কাজ করবে না:

 // Caution: Will not work!    
public HttpResponseMessage Post([FromBody] int id, [FromBody] string name) { ... }

এই নিয়মের কারণ হ'ল অনুরোধের শরীরটি একটি নন-বাফার স্ট্রিমে সঞ্চিত থাকতে পারে যা কেবল একবারই পড়তে পারে

আরও তথ্যের জন্য দয়া করে ওয়েবসাইটে যান: http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api

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