ASP.NET वेब एपीआई यूआरएल कैसे बनाएं?


जवाबों:


139

ApiController एक संपत्ति कहा जाता है यूआरएल प्रकार का है जो System.Web.Http.Routing.UrlHelper जो आप api नियंत्रकों के लिए यूआरएल के निर्माण के लिए अनुमति देता है।

उदाहरण:

public class ValuesController : ApiController
{
    // GET /api/values
    public IEnumerable<string> Get()
    {
        // returns /api/values/123
        string url = Url.Route("DefaultApi", new { controller = "values", id = "123" });
        return new string[] { "value1", "value2" };
    }

    // GET /api/values/5
    public string Get(int id)
    {
        return "value";
    }

    ...
}

यह UrlHelper न तो आपके विचारों में मौजूद है और न ही मानक नियंत्रकों में।


अपडेट करें:

और ApiController के बाहर रूटिंग करने के लिए आप निम्नलिखित कार्य कर सकते हैं:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        string url = Url.RouteUrl(
            "DefaultApi", 
            new { httproute = "", controller = "values", id = "123" }
        );
        return View();
    }
}

या किसी दृश्य के अंदर:

<script type="text/javascript">
    var url = '@Url.RouteUrl("DefaultApi", new { httproute = "", controller = "values", id = "123" })';
    $.ajax({
       url: url,
       type: 'GET',
       success: function(result) {
           // ...
       }
    });
</script>

httproute = ""मार्ग टोकन नोटिस करें जो महत्वपूर्ण है।

स्पष्ट रूप से यह मानता है कि आपका Api मार्ग DefaultApiआपके RegisterRoutes पद्धति में कहा जाता है Global.asax:

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

क्योंकि मैं उरल्स को सुरक्षित तरीके से उत्पन्न करने में सक्षम होने के लिए अपने दृश्य की आवश्यकता के कारण वास्तव में मेरी बहुत मदद नहीं करता। अगर कोई गो लाइव लाइसेंस है तो व्यू पर url बनाने का 'गो लाइव' तरीका क्या है?
शेन कोर्ट्रेल

इससे अधिक महत्वपूर्ण बात यह है कि यदि आप ASP.Net डेवलपमेंट सर्वर का उपयोग कर रहे हैं, तो यह पोर्ट को हर समय बदल देता है, इसलिए आप url को देखने में कट्टर नहीं कर सकते।
शेन कोर्ट्रेल

@ShaneCourtrille, मैंने अपने उत्तर को यह वर्णन करने के लिए अद्यतन किया है कि आप System.Web.Mvc.UrlHelperHttpControllerContext के बाहर आपी मार्गों को बनाने के लिए सामान्य का उपयोग कैसे कर सकते हैं ।
डारिन दिमित्रोव

बहुत बहुत धन्यवाद! मैं रूटयूआरएल का उपयोग करने की कोशिश कर रहा था, लेकिन उन्हें रिप्रजेंटेटिव परम आवश्यकता के बारे में नहीं पता था।
शेन कोर्ट्रेल

2
मैं नमूने के उद्देश्य को समझता हूं; मैं यह कह रहा हूं कि यदि आप ViewBag कोड की एक पंक्ति में फेंक दिए जाते हैं तो यह एक अधिक उपयोगी नमूना होगा क्योंकि आप यह प्रदर्शित करेंगे कि यह मूल्य वह है जो हम संभावित परिदृश्य में पाने की कोशिश कर रहे थे और न कि कुछ मनमाने कोड को निष्पादित कर रहे थे । फिर, मैंने टिप्पणी नहीं की होती अगर मैंने कुछ मिनट बर्बाद नहीं किया होता तो यह महसूस करने में असफल हो जाता कि इससे पहले कि मैं आखिरकार पहचान पाया कि कोड की विशेष पंक्ति प्रासंगिक थी।
जॉन डेविस

43

यह सरल रूप में काम करता है Url.Actionइस प्रकार आपको किसी भी रूटिंग नाम का संदर्भ नहीं देना पड़ता है:

Url.Action("ActionName", "ControllerName", new { httproute = "DefaultApi" })

area = ""यदि क्षेत्र में URL आवश्यक हो तो आप जोड़ना चाह सकते हैं । (Api नियंत्रकों डिफ़ॉल्ट रूप से क्षेत्रों के बाहर हैं।) मैं MVC 4 का उपयोग कर रहा हूं।


7
Web Api में UrlHelper msdn.microsoft.com/en-us/library/… है , इसमें एक्शन विधि नहीं है।
यूरी फकटोरोविच

8
@YuriyFaktorovich इस पोस्ट का अर्थ है कि Url.Actionएक दृश्य से उपयोग किया जा रहा है। Urlप्रकार का है System.Web.Mvc.UrlHelper, और यह WebApiमार्गों को मैप नहीं करता है । यही कारण है कि आपको अतिरिक्त पैरामीटर की आवश्यकता है new { httproute = "" }:।
जेसी

3
मैंने जोड़ा है httproute""लेकिन यह मैपिंग नहीं है = /
Maslow

मुझे एक रिक्त क्षेत्र और null htmlAttributes के साथ लिंक जोड़ना था, @Html.ActionLink("link", "Get", "Servers", new { id = r.idServer, area = "", httproute = "" }, null) लेकिन वह पूरी तरह से काम कर रहा था
क्रिस्टोफर जी लुईस

2
यह पूरी तरह से एक दृश्य से काम करता है, हालांकि, मुझे यकीन नहीं है कि यह कार्रवाई का नाम क्वेरी स्ट्रिंग के रूप में क्यों उत्पन्न करता है: / api / डैशबोर्ड? कार्रवाई = getdata। मैं यह उम्मीद कर रहा था: / एपीआई / डैशबोर्ड / गेटडाटा
umutesen

7

हार्डकोड किए गए स्ट्रिंग्स (नियंत्रक नामों) के बिना, एक प्रकार से लिंक उत्पन्न करने में सक्षम होना चाहते हैं?

उस के लिए एक नोगेट है! (और यह मार्क सेमैन ने लिखा है)

https://github.com/ploeh/Hyprlinkr

इस तरह काम करता है:

रूट, हमेशा की तरह:

name: "API Default",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }

URL प्राप्त करें:

var linker = new RouteLinker(request);
var uri = linker.GetUri<FooController>(r => r.GetById(1337));

परिणाम:

http://localhost/api/foo/1337

3

यहाँ सवाल का जवाब देने के लिए KISS विधि है:

यदि यह वह कोड है जिसका उपयोग आप MVC नियंत्रक URL बनाने के लिए करेंगे

@Url.Action("Edit", "MyController")

नियंत्रक के एपीआई संस्करण के लिए एक URL प्राप्त करने के लिए (यह मानकर कि आप उसी नियंत्रक नाम का उपयोग करते हैं) जिसका आप उपयोग कर सकते हैं

@Url.Action("Edit", "api/MyController")

सभी Url.Action विधि कर रही है, आवेदन के मूल पथ को नियंत्रक नाम के साथ जोड़ रही है, इसके बाद कार्रवाई नाम (जब तक कि यह "सूचकांक" नहीं है, जिस स्थिति में यह संलग्न नहीं है। यदि मार्ग मान ऑब्जेक्ट में एक आईडी है। प्रॉपर्टी का मूल्य URL से भी जोड़ा जाता है।


धन्यवाद! मैं api/अपने नियंत्रक नाम से पहले गायब था ।
डैनियल कांग्रोव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.