2017-11-20 36 views
5

Yêu cầu GET của Ajax đang hoạt động đúng cách. Nhưng tôi phải sử dụng POST vì tôi dự kiến ​​gửi một lượng dữ liệu lớn hơn, quá nhiều cho GET.AJAX, GET ok, POST không

Môi trường: Apache 2, Debian 9 (từ đầu), jQuery 3.2.1, không có gì đặc biệt.

Tôi rút gọn vấn đề của tôi để mã này:

KHÁCH HÀNG

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 
<html lang="de"> 
    <head> 
    <meta http-equiv="content-type" content="text/html; charset=utf-8"> 
    <title>Ajaxtest</title> 
    <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script> 
</head> 
<body> 
    <script language="JavaScript"> 
    <!-- 
    $.ajax({ 
     url: 'ajaxtest2.php', 
     dataType: 'json', 
     contentType: 'application/json; charset=utf-8', 
     type: 'POST', 
     data: {testdata: 'here I am'}, 
     success: function (resp) { 
      console.log(resp); 
     }, 
    }); 
    --> 
    </script> 
</body> 
</html> 

MÁY CHỦ

<?php 
ini_set('error_reporting', E_ERROR); 
header('Content-type: application/json'); 
header('HTTP/1.1 200 OK'); 
print json_encode(
    array(
     'method'=>$_SERVER['REQUEST_METHOD'], 
     'get'=>$_GET['testdata'], 
     'post'=>$_POST['testdata']) 
    ); 
exit(); 
?> 

Khi gửi các cuộc gọi ajax qua GET Tôi chỉ thay đổi

type: 'POST' 

để

type: 'GET' 

nào mang lại cho tôi kết quả này trên giao diện điều khiển:

{method: "GET", get: "here I am", post: null}

Đây là những gì bạn mong đợi.

Nhưng khi gọi qua POST tôi nhận được:

{method: "POST", get: null, post: null}

Máy chủ hiểu một yêu cầu POST nhưng không cung cấp bất kỳ giá trị.

tôi đã cố gắng cách khác nhau trong đó có mục tiêu url như cố vấn bởi một số với kết quả tương tự

url: 'ajaxtest2.php' 
url: './ajaxtest2.php' 
url: './ajaxtest2.php/' 

Tất cả họ đều làm cho không có sự khác biệt: $ _POST ở lại trống rỗng.

Ngoài ra tôi đăng nhập get_defined_vars() trên máy chủ, nhưng $ _POST ở lại trống rỗng và không có dấu vết của 'ở đây tôi' bất cứ nơi nào trong các biến đổ.

Không có .htaccess trộn lẫn với ghi đè url hoặc tương tự.

Tôi còn có thể làm gì khác?

+0

gì * trình duyệt của bạn * nói nó gửi (trên tab mạng). –

+1

Để kiểm tra, hãy bình luận ra 'contentType: 'application/json; charset = utf-8'' và thử lại bài kiểm tra POST. – IncredibleHat

+0

Đầu ra '$ _REQUEST ['testdata']' trong php là gì? – skobaljic

Trả lời

1

Câu trả lời dài cho nhận xét của tôi mà làm việc, là thusly:

Bạn đang cố gắng để gửi dữ liệu đến máy chủ bằng cách sử dụng contentType của:

application/json; charset=utf-8 

Thay vì mặc định và chuẩn mực cho việc gửi POST dữ liệu:

application/x-www-form-urlencoded; charset=UTF-8 

Khi máy chủ kết thúc, nó không lấy nội dungLoại bài đăng biểu mẫu, mà là application/json. Điều này có nghĩa là không có dữ liệu nào được đưa vào biến $ _POST để sử dụng php.

TẢI là một câu chuyện khác, vì dữ liệu đó đang chạy trong URL, không có trong nội dung.

Loại mã hóa phải luôn là utf-8 cho các cuộc gọi ajax, do đó cũng không phải là vấn đề.

Bạn thường không muốn gửi dữ liệu json tới máy chủ như thế. Nó chỉ thích hợp nếu bạn đang gửi dữ liệu đến một ứng dụng đang chờ dữ liệu json thô mà nó đang phân tích cú pháp khi chấp nhận. Đối với máy chủ PHP, nó muốn 'dữ liệu biểu mẫu' (nếu không bạn cần phải đọc php://input, hãy xem url tham chiếu dưới đây).

Hy vọng rằng sẽ giúp làm sáng tỏ sự nhầm lẫn.

Một số thông tin thêm: http://api.jquery.com/jquery.ajax/ (các thông tin contentType) https://forum.jquery.com/topic/ajax-with-contenttype-application-json (bài cuối cùng là hữu ích)