2012-03-01 42 views
6

Tôi đang cố gắng gửi dữ liệu JSON từ một biểu mẫu bằng cách sử dụng đối tượng XMLHttpRequest. Tôi có thể gửi dữ liệu bằng cách sử dụng chức năng sau. Không có lỗi nào được hiển thị trong FireBug và dữ liệu JSON trong yêu cầu được FireBug hiển thị tốt.Gửi dữ liệu JSON tới PHP bằng cách sử dụng XMLHttpRequest w/o jQuery

Tuy nhiên, tôi gửi dữ liệu đến echo.php, những gì chỉ đơn giản trả về nội dung:

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

Các POST-mảng luôn là trống rỗng, nhưng tôi có thể thấy chuỗi JSON được trả về bởi file_get_contents. Điều đó xảy ra như thế nào? Tôi đang làm gì sai?

sản lượng 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"} 

chức năng gửi:

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

'cảnh báo ('lỗi HTTP' + req.status);' ==> req không được xác định, ý của bạn có phải là 'x' thay thế không? –

Trả lời

7

Bạn quên đặt tên cho các biến của bạn trong send chức năng. Cách tốt để sử dụng nó là

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

Cho rằng, tôi nghĩ bạn sẽ phải thay đổi tiêu đề nội dung có độ dài. Tôi không nghĩ rằng nó là hữu ích để gửi nó.

Một việc khác bạn có thể làm là thử phương thức GET. Bạn cũng có thể cố gắng thay đổi tiêu đề content-type của bạn bằng một rằng:

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

đã thử điều này nhưng nó không thay đổi hành vi. Tôi nhận được 'data = {" type ":" my_type "," comment ":" comment "}' trong PHP, nhưng '$ _POST' trống. Tôi có phải thoát khỏi 'chuỗi' không? Làm sao? – Simon

+1

Một điều bạn có thể làm là thay thế tiêu đề loại nội dung của bạn bằng tiêu đề: x.setRequestHeader ("Loại nội dung", "ứng dụng/x-www-form-urlencoded") – artragis

+0

Cảm ơn! Điều đó đã hiệu quả! Có vẻ rất không vui với tôi. Nhưng nếu đó là cách duy nhất tôi sẽ làm như thế này. – Simon

5

PHP không xử lý yêu cầu JSON tự động như nó với yêu cầu hình thức mã hóa hoặc nhiều phần dữ liệu. Nếu bạn muốn sử dụng JSON để gửi các yêu cầu tới PHP, về cơ bản bạn sẽ làm đúng với file_get_contents(). Nếu bạn muốn kết hợp các biến đó vào đối tượng $ _POST toàn cầu của bạn, mặc dù tôi sẽ không khuyên bạn nên làm điều này vì nó có thể gây nhầm lẫn cho các nhà phát triển khác.

// 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) ?: []; 

Lưu ý nhanh: bạn không nên gửi bảng mã bằng Loại nội dung cho ứng dụng/json. Điều này chỉ được gửi với văn bản/* Loại nội dung.

Các vấn đề liên quan