ওয়েব এপিআই নিয়ন্ত্রণকারী একাধিক এইচটিপিপিস্ট পদ্ধতি ost


126

আমি এমভিসি 4 ওয়েব এপিআই প্রকল্পটি ব্যবহার করা শুরু করছি, আমার একাধিক HttpPostপদ্ধতিতে নিয়ামক রয়েছে । কন্ট্রোলার নীচের মত দেখতে:

নিয়ামক

public class VTRoutingController : ApiController
{
    [HttpPost]
    public MyResult Route(MyRequestTemplate routingRequestTemplate)
    {
        return null;
    }

    [HttpPost]
    public MyResult TSPRoute(MyRequestTemplate routingRequestTemplate)
    {
        return null;
    }
}

এখানে MyRequestTemplateঅনুরোধের মাধ্যমে আসা জসন পরিচালনার জন্য দায়ী টেম্পলেট শ্রেণীর প্রতিনিধিত্ব করে।

ত্রুটি:

আমি যখন ফিডলারটি ব্যবহার করার জন্য একটি অনুরোধ করি http://localhost:52370/api/VTRouting/TSPRouteবা http://localhost:52370/api/VTRouting/Routeআমি একটি ত্রুটি পাই:

একাধিক ক্রিয়া পাওয়া গেছে যা অনুরোধটির সাথে মেলে

আমি যদি উপরের একটি পদ্ধতি মুছে ফেলি তবে এটি সূক্ষ্মভাবে কাজ করে।

Global.asax

আমি এতে ডিফল্ট রাউটিং টেবিলটি সংশোধন করার চেষ্টা করেছি global.asax, তবে আমি এখনও ত্রুটিটি পাচ্ছি, আমি মনে করি গ্লোবাল.এক্সেক্সের রুটগুলি নির্ধারণ করতে আমার সমস্যা আছে। আমি Global.asax এ যা করছি তা এখানে what

public static void RegisterRoutes(RouteCollection routes)
{
    routes.MapHttpRoute(
        name: "MyTSPRoute",
        routeTemplate: "api/VTRouting/TSPRoute",
        defaults: new { }
    );

    routes.MapHttpRoute(
        name: "MyRoute",
        routeTemplate: "api/VTRouting/Route",
        defaults: new { action="Route" }
    );
}

আমি পোস্টার ব্যবহার করে ফিডলারে অনুরোধ করছি, মাইআরকোয়েস্টটেম্প্লেটের জন্য অনুরোধবডিতে জসন পাস করছি।

উত্তর:


143

আপনি একটি একক নিয়ামক একাধিক কর্ম থাকতে পারে।

তার জন্য আপনাকে নিম্নলিখিত দুটি জিনিস করতে হবে।

  • প্রথমে ActionNameঅ্যাট্রিবিউটের মতো ক্রিয়াগুলি সাজান

     [ActionName("route")]
     public class VTRoutingController : ApiController
     {
       [ActionName("route")]
       public MyResult PostRoute(MyRequestTemplate routingRequestTemplate)
       {
         return null;
       }
    
      [ActionName("tspRoute")]
      public MyResult PostTSPRoute(MyRequestTemplate routingRequestTemplate)
      {
         return null;
      }
    }
  • দ্বিতীয়টি WebApiConfigফাইলের মধ্যে নিম্নলিখিত রুটগুলি সংজ্ঞায়িত করুন।

    // Controller Only
    // To handle routes like `/api/VTRouting`
    config.Routes.MapHttpRoute(
        name: "ControllerOnly",
        routeTemplate: "api/{controller}"               
    );
    
    
    // Controller with ID
    // To handle routes like `/api/VTRouting/1`
    config.Routes.MapHttpRoute(
        name: "ControllerAndId",
        routeTemplate: "api/{controller}/{id}",
        defaults: null,
        constraints: new { id = @"^\d+$" } // Only integers 
    );
    
    // Controllers with Actions
    // To handle routes like `/api/VTRouting/route`
    config.Routes.MapHttpRoute(
        name: "ControllerAndAction",
        routeTemplate: "api/{controller}/{action}"
    );

আমি যদি আইডির ধরণের কোনও বিধিনিষেধ সেট করতে না চাই তবে কী হবে? অর্থ: আমি স্ট্রিং আইডিও কীভাবে গ্রহণ করব?
ফ্রেপন্টিলো

5
@ ফ্রেপন্টিলো: আইডিটি একটি পূর্ণসংখ্যা হওয়া উচিত, যাতে এটি রুটের নাম থেকে ছদ্মবেশ ধারণ করা হয় অন্যথায় রাউটিং ইঞ্জিন এটিকে একটি আইডির পরিবর্তে আইডি হিসাবে বিবেচনা করবে। আপনার যদি স্ট্রিং হিসাবে আইডি থাকা দরকার তবে আপনি একটি ক্রিয়া তৈরি করতে পারেন।
আসিফ মোশতাক

