Trả về JSON bằng cách sử dụng Joomla Framework


11

Tôi đã bắt đầu xây dựng một ứng dụng web bằng cách sử dụng Joomla Framework . Nó bao gồm một trang web đơn giản sẽ được hiển thị trong iFrame cùng với API sẽ được sử dụng để cập nhật nội dung với AJAX.

Tôi đã theo dõi Bắt đầu với Trình soạn nhạc và Joomla! bài viết và có ứng dụng Framework và chạy. Tôi đã tùy chỉnh đầu ra HTML mặc định để hoạt động cho iFrame của mình và đã bắt đầu với API. Tôi đã sử dụng Tin tức làm mẫu và tạo bộ điều khiển, mô hình, bảng và chế độ xem cho API của mình, tất cả đều hoạt động tốt. Sau đó, tôi đã tạo một mẫu Twig rất đơn giản trả về biểu diễn JSON của dữ liệu của tôi như thế này:

{{ items|json_encode|raw }}

Cho đến nay rất tốt nhưng tôi nhận được tiêu đề này được trả về, điều này sẽ gây ra vấn đề khi sử dụng AJAX với jQuery:

Content-Type:text/html; charset=utf-8

Tôi nghĩ rằng nó sẽ là một trường hợp đơn giản để thêm cái này nhưng cho dù tôi đặt nó ở đâu, nó không thay đổi tiêu đề được trả về:

$this->app->setHeader('Content-Type', 'application/json', true);

Tôi biết rằng setHeader đang hoạt động như thể tôi thay đổi tên, tôi thấy tiêu đề mới được trả về nên tôi cho rằng nó sẽ bị ghi đè sau đó trong quá trình thực thi.

Vì vậy, câu hỏi của tôi là, tôi đang đi về điều này đúng cách? Chế độ xem của tôi mở rộng DefaultHtmlView mà cảm thấy sai, tôi có nên tạo DefaultJsonView không? Làm cách nào tôi có thể đặt Loại nội dung chính xác hoặc có cách tiếp cận tốt hơn để trả về JSON?

Bất kỳ trợ giúp tư vấn nào có thể được cung cấp về cách tốt nhất để sử dụng Joomla Framework để xây dựng API sẽ được đánh giá rất cao.

Câu trả lời:


6

Cuối cùng tôi đã tìm thấy những gì dường như là cách "chính xác" để làm điều này. Ngay cả khi tôi đã sử dụng sendHeaders, Kiểu nội dung bổ sung đã được thêm vào và nó đã được trả lại khi nó được thêm vào sau đó.

Tôi đã làm theo mã và AbstractWebApplication.php đặt các tiêu đề với dòng này:

// Send the content-type header.
$this->setHeader('Content-Type', $this->mimeType . '; charset=' . $this->charSet);

Vì vậy, tôi đã có thể xác định mimeType của riêng mình bằng cách sử dụng mã này trong mã của mình:

$this->app->mimeType = 'application/json';

Bây giờ tiêu đề chính xác được trả về và jQuery hiểu đầu ra là JSON!


3

Đã đào một ít nhưng tôi thấy vấn đề

https://github.com/j Joomla-framework/application/blob/master/src/ Ab khu vực web

Nếu bạn nhìn vào hàm setHeader, nó chưa thực sự đặt tiêu đề, nó chỉ làm cho nó "sẵn sàng"

Vì vậy, những gì bạn cần làm là đơn giản

$this->app->setHeader('Content-Type', 'application/json', true)->sendHeaders();

Chức năng bổ sung sendHeaders()có thể được kết nối để cho phép bạn đặt các tiêu đề, không chỉ "chuẩn bị" chúng.

Với nhiều khả năng sử dụng exit;để ngăn chặn bất kỳ sự thực thi và xuất thêm nào nữa, hàm sendHeaders rất có thể không chạy.


Cảm ơn đề nghị của bạn. Thật không may, ngay cả tại sao tôi sử dụng sendHeaders, Content-Type vẫn bắt đầu bị ghi đè. Tôi đã thử sử dụng exit nhưng sau đó tôi không nhận được kết quả nào vì mẫu không được hiển thị. Tôi tìm thấy một giải pháp mà tôi đã đăng như một câu trả lời.
Joe P

Vâng, tôi sẽ thêm một giải pháp khác, để tôi làm việc tốt cho bất cứ ai có thể cần nó. Nếu bạn sử dụng exitnó sẽ ngăn không cho bất cứ thứ gì khác chạy và chỉ xuất nó như hiện tại. Câu trả lời của bạn có vẻ tốt hơn rất nhiều mặc dù.
Jordan Ramstad
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.