it-swarm-vi.com

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

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ài viết Bắt đầu với Composer và Joomla! và có Ứng dụng khung và chạy. Tôi đã tùy chỉnh đầu ra HTML mặc định để làm việc cho iFrame của tôi và đã bắt đầu 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 rất tốt. Sau đó, tôi đã tạo ra một đơn giản Twig 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ả lại sẽ gây ra sự cố 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 đưa ra về cách tốt nhất để sử dụng Joomla Framework để xây dựng API sẽ được đánh giá rất cao.

11
Joe P

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!

6
Joe P

Đã đà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 WebApplication.php

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();

Hàm 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 nào nữa và xuất ra JSON, hàm sendHeaders rất có thể không chạy.

3
Jordan Ramstad