2012-03-01 18 views
6

मैं XMLHttpRequest ऑब्जेक्ट का उपयोग कर किसी फ़ॉर्म से JSON डेटा भेजने की कोशिश कर रहा हूं। मैं निम्नलिखित फ़ंक्शन का उपयोग कर डेटा भेज सकता हूं। फायरबग में कोई त्रुटि दिखाई नहीं दे रही है और अनुरोध में जेएसओएन-डेटा फ़ायरबग द्वारा अच्छी तरह से प्रदर्शित किया गया है।XMLHttpRequest w/o का उपयोग करके PHP पर JSON डेटा भेजें jQuery

हालांकि, मैं echo.php, क्या सामान्य रूप से सामग्री रिटर्न को डेटा भेजने:

<?php 
print_r($_POST); 
print_r($_GET); 
foreach (getallheaders() as $name => $value) { 
    echo "$name: $value\n"; 
} 
echo file_get_contents('php://input'); 
?> 

बाद सरणी हमेशा खाली है, लेकिन मैं JSON स्ट्रिंग file_get_contents द्वारा वापस देख सकते हैं। यह कैसे होता है? मैं क्या गलत कर रहा हूं?

echo.php

Array 
(
) 
Array 
(
) 
Host: localhost 
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:10.0.2) Gecko/20100101 Firefox/10.0.2 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: eo,de-de;q=0.8,de;q=0.6,en-us;q=0.4,en;q=0.2 
Accept-Encoding: gzip, deflate 
Connection: keep-alive 
Content-Type: application/json; charset=utf-8 
Referer: http://localhost/form.html 
Content-Length: 88 
Cookie: {{..to much data..}} 
Pragma: no-cache 
Cache-Control: no-cache 
{"type":"my_type","comment":"commented"} 

की

उत्पादन भेजने समारोह:

function submit(){ 
    var data={}; 
    data.type=document.form.type.value; 
    data.comment=document.form.comment.value; 

    //get right XMLHttpRequest object for current browsrer 
    var x=ajaxFunction(); 

    var string = JSON.stringify(data); 

    x.open('POST','echo.php',true); 
    x.setRequestHeader('Content-type','application/json; charset=utf-8'); 
    x.setRequestHeader("Content-length", string.length); 
    x.setRequestHeader("Connection", "close"); 

    x.onreadystatechange = function(){ 
     if (x.readyState != 4) return; 
     if (x.status != 200 && x.status != 304) { 
      alert('HTTP error ' + req.status); 
      return; 
     } 

     data.resp = JSON.parse(x.responseText); 
     if(data.resp.status=='success'){ 
      alert('That worked!'); 
     }else{ 
      alert('That didn\'t work!'); 
     } 
    } 
    x.send(string); 

    return false; //prevent native form submit 
} 
+0

'अलर्ट ('HTTP त्रुटि' + req.status);' ==> पुनः परिभाषित नहीं किया गया, क्या आपका मतलब 'x' था? –

उत्तर

7

आप भेजने समारोह में अपने चर नाम देना भूल गए। अच्छा तरीका यह उपयोग करने के लिए

x.send('name1='+string+'&name2=value2'); 

को देखते हुए मुझे लगता है कि, आप सामग्री-लंबाई हेडर बदलने के लिए होगा। मुझे नहीं लगता कि इसे भेजने के लिए उपयोगी है।

एक और चीज जो आप कर सकते हैं वह जीईटी विधि के साथ प्रयास करें। तुम भी है कि एक करके अपने सामग्री प्रकार शीर्ष लेख को बदलने की कोशिश कर सकते हैं:

xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded") 
+0

ने पहले ही यह कोशिश की है लेकिन यह व्यवहार को नहीं बदलेगा। मुझे PHP में 'data = {"type": "my_type", "टिप्पणी": "टिप्पणी की गई"} प्राप्त होती है, लेकिन '$ _POST' खाली है। क्या मुझे 'स्ट्रिंग' से बचना है? कैसे? – Simon

+1

एक चीज जो आप कर सकते हैं वह है अपने सामग्री-प्रकार शीर्षलेख को उस के साथ प्रतिस्थापित करें: x.setRequestHeader ("सामग्री-प्रकार", "एप्लिकेशन/एक्स-www-form-urlencoded") – artragis

+0

धन्यवाद! वह काम किया! मुझे बहुत परेशान लगता है। लेकिन अगर यह एकमात्र तरीका है तो मैं इसे ऐसा करूंगा। – Simon

5

पीएचपी JSON अनुरोध को अपने आप पर कार्रवाई नहीं कर रहा है जैसे कि यह प्रपत्र एन्कोड या बहुखण्डीय अनुरोध के साथ करता है। यदि आप PHP को अनुरोध भेजने के लिए JSON का उपयोग करना चाहते हैं, तो आप मूल रूप से file_get_contents() के साथ इसे सही तरीके से कर रहे हैं। यदि आप उन वैरिएबल को अपनी वैश्विक $ _POST ऑब्जेक्ट में मर्ज करना चाहते हैं, तो भी आप ऐसा करने की अनुशंसा नहीं करेंगे क्योंकि यह अन्य डेवलपर्स को भ्रमित कर सकता है।

// it's safe to overwrite the $_POST if the content-type is application/json 
// because the $_POST var will be empty 
$headers = getallheaders(); 
if ($headers["Content-Type"] == "application/json") 
    $_POST = json_decode(file_get_contents("php://input"), true) ?: []; 

त्वरित नोट: आपको एप्लिकेशन/जेसन के लिए अपनी सामग्री-प्रकार के साथ एक वर्णमाला नहीं भेजना चाहिए। यह केवल पाठ/* सामग्री-प्रकार के साथ भेजा जाना चाहिए।