2011-01-25 36 views
6

Tôi gặp vấn đề lạ khi tôi đang cố viết một trang PHP trả về một số JSON cho một cuộc gọi Jquery AJAX. Vấn đề là mặc dù thiết lập kiểu nội dung cho ứng dụng/json, phản hồi luôn có vẻ bao gồm tiêu đề HTML.Phản hồi JSON PHP chứa tiêu đề HTML

Dưới đây là đoạn code PHP:

// some code that generates an array 
header("Content-type: application/json"); 
echo json_encode($return); 

Sau đó, trong Javascript:

$.ajax({ 
     url: '/VAPHP/services/datatable.php', 
     dataType: 'json', 
     data: 
      { 
       type: 'invoices' 
      }, 
     success: function(data) 
     { 
      // show a message saying it's been sent! 
      alert('Success!'); 
     }, 
     error: function(XMLHttpRequest, textStatus, errorThrown) { 
      alert('Error!'); 
     } 


    }); 

Câu trả lời luôn luôn có vẻ là một cái gì đó như thế này:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN"> 
<html> 
<head> 
<title></title> 
</head> 
<body> 
{"aaData":[["2007-08-01","91109507","Invoice","10.000000","AUD"],["2007-08-02","91110103","Invoice","5.000000","AUD"],["2007-08-02","91110122","Invoice","305.000000","AUD"],["2007-08-02","91110129","Invoice","320.000000","AUD"],["2007-08-03","91111146","Credit 
for Returns","10.000000","AUD"],["2007-08-06","91111895","Credit 
for Returns","320.000000","AUD"],["2007-09-03","91128486","Credit 
Memo","5.000000","AUD"],["2007-09-03","91128487","Credit 
etc, etc 

Và theo tiêu đề phản ứng nó chắc chắn nghĩ rằng đó là JSON:

HTTP/1.1 200 OK 
Content-Type: application/json 
Server: Microsoft-IIS/7.5 
X-Powered-By: PHP/5.3.3 

Bất cứ khi nào tôi chạy mã và cảnh báo "Lỗi!" bị sa thải mỗi lần, điều này có thể hiểu được ... Bất kỳ ai cũng có bất kỳ ý tưởng nào về lý do HTML được đưa vào phản hồi?

+2

Bạn kiểm tra phản hồi bằng cách nào? –

+4

Có lẽ ứng dụng của bạn làm điều đó ở nơi khác và vì bạn đã kích hoạt bộ đệm đầu ra, bạn không nhận được lỗi 'tiêu đề đã gửi'. – Mchl

+1

Bạn đang sử dụng một khung công tác hay nó là một tệp PHP độc lập? –

Trả lời

2

Ok, tôi đã tìm thấy câu trả lời của riêng mình, có vẻ như tôi đã bật tidyhtml trong PHP của mình.tệp ini và có một số

ob_start("ob_tidyhandler"); 

bên trong một trong các gói toàn cầu của tôi. Nhận xét rằng ra và tất cả hoạt động tốt. Cảm ơn thời gian của bạn tất cả mọi người!

0

Bạn đã thử nhận xét toàn bộ "tiêu đề (...)" - một phần? Nó sẽ hoạt động mà không có nó. Cuộc gọi AJAX nhận tất cả các kết quả đầu ra của chương trình PHP, trong trường hợp này bao gồm cả tiêu đề.

+0

Chỉ có sự khác biệt tiêu đề này: HTTP/1.1 200 OK Nội dung dài: 3464 Loại nội dung: văn bản/html Máy chủ: Microsoft-IIS/7.5 X-Powered-By: PHP/5.3.3 – hellboy1975

+0

Nếu firebug cho thấy dữ liệu đến từ máy chủ có tiêu đề HTML, và đó là toàn bộ tệp PHP của bạn, nó là một trong 2 hàm sản xuất tiêu đề HTML. Bạn đã thử với một tệp JSON-giả tĩnh ở phía máy chủ chưa? Bạn đang gửi 100% dữ liệu nào? – Marcus

+0

Bỏ qua điều đó - Tôi không nên mã muộn vào ban đêm! – hellboy1975

0

Tôi cảm thấy ai đó mã của bạn đang phát HTML DTD và phần đầu tự động cho tất cả các phản hồi từ codebase php. Bạn đang sử dụng một khuôn khổ? Nếu vậy thì cái nào ? Thực tế là công việc json.txt chỉ ra rằng các thông báo không đúng với js, trình duyệt hoặc bất kỳ proxy nào ở giữa.

Tôi đề nghị bạn gỡ lỗi luồng mã php để xem phần này đang được thêm vào phản hồi html.

5

Gọi header() thực sự không liên quan gì đến việc mã HTML được trả lại trong phản hồi.

header() được sử dụng để đặt tiêu đề HTTP, trong khi mã HTML (<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN">) được gửi trong số nội dung phản hồi HTTP.

Vì vậy, các dòng mã

header("Content-type: application/json"); 

làm công việc của mình một cách chính xác bởi vì phản ứng chứa đúng kiểu nội dung:

Content-Type: application/json 

Vì vậy, có chuyện gì vậy? Có thể bạn có mã được thực hiện trước mã liên quan đến json. Bạn chỉ nên gửi tin nhắn được mã hóa json trong phản hồi của bạn mà không cần bất kỳ thẻ HTML nào và chấm dứt tập lệnh bằng cách sử dụng exit hoặc die. Hãy thử xác định mã gửi thẻ HTML và đặt mã của bạn trước.

+0

Làm thế nào để viết nó trong mã của tệp php? – Gank

+0

Đây là những gì tôi đã sai trên tập tin php của tôi. Tôi đã có một thẻ doctype trước khi kịch bản php ban đầu gửi lại dữ liệu json. Hãy chắc chắn để đặt tất cả các thẻ html dưới php script sẽ xác định nếu bạn sẽ được gửi dữ liệu ra hoặc xuất html dưới đây để thay thế. – OzzyTheGiant

0

Có thể có gì đó đã đăng tiêu đề trước khi bạn thực hiện. Bạn có thể cung cấp thêm mã php cho điều này không? Hãy nhớ rằng một không gian màu trắng bên ngoài các thẻ php buộc đầu ra của các tiêu đề (http theo mặc định).

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