আমি এর পরিবর্তে অ্যাট্রিবিউট রাউটিং ব্যবহার করব। আপনাকে ওয়েবএপিপিফাইফিতে একাধিক রুট ব্যবহার করতে হবে না। এই লিঙ্কটি দেখুন: ডকস.মাইক্রোসফট.ইন- ইউএস
ধনী

যদি আমি এটি যুক্ত করি তবে এটি আমাকে একটি ত্রুটি দেয় ------------ নেমস্পেস ইমেজডাউনলোড অ্যাপ্লিকেশন C নিয়ন্ত্রণকারীরা {পাবলিক ক্লাস ফ্রন্টমোডেল {পাবলিক স্ট্রিং স্কাস {পেতে; সেট; }} [অ্যাকশননেম ("প্রোডাক্ট কন্ট্রোলার")] পাবলিক ক্লাস প্রোডাক্ট কন্ট্রোলার: এপিসিআর্ট্রোলার G // জিইটি: এপি / নিউকোট্রোলার পাবলিক আইনিংরেবল <স্ট্রিং> পান () {নতুন স্ট্রিং ফিরে আসুন [] value "মান 1", "মান 2"}; }
উমাশঙ্কর

41

আপনার সমস্যার আরও ভাল সমাধানটি Routeহ'ল ব্যবহার করা হবে যা আপনাকে টীকা দ্বারা পদ্ধতিটিতে রুটটি নির্দিষ্ট করতে দেয়:

[RoutePrefix("api/VTRouting")]
public class VTRoutingController : ApiController
{
    [HttpPost]
    [Route("Route")]
    public MyResult Route(MyRequestTemplate routingRequestTemplate)
    {
        return null;
    }

    [HttpPost]
    [Route("TSPRoute")]
    public MyResult TSPRoute(MyRequestTemplate routingRequestTemplate)
    {
        return null;
    }
}

নেমস্পেস রুটটি কী? আমি এমভিসি 4 ব্যবহার করছি এবং রুটটি স্বীকৃত নয়।
agগলই 22


হ্যাঁ, এই পথে চলতে হবে। ধন্যবাদ।
নিউম্যান

1
কিছু কারণে আমি এই কাজ করতে পারি না। আমি ঠিক ইতিমধ্যে এটি করছিলাম।
অলিগোফ্রেন

2
ইউআরএলটি কল করার চেয়ে কেমন হবে Routeএবং TSPRoute?
Si8

27

ব্যবহার করুন:

routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

এটি আর বিশ্রামের উপায় নয়, তবে এখন আপনি নাম অনুসারে আপনার ক্রিয়াকলাপগুলিতে কল করতে পারেন (ক্রিয়াপদের উপর ভিত্তি করে ওয়েব এপিআই স্বয়ংক্রিয়ভাবে আপনার জন্য একটি নির্ধারণ করতে দেয়) এর পরিবর্তে:

[POST] /api/VTRouting/TSPRoute

[POST] /api/VTRouting/Route

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


1
উত্তরের জন্য ধন্যবাদ, তবে এটি এখনও আমাকে একই ত্রুটি দিচ্ছে।
হাবিব

এটি সম্ভব নয়, তারপরে অবশ্যই আপনার অ্যাপ্লিকেশনে অন্য কোনও কিছুকে ভুল কনফিগার করতে হবে। আপনি কি পুরো রুট সেটআপটি দেখাতে পারবেন? এছাড়াও আপনি নিয়ন্ত্রণকারীদের ক্রিয়াটি ঠিক কীভাবে বলছেন?
ফিলিপ ডাব্লু

সমগ্র রুট সেটআপ global.asax হয়, আমি আমার প্রশ্নে যে অংশ পোষ্ট আছে, অনুরোধ করছে আমি ব্যবহার করছি Fiddler-> Compose-> এবং অপারেশন হিসাবে পোস্ট নির্বাচন
হাবিব

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

1
ফিলিপ, আমি .mvc4 বা ভিজ্যুয়াল স্টুডিও 2012 আরসি সহ নেট ফ্রেমওয়ার্ক 4.5 ব্যবহার করছি, আপনি কোন প্রকল্প তৈরি করতে কোন টেম্পলেট ব্যবহার করছেন, আপনার 'পুরোপুরি কাজ করছে
হাবিব

13

ওয়েব এপিআই এন্ডপয়েন্ট (কন্ট্রোলার) হ'ল একক সংস্থান যা গেইট / পোস্ট / পুট / ডিলিট ক্রিয়াগুলি গ্রহণ করে। এটা না একটি স্বাভাবিক MVC নিয়ামক।

অগত্যা, /api/VTRoutingকেবলমাত্র একটি এইচটিপিপস্ট পদ্ধতি থাকতে পারে যা আপনি যে পরামিতিগুলি প্রেরণ করছেন তা গ্রহণ করে। যতক্ষণ আপনি [এইচটিপি] স্টাফ দিয়ে সজ্জিত করছেন ততক্ষণ ফাংশনটির নামটি কোনও বিষয় নয় । যদিও আমি কখনও চেষ্টা করিনি।

সম্পাদনা: এটি কাজ করে না। সমাধানের ক্ষেত্রে, এটি পরামিতিগুলির সংখ্যা অনুসারে চলেছে বলে মনে হচ্ছে, প্রকারের সাথে মডেল-বাঁধার চেষ্টা করে না।

আপনি বিভিন্ন পরামিতি গ্রহণ করতে ফাংশনগুলি ওভারলোড করতে পারেন। আমি নিশ্চিত যে আপনি ঠিকঠাকভাবে ঘোষণা করলে আপনি ঠিক থাকবেন, তবে পদ্ধতিগুলিতে পৃথক (বেমানান) পরামিতি ব্যবহার করেছেন। যদি প্যারামগুলি একই হয়, তবে আপনি ভাগ্য থেকে দূরে রয়েছেন কারণ মডেল বাঁধাই আপনি কোনটি বোঝাতে চেয়েছেন তা বুঝতে পারবেন না।

[HttpPost]
public MyResult Route(MyRequestTemplate routingRequestTemplate) {...}

[HttpPost]
public MyResult TSPRoute(MyOtherTemplate routingRequestTemplate) {...}

এই অংশ কাজ করে

আপনি একটি নতুন তৈরি করার সময় তারা যে ডিফল্ট টেম্পলেটটি দেয় তা এটিকে অত্যন্ত সুস্পষ্ট করে তোলে এবং আমি বলব আপনার এই সম্মেলনের সাথে থাকা উচিত:

public class ValuesController : ApiController
{
    // GET is overloaded here.  one method takes a param, the other not.
    // GET api/values  
    public IEnumerable<string> Get() { .. return new string[] ... }
    // GET api/values/5
    public string Get(int id) { return "hi there"; }

    // POST api/values (OVERLOADED)
    public void Post(string value) { ... }
    public void Post(string value, string anotherValue) { ... }
    // PUT api/values/5
    public void Put(int id, string value) {}
    // DELETE api/values/5
    public void Delete(int id) {}
}

আপনি যদি এমন একটি শ্রেণি তৈরি করতে চান যা অজ্যাক্স ব্যবহারের জন্য অনেক কিছু করে, কোনও মানক নিয়ামক / অ্যাকশন প্যাটার্ন ব্যবহার না করার কোনও বড় কারণ নেই। আসল পার্থক্য হ'ল আপনার পদ্ধতির স্বাক্ষরগুলি তেমন সুন্দর নয় এবং জিনিসগুলি Json( returnValue)ফেরত দেওয়ার আগে আপনাকে জিনিসগুলি মুড়ে রাখতে হবে।

সম্পাদনা:

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

  • জটিল অবজেক্টের সাথে বাঁধাই "গভীর" দেখায় না, তাই চলে
  • আপনি ক্যোয়ারী স্ট্রিংয়ের অতিরিক্ত প্যারামটি পেরিয়ে এটি পেতে পারেন
  • আমি উপলব্ধ বিকল্পগুলি দিতে পারার চেয়ে আরও ভাল লিখনআপ

এটি এই ক্ষেত্রে আমার পক্ষে কাজ করেছিল, দেখুন এটি আপনাকে কোথায় পেয়েছে। কেবল পরীক্ষার জন্য ব্যতিক্রম।

public class NerdyController : ApiController
{
    public void Post(string type, Obj o) { 
        throw new Exception("Type=" + type + ", o.Name=" + o.Name ); 
    }
}

public class Obj {
    public string Name { get; set; }
    public string Age { get; set; }
}

এবং এই ফর্মটিকে কনসোলের মতো বলা হয়:

$.post("/api/Nerdy?type=white", { 'Name':'Slim', 'Age':'21' } )

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

আমি ধরে নিয়েছি যে এটির জন্য এটি মডেল বাঁধার চেষ্টা করবে, যেহেতু আপনি ওভারলোড করতে পারেন can যদিও এটি বিভিন্ন # টি প্যারামের সাথে কাজ করে। এটি করার জন্য এটি পুনরায় লিখতে খুব কঠিন হতে পারে না তবে তারা উত্স কোডটি এখনও প্রকাশ করেনি, তাই আমি কেবল কুৎসিত অপ্রয়োজনীয় দিকে তাকিয়ে আছি
অ্যান্ড্রু ব্যাকর

2
এটি কাজ করছে না তার কারণ এবং ওয়েব এপিআইয়ের পিছনে দর্শনের প্রকৃতপক্ষে ব্যাখ্যা করার জন্য +1।
মেমার্ক

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

6

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

    config.Routes.MapHttpRoute("API Default", 
                               "api/{controller}/{action}/{id}",
                               new { id = RouteParameter.Optional });

1

কন্ট্রোলার স্তরে রুট প্রিফিক্স [রুটপ্রিফিক্স ("এপিআই / প্রোফাইলস")] রাখুন এবং ক্রিয়া পদ্ধতিতে একটি রুট রাখুন [রুট ("লাইকপ্রোফাইল")]]। গ্লোবাল.এক্স্যাক্স ফাইলটিতে কোনও পরিবর্তন করার দরকার নেই

