এএসপি.নেট ওয়েব এপিআই জিইটি-তে আমি কীভাবে একাধিক পরামিতিগুলি পাস করব?


136

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

আমি কয়েকটি পদ্ধতি বিবেচনা করেছি:

  1. প্যারামগুলিকে একক জেএসওএন স্ট্রিংয়ে ক্রমিক করা এবং এপিআইতে এটি পৃথক করে নেওয়া। http://forums.asp.net/t/1807316.aspx/1

  2. ক্যোরি স্ট্রিংয়ে প্যারামগুলি পাস করুন।
    বিশ্রামের এপিআইতে একাধিক ক্যোয়ারী প্যারামিটারগুলি পাস করার সর্বোত্তম উপায় কী?

  3. রুটে প্যারামগুলি সংজ্ঞায়িত করা হচ্ছে: এপিআই / কন্ট্রোলার / তারিখ 1 / তারিখ 2

  4. একটি পোষ্ট ব্যবহার করে যা অন্তর্নিহিতভাবে আমাকে কোনও বস্তুকে প্যারাম দিয়ে যেতে দেয়।

  5. ওয়েব এপিআই (বর্তমানে) এটি সমর্থন করার পরে থেকে ওডাটা গবেষণা করছে। আমি এটির সাথে এখনও খুব বেশি কিছু করতে পারি নি তাই এর সাথে আমি খুব বেশি পরিচিত নই।

দেখে মনে হয় যে যথাযথ আরআরইএসটি অনুশীলনগুলি নির্দেশ করে যখন ডেটা টানা হয়, আপনার একটি জিইটি ব্যবহার করা উচিত। তবে, জিইটিও নালিপোটেন্ট হওয়া উচিত (কোনও পার্শ্ব-প্রতিক্রিয়া তৈরি করে না), এবং আমি ভাবছি যে আমার নির্দিষ্ট প্রয়োগটি লঙ্ঘন করে যেহেতু আমি এপিআই সিস্টেমে রেকর্ড চিহ্নিত করি তাই আমি পার্শ্ব-প্রতিক্রিয়া তৈরি করছি।

এটি আমাকে ভেরিয়েবল পরামিতিগুলির সমর্থনের প্রশ্নেও পরিচালিত করেছিল। যদি ইনপুট প্যারামিটারের তালিকাটি পরিবর্তন হয় তবে চয়েস 3 এর জন্য আপনার রুটটিকে নতুন করে সংজ্ঞায়িত করা ক্লান্তিকর হবে যদি তা ঘটে যায় তবে। পরামিতিগুলি রান-টাইমে সংজ্ঞায়িত করা হলে কী ঘটতে পারে ...

যাই হোক না কেন, আমার নির্দিষ্ট প্রয়োগের জন্য, কোন পছন্দটি (যদি থাকে) সেরা বলে মনে হয়?

উত্তর:


10

এই রেকর্ড চিহ্নিতকরণ মানে কি? যদি এটি শুধুমাত্র লগিংয়ের উদ্দেশ্যে ব্যবহার করা হয় তবে আমি জিইটি ব্যবহার করব এবং সমস্ত ক্যাচিং অক্ষম করব, যেহেতু আপনি এই সংস্থানগুলির জন্য প্রতিটি ক্যোয়ারী লগ করতে চান want রেকর্ড চিহ্নিতকরণের যদি অন্য উদ্দেশ্য থাকে তবে POST যাওয়ার উপায়। ব্যবহারকারীর জানা উচিত, তার ক্রিয়াকলাপগুলি সিস্টেমকে প্রভাবিত করে এবং POST পদ্ধতিটি একটি সতর্কতা।


চিহ্নিত করে আমি বোঝাতে চাইছি কোন রেকর্ডগুলি প্রক্রিয়া করা হয় এবং ফিরে আসে যাতে পরবর্তী কলগুলি তাদের পুনরাবৃত্তি না করে। আমার ক্ষেত্রে আমি প্রক্রিয়াজাত হয় যা ট্র্যাক করতে অন্য সারণীতে সন্নিবেশ তৈরি করছি making
sig606

