ওয়েব অপি অ্যাট্রিবিউট রাউটিংয়ে .চ্ছিক পরামিতি


90

আমি নিম্নলিখিত API- কলের POST পরিচালনা করতে চাই:

/v1/location/deviceid/appid

পোস্ট-বডি থেকে অতিরিক্ত প্যারামিটার আসছে।

এই সব আমার জন্য ভাল কাজ করে। এখন আমি "ডিভাইসিড" এবং / অথবা "অ্যাপিড" এবং / বা বডিডাটা শূন্য হতে দিয়ে আমার কোডটি প্রসারিত করতে চাই না:

/v1/location/deviceid
/v1/location/appid
/v1/location/

এই 3 টি ইউআরএল একই রুটের দ্বারা সাড়া দেওয়া উচিত।

আমার প্রথম পদ্ধতির (বডিডাটা প্রয়োজনীয়):

[Route("v1/location/{deviceid}/{appid}", Name = "AddNewLocation")]
public location_fromuser Post(string deviceid = null, string appid = null, [FromBody] location_fromuser BodyData)
{
    return repository.AddNewLocation(deviceid, appid, BodyData);
}

এটি কাজ করে না এবং একটি সংকলন ত্রুটি প্রদান করে:

"alচ্ছিক প্যারামিটারগুলি অবশ্যই শেষে থাকা উচিত"

পরবর্তী চেষ্টা:

[Route("v1/location/{deviceid}/{appid}", Name = "AddNewLocation")]
public location_fromuser Post([FromBody] location_fromuser BodyData, string deviceid = null, string appid = null)

এখন আমার ফাংশন অ্যাডনিউওলোকেশন () সর্বদা একটি হয় BodyData=null- এমনকি কলটি বডি পাঠায়।

অবশেষে আমি সমস্ত 3 টি প্যারামিটার optionচ্ছিক সেট করেছি:

[Route("v1/location/{deviceid}/{appid}", Name = "AddNewLocation")]
public location_fromuser Post(string deviceid = null, string appid = null, [FromBody location_fromuser BodyData = null)

কাজ না:

Ptionচ্ছিক পরামিতি BodyDataদ্বারা সমর্থিত নয় FormatterParameterBinding

আমি কেন optionচ্ছিক পরামিতিগুলির সাথে সমাধান চাই? আমার কন্ট্রোলার একটি পোষ্টের মাধ্যমে কেবল "একটি নতুন অবস্থান যুক্ত করা" পরিচালনা করে।

আমি ভুল তথ্য আমার নিজের ব্যতিক্রম বা ত্রুটি বার্তা প্রেরণ করতে চাই। এমনকি যদি কলটির মূল্য নেই। এই ক্ষেত্রে আমি আমার কোড অনুসারে কোনও ব্যতিক্রম বা ডিফল্ট সেট করার সিদ্ধান্ত নিতে সক্ষম হতে চাই।

উত্তর:


177

আগত অনুরোধের মতো /v1/location/1234, যেমন আপনি কল্পনা করতে পারেন যে ওয়েব এপিআই'র জন্য স্বয়ংক্রিয়ভাবে নির্ধারণ করা কঠিন হবে যে '1234' এর সাথে সম্পর্কিত বিভাগটির মান সম্পর্কিত কিনা appidএবং না deviceid

আমি মনে করি আপনার রুট টেম্পলেটটি পরিবর্তিত হওয়া উচিত [Route("v1/location/{deviceOrAppid?}", Name = "AddNewLocation")]এবং তারপরে deiveOrAppidআইডির ধরণটি সনাক্ত করার জন্য পার্স করা উচিত ।

এছাড়াও আপনাকে রুট টেম্পলেটে বিভাগগুলি নিজেই alচ্ছিক করা দরকার অন্যথায় বিভাগগুলি প্রয়োজনীয় হিসাবে বিবেচিত হবে। এক্ষেত্রে ?চরিত্রটি নোট করুন । উদাহরণ স্বরূপ: [Route("v1/location/{deviceOrAppid?}", Name = "AddNewLocation")]


56
?রুটের টেম্পলেটটির ভিতরে আমি যা খুঁজছিলাম। +1
কালটোরাক

4
আমি এটি বলব না যে "ডিভাইসআর অ্যাপআইডি" সেরা ডিজাইনের পছন্দ। আমি মনে করি এআইপিএলটিকে সর্বদা সংজ্ঞা দিয়ে জানা উচিত যদি সম্ভব হয় তবে এটি কী পাবে।
নীলস ব্রিঞ্চ

14
কেবল তথ্যের জন্য - যখন আমরা ?অক্ষর ব্যবহার করে অ্যাকশন ইউরির মধ্যে প্যারামিটারটিকে asচ্ছিক হিসাবে চিহ্নিত করি তখন আমাদের অবশ্যই মেথথ সিগনেচারের প্যারামিটারগুলিতে ডিফল্ট মান সরবরাহ করতে হবে যেমন মাইমথোড (স্ট্রিং নাম = "someDefaultValue", int? Id = নাল)।
আরবিটি

@ আরবিটি আপনি দা রিয়েল এমভিপি, আমি এক মিনিটের জন্য সেখানে স্টাম্পড হয়ে গেলাম। ধন্যবাদ!
ছাঃ

4
শীতল। খুশি যে এটি আপনাকে @ এসএম এ সহায়ক বলে মনে হয়েছে আমি আমার মন্তব্যটিকে আরও ভালভাবে দৃশ্যমানতার জন্য উত্তরে রূপান্তর করেছি। এটি কিরণের পোস্টে একটি অ্যাড-অন হবে।
আরবিটি

45

অন্য তথ্য: আপনি যদি কোনও রুট সীমাবদ্ধতা ব্যবহার করতে চান তবে কল্পনা করুন যে আপনি যে প্যারামিটারটিতে ইনট ডেটাটাইপ যুক্ত করেছেন তা জোর করতে চান তবে আপনার এই বাক্য গঠনটি ব্যবহার করতে হবে:

[Route("v1/location/**{deviceOrAppid:int?}**", Name = "AddNewLocation")]

? চরিত্র সবসময় আগে শেষ করা হয় } চরিত্র

আরও তথ্যের জন্য দেখুন: Uচ্ছিক ইউআরআই প্যারামিটার এবং ডিফল্ট মান


18

আমার মন্তব্যটি কিরণ চালের উত্তর পরিপূরক হিসাবে জবাব হিসাবে রূপান্তর করা শ্রোতাদের জন্য সহায়ক বলে মনে হচ্ছে-

যখন আমরা অ্যাকশন ইউরিতে ?অক্ষর ব্যবহার করে একটি প্যারামিটারটিকে বিকল্প হিসাবে চিহ্নিত করি তখন আমাদের অবশ্যই নীচে প্রদর্শিত পদ্ধতি অনুসারে পদ্ধতি স্বাক্ষরের পরামিতিগুলিতে ডিফল্ট মান সরবরাহ করতে হবে:

MyMethod(string name = "someDefaultValue", int? Id = null)


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