2012-01-06 13 views
5

एक शानदार बैकएंड के साथ एक वेबपैप के लिए मैं jquery के $post का उपयोग कर सर्वर पर कुछ जेसन पोस्ट कर रहा हूं। अब मेरे आश्चर्य के लिए, जेसन अनुरोध निकाय के बजाय अनुरोध के फॉर्म डेटा के लिए पैरामीटर कुंजी में भरा हुआ है। मैं कुछ other ways to do it के बारे में सोच सकता हूं, लेकिन सवाल यह है कि यह मेरी अपेक्षा के अनुसार काम क्यों नहीं करता है।jquery json को अनुरोध निकाय के बजाय पैरामीटर नाम के रूप में पोस्ट क्यों करता है?

सर्वर मैं scalatra का उपयोग करें और कुछ अनुरोध की जानकारी प्रिंट पर: करता है कि मैं क्या सोचता

println("Request received:") 
println(fromInputStream(request.getInputStream).getLines().mkString) 
println("--------------") 
println(request.getParameterMap.toString) 
println("==============") 

अब एक सरल कर्ल सही है:

curl -X POST http://localhost:8080/x -H "Content-Type: application/json" -d '{"a":"b"}' 

का उत्पादन:

Request received: 
{"a":"b"} 
------------- 
{} 
============== 

और एचटीएमएल + जेएस की समस्या को हल करने के लिए:

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> 
<body> 
    <button type="button" onclick="doPost()"> 
    POST 
    </button> 
    <script src="http://code.jquery.com/jquery-1.7.1.min.js"></script> 
    <script type="text/javascript"> 
function doPost() { 
    $.post("http://localhost:8080/x",  
      JSON.stringify({"a":"b"}), 
      function(data) {}); 
} 
    </script> 
</body> 
</html> 

का उत्पादन:

Request received: 

-------------- 
{{"a":"b"}=[Ljava.lang.String;@7a2897ac} 
============== 

तो अगर मैं एक stringified json स्ट्रिंग और एक कॉलबैक मैं सब कुछ एक एकल पैरामीटर कुंजी में भरवां पाने के साथ $ पद का उपयोग करें। यदि यह सामान्य है, तो मैं जानना चाहता हूं कि क्यों, और मैं सर्वर पर इसे स्पष्ट रूप से कैसे सुलझाना चाहता हूं। यदि यह सामान्य नहीं है, तो मैं जानना चाहता हूं कि मुझे $ पोस्ट का उपयोग करके प्रतिक्रिया निकाय में प्राप्त करने के लिए क्या करना चाहिए।

अद्यतन: वहाँ अब एक feature request for jquery to support contentType on $.post

उत्तर

8

मुझे लगता है कि अगर आप $.ajax

$.ajax(
    { 
    url: "http://localhost:8080/x", 
    data: JSON.stringify({a: 'b'}), 
    processData: false, 
    type: 'POST', 
    contentType: 'application/json' 
    } 
); 

processData को ड्रॉप डाउन में आप यह कर सकते हैं jQuery बताता है अपने डेटा के साथ गड़बड़ के आसपास है और स्थापित करने contentType सुनिश्चित करना चाहिए कि नहीं आपका बैकएंड जेसन की कोशिश नहीं करता और पार्स नहीं करता क्योंकि यह नियमित यूआरएल एन्कोडेड फॉर्म था।

4

आप सामग्री-प्रकार सेट नहीं कर रहे हैं जो $ .post() विधि को एप्लिकेशन/x-www-form-urlencoded पर सेट करने का कारण बन रहा है।

$ .ajax() का उपयोग करें और सामग्री-प्रकार को एप्लिकेशन/जेसन को स्पष्ट रूप से सेट करें।

सम्मान, विन्सेंट।

0

विन्सेंट पार्टिंगटन सही है, डिफ़ॉल्ट contentType बजाय सीधे आवेदन/x-www फार्म-urlencoded

उपयोग jQuery.ajax समारोह के लिए सेट या अपने खुद के आशुलिपि बनाने है।

आप सर्वर पक्ष को भी बदल सकते हैं, उदाहरण के लिए Spring 3 MVC - Advanced Data Binding - Form Request with List of Simple Objects देखें। लेकिन मैं सिर्फ पूर्ण AJAX फ़ंक्शन का उपयोग करूंगा।

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