এই মুহূর্তে আমি এটি পোস্ট হিসাবে বাস্তবায়িত করেছি মূলত আপনি যে কারণে বলেছেন - ক্রিয়া ঘটে এবং গ্রাহক তাদের সম্পর্কে সচেতন হন। এছাড়াও এটি বিভিন্ন তথ্য পাস করার ক্ষেত্রে
শ্রদ্ধার

@ সিগ 606: পোষ্ট হ'ল আমার পক্ষে যাওয়ার উপায়, তবে আপনার প্রোটোকলটি নিরাপদ বলে মনে হচ্ছে না। যদি কিছু ঘটে থাকে এবং ক্লায়েন্টের পক্ষ থেকে রেকর্ডগুলি পুনরুদ্ধার করা হয় তবে বাগের কারণে প্রক্রিয়াজাত হয় না? আপনি তাদের আর ফিরিয়ে দেবেন না এবং ক্লায়েন্টটি হারিয়ে যাওয়া ডেটা সহ ছেড়ে যায়।
লকলেড

এখনই আমার এপিআই কেবল প্রক্রিয়া করার পরে রেকর্ডগুলি দেয়। সুতরাং গ্রাহক এপিআই দুটি তারিখ পাস করে। এই দুটি তারিখের মধ্যে রেকর্ডগুলি প্রক্রিয়া করে চিহ্নিত করা হয়। তারপরে ডেটা কলারে ফিরিয়ে দেওয়া হয়। আমি মনে করি প্রসেসিংয়ের সময় বা ক্লায়েন্টে পৌঁছানোর আগে প্রক্রিয়াজাতকরণের পরে যদি কিছু ঘটে থাকে তবে আমার সমস্যা আছে।
sig606

141

আমি মনে করি সহজ উপায়টি সহজভাবে ব্যবহার করা AttributeRouting

এটি আপনার নিয়ামকের মধ্যে স্পষ্ট, আপনি কেন আপনার গ্লোবাল WebApiConfigফাইলে এটি চান?

উদাহরণ:

    [Route("api/YOURCONTROLLER/{paramOne}/{paramTwo}")]
    public string Get(int paramOne, int paramTwo)
    {
        return "The [Route] with multiple params worked";
    }

{}নাম আপনার পরামিতি মেলে প্রয়োজন।

সেই হিসাবে সহজ, এখন আপনার কাছে আলাদা আছে GETযা এই দৃষ্টিতে একাধিক প্যারাম পরিচালনা করে।


12
এটা অসাধারণ. বেশিরভাগ লোকেরা WebApiConfigফাইলটিতে রুট সেট আপ করার পরামর্শ দেয় তবে এটি সত্যই সুন্দর।
rhyek

4
প্রকৃতপক্ষে, আমরা (বেশিরভাগ লোকেরা) আপনার কনফিগারেশনের জন্য কেন্দ্রীয়ভাবে পরিচালিত অঞ্চল থাকার পরামর্শ দিই। ওয়েব এপিআই (মাইক্রোসফ্ট বা অন্যথায়) এর ক্ষেত্রে, আরইএসটি-র জন্য কেন্দ্রীয়করণের নিদর্শনগুলি মূল। অ্যাট্রিবিউট রাউটিংটি দুর্দান্ত, তবে এটি এক-অফ ব্যতিক্রমকে খুব লোভনীয় করে তোলে।
ডেভিড বেটজ

3
সম্মত, আমার উত্তরটি আমার আপডেট করতে হবে। জিইটিএস সহ একাধিক পরামিতি করার আরও অনেক ভাল উপায় রয়েছে। আমি যখন ওয়েবএপিআই-তে নতুন ছিলাম তখন এটি পোস্ট করেছিলাম, এখন আমি অ্যাট্রিবিউটরাউটিং ব্যবহার করি না (যদি না আমি কেবল নতুন কন্ট্রোলার তৈরি করতে না চাই), এবং কোয়েরিস্ট্রিংয়ের সমস্ত পরামিতিগুলি পাস না করে তারা স্বয়ংক্রিয়ভাবে ম্যাপ করে। আমি যখন সুযোগ পাই তখন আপডেট করা হয় যাতে লোকেরা এই পুরানো পদ্ধতিটি ব্যবহার না করে
মার্ক পাইসাক - ট্রিলন.ও

Routeনামযুক্ত প্যারামিটারগুলির জন্য (যেমন ক্যোয়ারী প্যারামিটার) সেট করার কোনও উপায় আছে কি ?
শিমি ওয়েটজ্যান্ডলার

