2016-04-12 13 views
7

को स्ट्रिंग मैं एक ASP.NET WEB-API 2 एप्लिकेशन डायन एक POST विधि है कि javascript से एक JOSNstring अज्ञात संरचना के साथ स्वीकार करता है की जरूरत है की है।
मैंने cors और GET विधियों को ठीक से काम किया है, हालांकि क्लाइंट से JSON भेजते समय एपीआई विधि पैरामीटर हमेशा null होता है।पोस्ट JSON वेब एपीआई

//parameters i tried: 
//[FromBody]string model 
//[FromBody]dynamic model 
//dynamic model 
public HttpResponseMessage Post(string model) 
{ 
    return new HttpResponseMessage() 
    { 
     Content = new StringContent("POST: Test message: " + model) 
    }; 
} 

और मेरे मुवक्किल विधि:
यह मेरा api विधि है

function sendRequest() 
{ 
    var Test = {"Name":"some name"}; 
    var method = $('#method').val(); 

    $.ajax({ 
     type: method, 
     url: serviceUrl, 
     contentType: 'application/json; charset=utf-8', 
     data: JSON.stringify(Test)    
    }).done(function (data) 
    { 
     $('#value1').text(data); 
    }).error(function (jqXHR, textStatus, errorThrown) 
    { 
     $('#value1').text(jqXHR.responseText || textStatus); 
    }); 
} 

तो सवाल यह है कि मैं एक अज्ञात JSON stringjavascript से कैसे पोस्ट और मेरे api विधि में एक स्ट्रिंग के रूप में यह स्वीकार कर सकते हैं ?

+0

कोशिश 'डेटा: {मॉडल: JSON.stringify (टेस्ट)}' –

+0

यह मेरे preflight अनुरोध करने के लिए एक 'रिस्पांस देता पास नहीं पहुँच नियंत्रण की जांच: नहीं' पहुँच -Control-Allow-Origin 'हेडर अनुरोधित संसाधन' त्रुटि संदेश – Yoav

+0

पर मौजूद है JSON.stringify नहीं। डेटा का उपयोग करें: {मान: टेस्ट} और अपने नियंत्रक ([FromBody] स्ट्रिंग टेस्ट में)। वह एक स्ट्रिंग वापस करना चाहिए। –

उत्तर

10

मैंने आपका कोड संपादित किया और यह अच्छी तरह से काम करता है।

ए [FromBody] विशेषता निर्दिष्ट करती है कि एक क्रिया पैरामीटर केवल आने वाले HTTPRequestMessage के इकाई निकाय से आता है।

public class TestApiController : ApiController 
    { 
     // POST api/<controller> 
     [HttpPost] 
     public HttpResponseMessage Post([FromBody]string value) 
     { 
      return new HttpResponseMessage() 
      { 
       Content = new StringContent("POST: Test message: " + value) 
      }; 
     } 

    } 

function sendRequest() { 
    var Test = { "Name": "some name" }; 

    $.ajax({ 
     type: "POST", 
     url: "api/TestApi", 
     data: { '': JSON.stringify(Test) } 
    }).done(function (data) { 
     alert(data); 
    }).error(function (jqXHR, textStatus, errorThrown) { 
     alert(jqXHR.responseText || textStatus); 
    }); 
} 
+1

से नीचे मेरा उत्तर देखें, मैंने आपके सुझाव की कोशिश की और यह काम करता है। लेकिन मैं एक स्पष्टीकरण खोजना चाहता हूं। आपके द्वारा प्रदान किया गया लिंक मैलवेयर –

+0

@ क्रिस्टोफएडमैकिस है: https://docs.microsoft.com/en-us/aspnet/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web- एपीआई –

7

या तो एक सामान्य HTTP अनुरोध के रूप में पोस्ट अनुरोध का इलाज, और मैन्युअल रूप से पार्स शरीर:

public async Task<HttpResponseMessage> Post(HttpRequestMessage request) 
{ 
    var jsonString = await request.Content.ReadAsStringAsync(); 

    // deserialize the string, or do other stuff 

    return new HttpResponseMessage(HttpStatusCode.OK); 
} 

या एक सामान्य JToken उपयोग करें, और serializer आराम करते हैं:

public HttpResponseMessage Post([FromBody] JToken model) 
{ 
    DoStuff(model); 

    var myField = model["fieldName"]; 

    return new HttpResponseMessage(HttpStatusCode.OK); 
} 

नोट्स: इस तरह आपको क्लाइंट-साइड कोड को बदलने की आवश्यकता नहीं है, क्योंकि आप अभी भी जेसन डेटा पोस्ट कर रहे हैं, न कि सामान्य स्ट्रिंग, जो कि आपके क्लाइंट को क्रमबद्ध JSON ओ पोस्ट करने की अपेक्षा करते हैं, bjects।

संदर्भ:

http://bizcoder.com/posting-raw-json-to-web-api

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