ASP.NET ওয়েব API এ .চ্ছিক ক্যোয়ারী স্ট্রিং পরামিতি


212

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

/api/books?author=XXX&title=XXX&isbn=XXX&somethingelse=XXX&date=XXX

ক্যোরিয় স্ট্রিংয়ের সমস্ত প্যারামিটার শূন্য হতে পারে। অর্থাৎ কলার 0 টি থেকে 5 টি প্যারামিটারের মধ্যে সমস্ত নির্দিষ্ট করতে পারে।

ইন MVC4 বিটা আমি নিম্নোক্ত কাজ করতে ব্যবহৃত:

public class BooksController : ApiController
{
    // GET /api/books?author=tolk&title=lord&isbn=91&somethingelse=ABC&date=1970-01-01
    public string GetFindBooks(string author, string title, string isbn, string somethingelse, DateTime? date) 
    {
        // ...
    }
}

এমভিসি 4 আরসি আর এর মতো আচরণ করে না। যদি আমি 5 টিরও কম পরামিতি নির্দিষ্ট করি তবে এটি একটি উক্তিটির সাথে জবাব দেয় 404:

অনুরোধটির সাথে মিলে এমন নিয়ন্ত্রণকারী 'বই' তে কোনও পদক্ষেপ পাওয়া যায়নি।

ইউআরএল রাউটিংয়ে optionচ্ছিক প্যারামিটারটি নির্দিষ্ট করে না দিয়ে এটিকে আগের মতো ব্যবহার করার সঠিক পদ্ধতি স্বাক্ষর কী?


পদক্ষেপে [httpget] রাখুন।
ব্যবহারকারী 960567

2
আমি যদি সমস্ত পরামিতি সেট করি তবে পদ্ধতিটি কল হয়; তদ্ব্যতীত এটি শুরু হয় Getতাই এটি স্বয়ংক্রিয়ভাবে HTTP GETপদ্ধতির সাথে আবদ্ধ ...
ফ্রেপন্টিলো

ওয়েব এপিআই রাউটিংটি এভাবেই
ওভিউভিউ

4
হ্যাঁ. আমি জানি এটি কীভাবে কাজ করে। আমি এই নির্দিষ্ট পরিস্থিতিতে এটি কাজ করতে পারি না।
ফ্রেপন্টিলো

এটি কীভাবে সংকলন করেছিল? string?একটি বৈধ প্রকার নয়। stringএটি একটি প্রকারের প্রকারের কারণে আপনি একটি প্রবণতা জাতীয় হিসাবে ঘোষণা করতে পারবেন না ।
একুস্টিকমার্টিন

উত্তর:


307

এমভিসি 4 এর নিয়মিত প্রকাশে এই সমস্যাটি স্থির করা হয়েছে। এখন আপনি এটি করতে পারেন:

public string GetFindBooks(string author="", string title="", string isbn="", string  somethingelse="", DateTime? date= null) 
{
    // ...
}

এবং সমস্ত কিছু বাক্সের বাইরে কাজ করবে।


আমি কি এখানে ডিফল্ট হিসাবে নাল ব্যবহার করতে পারি? উদাহরণস্বরূপ: স্ট্রিং লেখক = নাল?
বরিস জিঙ্কেঙ্কো

2
হ্যাঁ, nullএকটি ধ্রুবক অভিব্যক্তি হিসাবে বিবেচিত হয় এবং তাই একটি বৈধ ডিফল্ট মান
জেডগ

আমি অবাক হই যে এখানে কেন বলা হয়েছে alচ্ছিক পরামিতিগুলির জন্য আমাদের কেন ডিফল্ট মান উল্লেখ করতে হবে । সি # তে যে কোনও প্রকারের সর্বদা একটি ডিফল্ট মান থাকে তাই রান-টাইম রাউটিংটি ইউআরআই থেকে না এলে টাইপের ডিফল্ট মানটি গ্রহণ করতে পারত। এর পিছনে কারিগরি কারণ কী ?. আমি নিশ্চিত এটির মডেল বাইন্ডারের সাথে কিছু করার আছে।
আরবিটি

@ আরবিটি যাতে রুটটি মিলতে পারে
জেমস ওয়েস্টগেট