1
যদি ক্রিয়া পদ্ধতির নাম প্রয়োজন হয় তবে এটি সামঞ্জস্য করার জন্য এটি পরিবর্তন করা যেতে পারে। [রুট ("এপিআই / আপনার কন্ট্রোলার / গেট / {প্যারামওন} / {প্যারামটুই}")] পাবলিক স্ট্রিং পান (ইন প্যারামওন, ইন প্যারামটুই) {ফিরে "কিছু"; }
ড্যাশ

49

WebApiConfigএন্ট্রিগুলিতে কেবল একটি নতুন রুট যুক্ত করুন ।

উদাহরণস্বরূপ, কল করতে:

public IEnumerable<SampleObject> Get(int pageNumber, int pageSize) { ..

যোগ করুন:

config.Routes.MapHttpRoute(
    name: "GetPagedData",
    routeTemplate: "api/{controller}/{pageNumber}/{pageSize}"
);

তারপরে HTTP কলটিতে প্যারামিটারগুলি যুক্ত করুন:

GET //<service address>/Api/Data/2/10 

10
এটি একমাত্র উত্তর বলে মনে হচ্ছে যা সমস্ত অংশকে তালিকাবদ্ধ করে। আমি চাই যে কেউ api/controller?start=date1&end=date2ইউআরআই স্টাইলটি কীভাবে ব্যবহার করবেন সে সম্পর্কে আরও ভালভাবে বর্ণনা করা হয়েছে ।
হট লিক্স

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

দুর্দান্ত জিনিস। ধন্যবাদ!
হুগো নাভা কোপ্প

হাই @ হটলিক্স এবং গ্রাহাম রাইট আপনার কি মনে হয় আপনি এই প্রশ্নের উত্তর দিতে পারবেন? ধন্যবাদ, stackoverflow.com/questions/57565318/...

45

আমাকে কেবল একটি RESTfull এপিআই বাস্তবায়ন করতে হয়েছিল যেখানে আমার পরামিতিগুলি পাস করতে হবে। আমি মার্কের প্রথম উদাহরণ "এপিআই / কন্ট্রোলার? শুরু = তারিখ 1 এবং শেষ = তারিখ 2" দ্বারা বর্ণিত হিসাবে একই স্টাইলে ক্যোয়ারী স্ট্রিংয়ের পরামিতিগুলি পেরিয়ে এটি করেছি?

কন্ট্রোলারে আমি সি # তে ইউআরএল বিভক্ত হতে একটি টিপ ব্যবহার করেছি ?

// uri: /api/courses
public IEnumerable<Course> Get()
{
    NameValueCollection nvc = HttpUtility.ParseQueryString(Request.RequestUri.Query);
    var system = nvc["System"];
    // BL comes here
    return _courses;
}

আমার ক্ষেত্রে আমি অ্যাজাক্সের মাধ্যমে ওয়েবএপিকে ফোন দিচ্ছিলাম যেন:

$.ajax({
        url: '/api/DbMetaData',
        type: 'GET',
        data: { system : 'My System',
                searchString: '123' },
        dataType: 'json',
        success: function (data) {
                  $.each(data, function (index, v) {
                  alert(index + ': ' + v.name);
                  });
         },
         statusCode: {
                  404: function () {
                       alert('Failed');
                       }
        }
   });

আশা করি এটা কাজে লাগবে...


2
আমি তোমাদের WebApi ব্যবহার করছেন না কারণ ParameterBinding স্বয়ংক্রিয়ভাবেই আপনার আপনার api পদ্ধতিটি পরামিতি আপনার querystring ম্যাপ করবে ... অনুমান
EMP

1
হ্যাঁ, এর চেয়ে আরও ভাল উপায় হ'ল [রুট ("এপিআই / ডিবিমেটাডেটা / {সিস্টেম} / {সার্চস্ট্রিং}")) এর মতো বৈশিষ্ট্য ব্যবহার করা এবং তারপরে গেটে (পংক্তির সিস্টেম, স্ট্রিং অনুসন্ধানের স্ট্রিং) প্যারামিটার যুক্ত করা এবং তারপরে " ... এপিআই / ডিবিমেটাডেটা / মাইসিস্টেম / মাইসার্কস্ট্রিং "
নাইজেল ফাইন্ড্লেটার

আমি আমার সি # এমভিসি ওয়েবএপিতে তার উদাহরণটি ব্যবহার করেছি এবং এটি দুর্দান্ত কাজ করেছে। উদাহরণস্বরূপ +1
Si8

38

আমি http://habrahabr.ru/post/164945/ এ প্রবাসী সমাধান পেয়েছি

public class ResourceQuery
{
   public string Param1 { get; set; }
   public int OptionalParam2 { get; set; }
}

public class SampleResourceController : ApiController
{
    public SampleResourceModel Get([FromUri] ResourceQuery query)
    {
        // action
    }
}

5
এখানে ক্লুটি হ'ল [FromUri]
ট্রান্সপোর্টার

2
নিবন্ধটি রাশিয়ান ভাষায় থাকলেও, @ ট্রান্সপোর্টারটি সঠিক। ইউআরএল থেকে প্যারামিটারগুলি পাওয়ার জন্য "ফ্রিউড়ি" দেখতে দুর্দান্ত উপায় বলে মনে হচ্ছে। আর একটি নিবন্ধ যা সহায়ক হতে পারে: asp.net/web-api/overview/formats-and-model-b ਬਾਈ্যান্ডিং/…
গ্রেগ

আমি এখন বেশ কিছুদিন ধরে এটি করছি এবং এটি দুর্দান্ত কাজ করেছে! আমি এই সমাধানটিও সুপারিশ করতাম।
ডেভিড পিটারসন

আপনি যদি অন্য কোনও সহায়ক পদ্ধতিতে কল করেন (না Get), আপনি কি এখনও ব্যবহার করতে পারেন [FromUri]? আমি কাজ করতে পারে বলে মনে হচ্ছে না।
জোকুল

8

ব্যবহার তাহলে GET অথবা পোষ্ট পরিষ্কারভাবে দ্বারা ব্যাখ্যা করা হয় @LukLed । আপনি প্যারামিটারগুলি কীভাবে পাস করতে পারবেন সে সম্পর্কে আমি দ্বিতীয় পদ্ধতির সাথে যেতে পরামর্শ দেব (আমি ওডিটা সম্পর্কে খুব বেশি জানি না )।

1. প্যারামগুলিকে একটি একক জেএসওএন স্ট্রিংয়ে রূপান্তরিত করা এবং এপিআইতে এটি আলাদা করে তোলা। http://forums.asp.net/t/1807316.aspx/1

এটি ব্যবহারকারী বান্ধব এবং এসইও বান্ধব নয়

2. ক্যোয়ারী স্ট্রিংয়ে প্যারামগুলি পাস করুন। বিশ্রামের এপিআইতে একাধিক ক্যোয়ারী প্যারামিটারগুলি পাস করার সর্বোত্তম উপায় কী?

এটি স্বাভাবিক পছন্দসই পদ্ধতি।

3. রুটে প্যারামগুলি সংজ্ঞায়িত করা হচ্ছে: এপিআই / কন্ট্রোলার / তারিখ 1 / তারিখ 2

এটি অবশ্যই একটি ভাল পদ্ধতির নয়। এটি অনুভব করে যে কোনও একটির date2উপ-উত্স date1এবং এটি ঘটনাটি নয়। উভয়ই date1এবং date2ক্যোয়ারী প্যারামিটার এবং একই স্তরে আসে।

সাধারণ ক্ষেত্রে আমি এটির মতো একটি ইউআরআই পরামর্শ দেব,

api/controller?start=date1&end=date2

তবে আমি ব্যক্তিগতভাবে নীচের ইউআরআই প্যাটার্নটি পছন্দ করি তবে এই ক্ষেত্রে পরামিতিগুলি মানচিত্রের জন্য আমাদের কিছু কাস্টম কোড লিখতে হবে।

api/controller/date1,date2

আসলে, এগুলি আমার উত্সের ব্যাখ্যা ছিল। আমি মনে করি লুকএলড আমার ট্যাগ এবং ইউআরএল লিঙ্কটি জ্বালিয়ে দিয়েছেন।
sig606

যতক্ষণ না এসইও, এই ক্ষেত্রে এটি প্রযোজ্য হবে না। এই কোডটি "সার্ভার-টু-সার্ভার" হবে, সুতরাং বাইরের পৃথিবীটি এটি কখনও আবিষ্কার করেছিল কিনা সেদিকে আমি পাত্তা দিই না। আসলে, এলোমেলো অ্যাক্সেস এড়ানোর জন্য আমাকে নিশ্চিত করতে হবে যে যথাযথ সুরক্ষা পদক্ষেপ নেওয়া হয়েছে। সিস্টেমের অন্য অংশের জন্য আমাকে জেএসএন সিরিয়ালাইজেশন করতে হয়েছে (মনে হচ্ছে বড় বাগানের পোস্টগুলি পোস্ট করার চেষ্টা করা একটি বাগ মনে হচ্ছে যাতে আমাকে স্ট্রিংয়ে সিরিয়ালাইজ করতে হয়েছিল), তাই এটি এই ক্ষেত্রে খুব বেশি কিছু হবে না would ।
sig606

1
আমি আশা করি আপনার কাছে ইতিমধ্যে উত্তর রয়েছে তবে কেন আপনি প্রশ্ন জিজ্ঞাসা করছেন?
ভিজেআইএআই

2
দেরীতে এই প্রতিক্রিয়ার জন্য দুঃখিত, মার্ক। আমি কয়েকটি সমাধান চেষ্টা করেছিলাম তবে কোনটি সবচেয়ে ভাল তা নিশ্চিত ছিল না এবং শিল্প-মানক পদ্ধতির সাথে লেগে থাকার চেষ্টা করছিলাম, তাই আমি এখানে এসওতে পোস্ট করেছি posted
sig606

1
: পাশে মত @Mark কিছু stackoverflow.com/questions/9681658/... ?
RredCat


3
 [Route("api/controller/{one}/{two}")]
    public string Get(int One, int Two)
    {
        return "both params of the root link({one},{two}) and Get function parameters (one, two)  should be same ";
    }

মূল লিঙ্কের উভয় প্যারাম ({এক}, {দুই}) এবং ফাংশন প্যারামিটারগুলি (এক, দুই) পান


2

আমি জানি এটি সত্যিই পুরানো, তবে আমি সম্প্রতি একই জিনিসটি চেয়েছিলাম এবং আমি যা পেয়েছি তা এখানে ...

    public HttpResponseMessage Get([FromUri] string var, [FromUri] string test) {
        var retStr = new HttpResponseMessage(HttpStatusCode.OK);
        if (var.ToLower() == "getnew" && test.ToLower() == "test") {
            retStr.Content = new StringContent("Found Test", System.Text.Encoding.UTF8, "text/plain");
        } else {
            retStr.Content = new StringContent("Couldn't Find that test", System.Text.Encoding.UTF8, "text/plain");
        }

        return retStr;
    }

সুতরাং এখন আপনার ঠিকানায় / ইউআরআই / ...

HTTP (গুলি): // myURL / API / myController প্রথমেই / var = getnew & পরীক্ষা = পরীক্ষা

ফলাফল: "টেস্ট পাওয়া গেছে"


HTTP (গুলি): // myURL / API / myController প্রথমেই / var = getnew & পরীক্ষা = কিছু

ফলাফল: "সেই পরীক্ষাটি খুঁজে পেল না"


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

1
আমাকে একটি ইভেন্ট এপিআই তৈরি করতে হয়েছিল যা তৃতীয় পক্ষের ক্যালেন্ডার অ্যাপ্লিকেশনটি ব্যবহার করে, যা এই পদ্ধতির ব্যবহার করে। আমি এই উত্তর খুঁজে পেয়ে খুশি!
মাটিরআর


0
    public HttpResponseMessage Get(int id,string numb)
    {
        //this will differ according to your entity name
        using (MarketEntities entities = new MarketEntities())
        {
          var ent=  entities.Api_For_Test.FirstOrDefault(e => e.ID == id && e.IDNO.ToString()== numb);
            if (ent != null)
            {
                return Request.CreateResponse(HttpStatusCode.OK, ent);
            }
            else
            {
                return Request.CreateErrorResponse(HttpStatusCode.NotFound, "Applicant with ID " + id.ToString() + " not found in the system");
            }
        }
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.