namespace KhandalVipra.Controllers
{
    [RoutePrefix("api/Profiles")]
    public class ProfilesController : ApiController
    {
        // POST: api/Profiles/LikeProfile
        [Authorize]
        [HttpPost]
        [Route("LikeProfile")]
        [ResponseType(typeof(List<Like>))]
        public async Task<IHttpActionResult> LikeProfile()
        {
        }
    }
}

0

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

public class CalculatorController : ApiController
{
    [HttpGet]
    [ActionName("Add")]
    public string Add(int num1 = 1, int num2 = 1, int timeDelay = 1)
    {
        Thread.Sleep(1000 * timeDelay);
        return string.Format("Add = {0}", num1 + num2);
    }

    [HttpGet]
    [ActionName("Sub")]
    public string Sub(int num1 = 1, int num2 = 1, int timeDelay = 1)
    {
        Thread.Sleep(1000 * timeDelay);
        return string.Format("Subtract result = {0}", num1 - num2);
    }

    [HttpGet]
    [ActionName("Mul")]
    public string Mul(int num1 = 1, int num2 = 1, int timeDelay = 1)
    {
        Thread.Sleep(1000 * timeDelay);
        return string.Format("Multiplication result = {0}", num1 * num2);
    }

    [HttpGet]
    [ActionName("Div")]
    public string Div(int num1 = 1, int num2 = 1, int timeDelay = 1)
    {
        Thread.Sleep(1000 * timeDelay);
        return string.Format("Division result = {0}", num1 / num2);
    }
}