আমি তারিখের প্যারামিটারগুলি ব্যবহার করছিলাম এবং আমি যদি তাদের কেবলমাত্র স্থির করে রাখি তবে এটি কাজ করছে না। সুতরাং আমি এটিকে অগ্রহণযোগ্য এবং সেটটি ডিফল্ট মান হিসাবে নাল করতে হবে এবং সে অনুযায়ী সার্ভারের পাশের বৈধতা ব্যবহার করতে হবে এবং ত্রুটি বার্তাগুলি ফিরিয়ে দিতে হবে। এটা কাজ করেছে.
আটটা এইচ।

85

বিজয়ের পরামর্শ অনুসারে একক মডেল হিসাবে একাধিক পরামিতি পাস করা সম্ভব। আপনি জিওআর প্যারামিটার বৈশিষ্ট্যটি ব্যবহার করার সময় এটি জিইটির পক্ষে কাজ করে। এটি WebAPI কে ক্যোয়ারী প্যারামিটারগুলি থেকে মডেলটি পূরণ করতে বলে।

ফলাফলটি কেবল একটি একক প্যারামিটার সহ একটি ক্লিনার নিয়ামক ক্রিয়া। আরো তথ্য দেখুন জন্য: http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api

public class BooksController : ApiController
  {
    // GET /api/books?author=tolk&title=lord&isbn=91&somethingelse=ABC&date=1970-01-01
    public string GetFindBooks([FromUri]BookQuery query)
    {
      // ...
    }
  }

  public class BookQuery
  {
    public string Author { get; set; }
    public string Title { get; set; }
    public string ISBN { get; set; }
    public string SomethingElse { get; set; }
    public DateTime? Date { get; set; }
  }

এটি এমনকি একাধিক পরামিতি সমর্থন করে, যতক্ষণ সম্পত্তিগুলির মধ্যে বিরোধ না হয়।

// GET /api/books?author=tolk&title=lord&isbn=91&somethingelse=ABC&date=1970-01-01
public string GetFindBooks([FromUri]BookQuery query, [FromUri]Paging paging)
{
  // ...
}

public class Paging
{
  public string Sort { get; set; }
  public int Skip { get; set; }
  public int Take { get; set; }
}

আপডেট :
মানগুলি alচ্ছিক তা নিশ্চিত করার জন্য মডেলগুলির বৈশিষ্ট্যের জন্য রেফারেন্স প্রকার বা নুলাবল (প্রাক্তন:?) ব্যবহার নিশ্চিত করুন।


4
হ্যাঁ, তবে একা [ফ্রিউরি] ডেকরেটর optionচ্ছিক পরামিতিগুলিকে সমর্থন করে না।
জন মেয়ার 21

6
@ জনমায়ার আপনি [ফেমুআরি] ব্যবহার করে সঠিক বলেছেন সরাসরি আসল প্রশ্নের উত্তর দেয় না। এটি মূলত বলেছে যে উড়ি থেকে প্রাপ্ত মানগুলি এই মডেলগুলিকে জনিত করুন। মডেলগুলির বৈশিষ্ট্যগুলি ulচ্ছিকভাবে সমর্থন করার জন্য তাদের মেনে চলার বা রেফারেন্সের ধরণের প্রয়োজন। অতিরিক্ত তথ্য যুক্ত করা হয়েছে।
অ্যান্ড্রু সি

@ অ্যান্ড্রুসি - আপনি কীভাবে / কেন মানগুলি alচ্ছিক তা নিশ্চিত করার জন্য নলগুলি ব্যবহার করতে হবে তা বিশদ দিয়ে বলতে পারেন? যদি আপনি মানগুলি (যেমন প্রাক্তন, সম্পত্তি int Skip) অযোগ্য করতে না পারেন এবং নির্দিষ্ট করা সম্পত্তিটির জন্য কোনও কোয়েরি পরম না থাকে, তবে এপিআই কন্ট্রোলার পদ্ধতিটি সফলভাবে অনুরোধটির সাথে মিলবে এবং এর মানটি Skipকেবলমাত্র সেই ধরণের ডিফল্ট মান হবে, বা এই ক্ষেত্রে 0
ক্লার্ক

