2015-04-17 11 views
9

मेरे पास मेरे एमवीसी 5 प्रोजेक्ट समाधान के भीतर एक वेबएपीआई नियंत्रक है। वेबएपीआई एक तरीका है जिसके एक JSON सूची के रूप में एक विशिष्ट फ़ोल्डर में सभी फ़ाइलें देता है:एमवीसी नियंत्रक से कॉलिंग वेब एपीआई

[{"name":"file1.zip", "path":"c:\\"}, {...}]

मेरी HomeController से मैं, इस विधि फोन List<QDocument> को Json प्रतिक्रिया बदलने और एक के लिए इस सूची वापस करना चाहते रेजर देखें। यह सूची खाली हो सकती है: [] यदि फ़ोल्डर में कोई फ़ाइल नहीं है।

public class DocumentsController : ApiController 
{ 
    #region Methods 
    /// <summary> 
    /// Get all files in the repository as Json. 
    /// </summary> 
    /// <returns>Json representation of QDocumentRecord.</returns> 
    public HttpResponseMessage GetAllRecords() 
    { 
     // All code to find the files are here and is working perfectly... 

     return new HttpResponseMessage() 
     { 
      Content = new StringContent(JsonConvert.SerializeObject(listOfFiles), Encoding.UTF8, "application/json") 
     }; 
    }    
} 

यहाँ मेरी HomeController है:

यह APIController है

public class HomeController : Controller 
{ 
    public Index() 
    { 
     // I want to call APi GetAllFiles and put the result to variable: 
     var files = JsonConvert.DeserializeObject<List<QDocumentRecord>>(API return Json); 
     } 
} 

अंत में इस मामले में मॉडल है कि आप इसे की जरूरत है:

public class QDocumentRecord 
{ 
     public string id {get; set;} 
     public string path {get; set;} 
    ..... 
} 

तो मैं कैसे कर सकते हैं यह कॉल करें?

+1

क्यों आप इसे किसी अन्य विधि के रूप में कॉल नहीं करते MVC नियंत्रक से एक ही कॉल कर सकते हैं? संदर्भ जोड़ें, विधि को शुरू करें और कॉल करें ... – Kaf

+1

बस अपने एपीकंट्रोलर में जेसनकॉन्टर का उपयोग करने पर एक हेड-अप ... इसे स्वचालित रूप से करना प्रमुख सुविधाओं में से एक है WebAPI, – spender

उत्तर

7

मेरी HomeController से मैं कॉल करना चाहते हैं इस विधि और सूची

पर जेसन प्रतिक्रिया को परिवर्तित करें नहीं, आप नहीं करते हैं। कोड वास्तव में पहुंचने पर आप वास्तव में एक HTTP कॉल के ओवरहेड और (डी) क्रमबद्धता को जोड़ना नहीं चाहते हैं। यह भी एक ही विधानसभा में है!

आपका एपीकंट्रोलर (my preferred) convention के खिलाफ चला जाता है।यह एक ठोस प्रकार वापसी करते हैं:

public IEnumerable<QDocumentRecord> GetAllRecords() 
{ 
    listOfFiles = ... 
    return listOfFiles; 
} 

आपको लगता है कि नहीं चाहते हैं और आप पूरी तरह सुनिश्चित करें कि आप HttpResponseMessage लौटना ही होगा रहे हैं, तो अभी भी वहाँ बिल्कुल कोई need to bother with calling JsonConvert.SerializeObject() yourself है:

return Request.CreateResponse<List<QDocumentRecord>>(HttpStatusCode.OK, listOfFiles); 
फिर

फिर, आप एक नियंत्रक में व्यापार तर्क नहीं करना चाहते, तो आप निकाल सकते है कि एक वर्ग है कि आप के लिए काम करता है में:

public class FileListGetter 
{ 
    public IEnumerable<QDocumentRecord> GetAllRecords() 
    { 
     listOfFiles = ... 
     return listOfFiles; 
    } 
} 

