जावास्क्रिप्ट: JSON ऑब्जेक्ट को अजाक्स के साथ भेजें?


151

क्या यह संभव है?

xmlHttp.send({
    "test" : "1",
    "test2" : "2",
});

हो सकता है कि के साथ: के साथ एक शीर्ष लेख content type: application/json?:

xmlHttp.setRequestHeader('Content-Type', 'application/json')

अन्यथा मैं उपयोग कर सकता हूं:

xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')

और फिर JSON.stringifyJSON ऑब्जेक्ट और इसे एक पैरामीटर में भेजें, लेकिन यदि संभव हो तो इसे इस तरह से भेजना अच्छा होगा।

जवाबों:


330

JQuery के साथ:

$.post("test.php", { json_string:JSON.stringify({name:"John", time:"2pm"}) });

बिना jQuery के:

var xmlhttp = new XMLHttpRequest();   // new HttpRequest instance 
xmlhttp.open("POST", "/json-handler");
xmlhttp.setRequestHeader("Content-Type", "application/json");
xmlhttp.send(JSON.stringify({name:"John Rambo", time:"2pm"}));

2
लेकिन आदमी मैं सामग्री-प्रकार का उपयोग कर सकता हूं: application/x-www-form-urlencodedयदि मैं स्ट्रिंग का उपयोग करता हूं, तो उपयोग करने का क्या मतलब है application/json? :)
एडम

4
@ क्रिस: क्या बात है? सामग्री-प्रकार की सेटिंग पूरी तरह से मनमानी है जब तक कि सर्वर एक या दूसरे को विशेष रूप से व्यवहार नहीं करता है। यह केवल दिन के अंत में आगे और पीछे बहने वाला डेटा है।
मेलमोकब

17
अच्छी तरह से अगर आपके पोस्ट बॉडी के JSON जैसे होने की उम्मीद है ({नाम: "जॉन", समय: "2pm"}) कंटेंट टाइप एप्लिकेशन / जॉन्स का उपयोग करें यदि आपका पोस्ट बॉडी urlencoded डेटा (नाम = जॉन एंड टाइम = 2pm) है तो एप्लिकेशन का उपयोग करें / x-www-form-urlencoded
नाथन रोमानो

1
मुझे URL कहाँ रखना चाहिए?
आरोन लियू

6
@ShuruiLiu एक URL विधि के "/json-handler"2 परम के रूप में चला जाता हैopen()
एलेक्जेंडर निल

36

यदि आप jQuery का उपयोग नहीं कर रहे हैं, तो कृपया सुनिश्चित करें:

var json_upload = "json_name=" + JSON.stringify({name:"John Rambo", time:"2pm"});
var xmlhttp = new XMLHttpRequest();   // new HttpRequest instance 
xmlhttp.open("POST", "/file.php");
xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlhttp.send(json_upload);

और php प्राप्त करने के लिए अंत:

 $_POST['json_name'] 

सीधे इसका उपयोग नहीं कर सकते?
रोहिट्सकला

8
मुझे नहीं लगता कि यह पूछे गए सवाल का जवाब देता है। मेरा मानना ​​है कि देवता JSON की एक ब्लॉब को सामग्री-प्रकार के रूप में भेजना चाहते हैं: अनुप्रयोग / json, एक urlencoded आवरण में लिपटे नहीं।
Fordi

1
यह वास्तव में JSON को नहीं भेज रहा है, यह formdata को भेज रहा है। आप सीधे JSON भी भेज सकते हैं, जिस स्थिति में आप इसे $ _POST के साथ नहीं पढ़ सकते हैं, बल्कि इसे json_decode (file_get_contents ('php: // input')) के साथ पढ़ सकते हैं;
डेविड

प्रिय दोस्तों क्या आप इस पोस्ट अजाक्स को पेज पर उपयोग किए जाने वाले पूरे आवश्यक कोड के साथ साझा कर सकते हैं? या आपको धन्यवाद के रूप में अच्छी तरह से अगर आप JSON के साथ वेनिला AJAX POST के कुछ पूर्ण कार्य उदाहरण के लिए एक तरह से लिंक है
रॉबर्ट

1

मैं कुछ दिनों के लिए कुछ भी करने के लिए संघर्ष किया जो मेरे लिए काम करेगा क्योंकि आईडी के कई सरणियों को पारित कर रहा था और एक बूँद लौटा रहा था। यदि आप .NET 2.1 का उपयोग कर रहे हैं, तो उपयोग करना बंद कर देता है, आपको [FromBody] का उपयोग करने की आवश्यकता होती है और जैसा कि आप डेटा को धारण करने के लिए एक व्यूमोडल बनाने के लिए केवल एक बार उपयोग कर सकते हैं।

नीचे की तरह सामग्री लपेटें,

var params = {
            "IDs": IDs,
            "ID2s": IDs2,
            "id": 1
        };

मेरे मामले में मैंने पहले ही सरणियों को रद्द कर दिया था और फ़ंक्शन को परिणाम दिया

var IDs = JsonConvert.SerializeObject(Model.Select(s => s.ID).ToArray());

फिर XMLHttpRequest POST को कॉल करें और ऑब्जेक्ट को सख्त करें

var ajax = new XMLHttpRequest();
ajax.open("POST", '@Url.Action("MyAction", "MyController")', true);
ajax.responseType = "blob";
ajax.setRequestHeader("Content-Type", "application/json;charset=UTF-8");           
ajax.onreadystatechange = function () {
    if (this.readyState == 4) {
       var blob = new Blob([this.response], { type: "application/octet-stream" });
       saveAs(blob, "filename.zip");
    }
};

ajax.send(JSON.stringify(params));

फिर इस तरह का एक मॉडल है

public class MyModel
{
    public int[] IDs { get; set; }
    public int[] ID2s { get; set; }
    public int id { get; set; }
}

फिर एक्शन में पास हो

public async Task<IActionResult> MyAction([FromBody] MyModel model)

यदि आपकी फ़ाइल लौट रही है तो इस ऐड-ऑन का उपयोग करें

<script src="https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/1.3.3/FileSaver.min.js"></script>

0

Json.stringfyइस मुद्दे को तय करने वाले जसन के आसपास जोड़ना

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