2
@ ক্লার্ক - কোন প্রকারভেদযুক্ত প্রকার ব্যবহার না করে আপনি জানতে পারবেন না যে ব্যবহারকারী কোনও মান প্রদান করে নি এবং অবিচ্ছিন্ন প্রকারের মান (ইনট জন্য 0) পেয়েছে বা ব্যবহারকারী নির্দিষ্ট করেছে কিনা 0 টি ব্যবহার করে আপনি নিশ্চিত হন যে ব্যবহারকারী এটি পূর্বনির্ধারিত রেখে গেছে তাই আপনি নিয়ন্ত্রক ক্রিয়ায় নিরাপদে আপনার ডিফল্ট প্রয়োগ করতে পারেন। আপনি যদি উপরের উদাহরণ থেকে নেওয়া দেখুন, তাহলে এটি গ্রহণের জন্য একটি 0 পেলে পদক্ষেপটি কী করবে? ব্যবহারকারীর অর্থ 0 টি রেকর্ডের অনুরোধ করা বা তারা এটি নির্দিষ্ট করে না এবং তাই আপনার সমস্ত রেকর্ড নেওয়া উচিত। সাধারণত আপনি যদি কোনও মান ধরণের (ইন্ট, বুল ইত্যাদি) alচ্ছিক হতে চান তবে এটি অবশ্যই naclaable হবে।
অ্যান্ড্রু সি

70

নীচের মতো সমস্ত পরামিতিগুলির জন্য প্রাথমিক ডিফল্ট মান ব্যবহার করুন

public string GetFindBooks(string author="", string title="", string isbn="", string  somethingelse="", DateTime? date= null) 
{
    // ...
}

1
এটি সঠিক প্রক্রিয়া তবে একটি জিনিসের জন্য: DateTimeআটকানো যায় না। আমি এর DateTime?পরিবর্তে ইতিমধ্যে ব্যবহার করার চেষ্টা করেছি , তবে আমি যদি আমার এইচটিটিপি অনুরোধে কেবলমাত্র কিছু পরামিতি সেট করি তবে এমভিসি প্রদত্ত পদ্ধতিতে অনুরোধটি মানচিত্র করে না।
ফ্রেপন্টিলো

আপনি তারিখটি স্ট্রিং হিসাবে পাস করতে পারেন এবং ডেটটাইম.পার্স () ফাংশনটি ব্যবহার করে আপনার নিয়ামক ফাংশনের অভ্যন্তরে পার্স করতে পারেন।
মুহাম্মদ আমিন

1
@MuhammadAmin, DateTimeএকটি নয় nullable ডাটা টাইপ। আপনার কোডটি সংকলন করা উচিত নয়, কারণ আপনি nullটাইপের একটি প্যারামিটারে কোনও মান নির্ধারণ করতে সক্ষম হবেন না DateTime। সম্ভবত, আপনি এটি পরিবর্তন করতে হবে DateTime?, বা একটি ডিফল্ট মত বিভিন্ন মান ব্যবহার করা উচিত DateTime.Now
Ivaylo স্লাভভ

1
@ আইভায়ালোস্লাভভ ডেটটাইম.এখন একটি সংকলন সময় ধ্রুবক নয় তাই এটি ডিফল্ট প্যারামিটার হিসাবে নির্ধারিত করা যায় না।
গিরিবি

@ গিরিবি, আপনি সত্যই বলেছেন। Datetime.Nowডিফল্ট প্যারামিটার সূচনাতে ব্যবহার করা যাবে না, আমি সংশোধন করে দাঁড়িয়ে আছি।
Ivaylo স্লাভভ

1

আপনি যদি একাধিক পরামিতি পাস করতে চান তবে আপনি একাধিক পরামিতিগুলি পাস করার পরিবর্তে মডেল তৈরি করতে পারেন।

আপনি যদি কোনও প্যারামিটার পাস করতে চান না তবে আপনি এটিতেও এড়িয়ে যেতে পারেন এবং আপনার কোডটি পরিষ্কার এবং পরিষ্কার দেখাবে।


1
এটি কেবল অনুরোধের শৃঙ্খলে পোস্টের পরামিতিগুলির ক্ষেত্রেই সত্য - ইউআরএল মধ্যে প্যারামগুলি এখনও আর্গুমেন্ট হিসাবে স্বতন্ত্রভাবে রেফারেন্স হতে পারে।
নাথান

1

' optional' ঘোষিত নয় এমন পরামিতিগুলির জন্য ডিফল্ট মান সরবরাহ করা যায় না

 Function GetFindBooks(id As Integer, ByVal pid As Integer, Optional sort As String = "DESC", Optional limit As Integer = 99)

আপনার WebApiConfig

 config.Routes.MapHttpRoute( _
          name:="books", _
          routeTemplate:="api/{controller}/{action}/{id}/{pid}/{sort}/{limit}", _
          defaults:=New With {.id = RouteParameter.Optional, .pid = RouteParameter.Optional, .sort = UrlParameter.Optional, .limit = UrlParameter.Optional} _
      )

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