2012-12-28 17 views
11

मुझे अपने वेब एपीआई नियंत्रक को एक गतिशील JSON ऑब्जेक्ट पास करने की आवश्यकता है ताकि मैं इसे किस प्रकार के आधार पर संसाधित कर सकूं। मैंने JSON.NET उदाहरण that can be seen here का उपयोग करने का प्रयास किया है, लेकिन जब मैं फिडलर का उपयोग करता हूं, तो मैं देख सकता हूं कि जॉबेक्ट में पारित हमेशा शून्य होता है।वेब एपीआई के लिए गतिशील JSON ऑब्जेक्ट पास करना - न्यूटॉन्सॉफ्ट उदाहरण

यह उदाहरण फ़िडलर में चिपकाया से एक डालती है:

POST http://localhost:9185/api/Auto/PostSavePage/ HTTP/1.1 
User-Agent: Fiddler 
Content-type: application/json 
Host: localhost 
Content-Length: 88 

{AlbumName: "Dirty Deeds",Songs:[ { SongName: "Problem Child"},{ SongName: 
"Squealer"}]} 

यहाँ उत्तर: मेरी बहुत ही सरल वेब एपीआई नियंत्रक विधि है:

[HttpPost] 
public JObject PostSavePage(JObject jObject) 
{   
    dynamic testObject = jObject;   
    // other stuff here 
} 

मैं इस के लिए नया हूँ और मैं एक जोड़ी इस क्षेत्र के आसपास के प्रश्नों के बारे में:

क्या मैं इस विशेष उदाहरण में कुछ गलत कर रहा हूं?

तर्कसंगत रूप से, एक गतिशील JSON ऑब्जेक्ट (जावास्क्रिप्ट AJAX पोस्ट से) में पास करने का एक बेहतर तरीका है?

+2

आपको इसे सर्वर पर पोस्ट करने से पहले अपनी जावास्क्रिप्ट ऑब्जेक्ट को स्ट्रिंग करना चाहिए। आपके प्रश्न में दिखाया गया डेटा (वर्तमान में) मान्य JSON का प्रतिनिधित्व नहीं करता है। – Perception

+0

मैं एक नई बनाई गई एमवीसी 4 वेब.एपीआई परियोजना में आपकी समस्या को दोबारा नहीं कर पा रहा था। मैं फिडलर के साथ सटीक समान मानों के साथ एक अनुरोध भेजता हूं और 'jObject' पैरामीटर डेटा से ठीक से भर जाता है। शायद आपके रूटिंग में कुछ गड़बड़ है, क्या आपके पास कोई कस्टम मार्ग है? – nemesv

+0

धन्यवाद nemesv। मैंने एक नई परियोजना की भी कोशिश की और आप सही हैं, jObject ठीक है। मेरे पास कस्टम मार्ग हैं इसलिए वहां एक नज़र डालेंगी। – davy

उत्तर

3

यहां सहायता करने वाले सभी लोगों के लिए धन्यवाद। दुर्भाग्यवश, मैं कभी भी गलत के नीचे नहीं आया।

मैंने इस परियोजना को टुकड़े से टुकड़े टुकड़े पर एक नई परियोजना में पोर्ट किया और यह ठीक काम करता है।

$.ajax("http://localhost:54997/api/values/PostSavePage/", { 
    data: JSON.stringify(jObject),        
    contentType: 'application/json', 
    type: 'POST' 
}); 

मूल एपीआई कार्रवाई:

public class RouteConfig 
{  
    private static string ControllerAction = "ApiControllerAction"; 

    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

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

एपीआई में मेरे कॉल अब JSON.stringify उपयोग करता है:

जानकारी के लिए, मैं एक RouteConfig वर्ग, जो इस समय काफी सरल है है काम करता है।

नोट, कि मैं इस समय केवल इस के साथ खेल रहा हूं, इसलिए कोड सबसे अच्छा नहीं है, लेकिन मैंने सोचा कि यह मूल रूप में उपयोगी हो सकता है अगर किसी और के पास कोई समस्या हो।

+0

क्या आप पहले एप में अपने नियंत्रक के बारे में सुनिश्चित हैं? http: // localhost: 9185/api/auto/PostSavePage/यह ऑटोकंट्रोलर होना चाहिए –

14

धारणा की टिप्पणी के अनुसार आपका JSON मान्य नहीं दिखता है। JSONLint के माध्यम से चलाने के लिए और आप पाते हैं: यह है करने के लिए

Parse error on line 1: 
{ AlbumName: "Dirty De 
-----^ 
Expecting 'STRING', '}' 

बदलें "चारों ओर फ़ील्ड नाम:

{ 
    "AlbumName": "Dirty Deeds", 
    "Songs": [ 
     { 
      "SongName": "Problem Child" 
     }, 
     { 
      "SongName": "Squealer" 
     } 
    ] 
} 

इसके अलावा, आप या तो एक JToken या एक गतिशील वस्तु के लिए अपने JObject बाहर गमागमन की कोशिश की है (उदाहरण के लिए here)?

[HttpPost] 
public JObject PostSavePage(JToken testObject) 
{     
    // other stuff here 
} 

या

[HttpPost] 
public JObject PostSavePage(dynamic testObject) 
{     
    // other stuff here 
} 
+0

धन्यवाद, इनमें से कोई भी सुझाव मेरे लिए काम नहीं कर रहा है। ऊपर nemesv की टिप्पणी देखें। मुझे लगता है कि यह मेरे कस्टम मार्गों के साथ कुछ करना चाहिए। – davy

+0

@ डेवी इसे सुनकर खेद है। यदि आप यह देखने में सक्षम हैं कि testObject शून्य है तो आपके मार्ग ठीक होना चाहिए ... क्या आप PostDavePage के अंदर ब्रेकपॉइंट प्राप्त कर सकते हैं? यदि आपके पास साझा करने के लिए आपकी रूट कॉन्फ़िगरेशन है तो मैं जवाब देने पर एक और स्टैब लेने का प्रयास करूंगा। –

+0

बहुत बहुत धन्यवाद। कुछ अजीब जा रहा है। मैं अपने बुनियादी कार्य समाधान में फाइलों की प्रतिलिपि बनाने की वांछित हूं। उम्मीद है कि, यह काम करेगा या मैं समस्या को इंगित करने में सक्षम हो जाएगा। मुझे लगता है कि परियोजना किसी भी तरह से दूषित हो सकती है क्योंकि मुझे कुछ और अजीब त्रुटियां मिल रही हैं जिन्हें मैं अभी तक नहीं जाऊंगा क्योंकि मैं उन्हें नए ऐप में नहीं लेता हूं। जब मुझे कुछ मिल जाए तो मैं अपडेट करूंगा। एक बार फिर धन्यवाद। – davy