এবং WebApiConfig ফাইলটিতে আপনার ইতিমধ্যে রয়েছে

 config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional });

আইআইএস-এ কেবলমাত্র প্রমাণীকরণ / অনুমোদন সেট করুন এবং আপনি সম্পন্ন করেছেন!

আশাকরি এটা সাহায্য করবে!


0

আপনি এই পদ্ধতির ব্যবহার করতে পারেন:

public class VTRoutingController : ApiController
{
    [HttpPost("Route")]
    public MyResult Route(MyRequestTemplate routingRequestTemplate)
    {
        return null;
    }

    [HttpPost("TSPRoute")]
    public MyResult TSPRoute(MyRequestTemplate routingRequestTemplate)
    {
        return null;
    }
}

-1
public class Journal : ApiController
{
    public MyResult Get(journal id)
    {
        return null;
    }
}

public class Journal : ApiController
{

    public MyResult Get(journal id, publication id)
    {
        return null;
    }
}

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

uri:/api/journal/journalid
uri:/api/journal/journalid/publicationid

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


-1

আমি ইউআরএলটিতে কেবল "ক্রিয়া = ক্রিয়া_নাম" যুক্ত করেছি এবং এইভাবে রাউটিং ইঞ্জিনটি জানে যে আমি কী পদক্ষেপ নিতে চাই। আমি ক্রিয়াগুলিতে অ্যাকশননাম অ্যাট্রিবিউটও যুক্ত করেছি তবে আমি নিশ্চিত নই যে এটির প্রয়োজন।


-1

আমি এই বিষয়টিতে সেরা এবং সহজ ব্যাখ্যাটি দেখেছি - http://www.binaryintellect.net/articles/9db02aa1-c193-421e-94d0-926e440ed297.aspx

  • সম্পাদিত -

আমি এটি কেবল রুট দিয়ে কাজ করেছি, এবং রুটপ্রিফিক্সের দরকার নেই।

উদাহরণস্বরূপ, নিয়ামক মধ্যে

[HttpPost]
[Route("[action]")]
public IActionResult PostCustomer
([FromBody]CustomerOrder obj)
{
}

এবং

[HttpPost]
[Route("[action]")]
public IActionResult PostCustomerAndOrder
([FromBody]CustomerOrder obj)
{
}

তারপরে, ফাংশনটির নামটি jquery তে যায় -

options.url = "/api/customer/PostCustomer";

অথবা

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