किसी भी तरह से है, तो आप इस वर्ग या कॉल कर सकते हैं अपने MVC नियंत्रक से सीधे ApiController:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var listOfFiles = new DocumentsController().GetAllRecords(); 
     // OR 
     var listOfFiles = new FileListGetter().GetAllRecords(); 

     return View(listOfFiles); 
    } 
} 

लेकिन अगर आप सच में, सच एक HTTP अनुरोध करना चाहिए, आप HttpWebRequest, WebClient, HttpClient या RestSharp, उपयोग कर सकते हैं सभी ट्यूटोरियल की जो बहुत से मौजूद के लिए।

1

अच्छी तरह से, आप इसे कई तरीकों से कर सकते हैं ... उनमें से एक HttpRequest बनाना है। मैं आपको अपनी खुद की वेबवी से अपने स्वयं के वेबपीआई को कॉल करने के खिलाफ सलाह दूंगा (विचार अनावश्यक है ...), लेकिन here's a end to end tutorial

5

आप एपी कंट्रोलर कॉल में आपके पास कोड को क्यों नहीं ले जाते हैं - दस्तावेज़ नियंत्रक को उस श्रेणी में ले जाएं जिसे आप अपने होम कंट्रोलर और दस्तावेज़ नियंत्रक दोनों से कॉल कर सकते हैं। इसे एक कक्षा में खींचें जिसे आप दोनों नियंत्रकों से कॉल करते हैं। अपने प्रश्न में यह सामान:

// सभी कोड फ़ाइलों यहाँ हैं और पूरी तरह से काम कर रहा है ...

यह मतलब नहीं है एक ही वेबसाइट पर एक और नियंत्रक से एक एपीआई नियंत्रक कॉल करने के लिए लगता है।

जब आप भविष्य में इसे वापस करने के लिए आ आप फ़ाइलों को खोजने और वहाँ उस तर्क करने के लिए एक सामान्य वर्ग होगा यह भी कोड को सरल बनाएगा ...

+0

"एपीआई कंट्रोलर को दूसरे से कॉल करने का अर्थ नहीं है उसी वेबसाइट पर नियंत्रक "+1 – spender

+0

मुझे एपीआई को इस तरह से डिजाइन करना होगा। एपीआई अन्य मोबाइल ऐप्स द्वारा इस्तेमाल किया गया है। और मैं फ़िल्टरिंग करने के लिए परिणाम को रेज़र दृश्य में एक सूची के रूप में भेजना चाहता हूं और ... –

+0

अपने आंतरिक तर्क को स्थानांतरित करता है जहां आप फ़ाइलों की अपनी सूची को एक सामान्य वर्ग में जेनरेट करते हैं, मोबाइल ऐप्स द्वारा उपयोग किए जाने वाले वास्तविक नियंत्रक इंटरफ़ेस को प्रभावित नहीं करना चाहिए। उनके लिए नियंत्रक में क्या होता है एक काला बॉक्स है। फाइलों को दोनों द्वारा उपयोग की जाने वाली एक सामान्य कक्षा में खोजने के लिए बस सामान्य तर्क खींचें .. – kmcnamee

5

यहां बहुत देर हो चुकी है लेकिन नीचे कोड साझा करने का विचार किया गया है। हम एक ही समाधान में पूरी तरह एक अलग परियोजना के रूप में हमारे WebAPI है तो हम जैसे नीचे

public class ProductsController : Controller 
    { 
     // GET: Products 
     public async Task<ActionResult> Index() 
     { 
      string apiUrl = "http://localhost:58764/api/values"; 

      using (HttpClient client=new HttpClient()) 
      { 
       client.BaseAddress = new Uri(apiUrl); 
       client.DefaultRequestHeaders.Accept.Clear(); 
       client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json")); 

       HttpResponseMessage response = await client.GetAsync(apiUrl); 
       if (response.IsSuccessStatusCode) 
       { 
        var data = await response.Content.ReadAsStringAsync(); 
        var table = Newtonsoft.Json.JsonConvert.DeserializeObject<System.Data.DataTable>(data); 

       } 


      } 
      return View(); 

     } 
    } 
संबंधित मुद्दे