Tôi muốn trả về JSON từ một tập lệnh PHP.
Tôi chỉ lặp lại kết quả? Tôi có phải đặt Content-Type
tiêu đề không?
Tôi muốn trả về JSON từ một tập lệnh PHP.
Tôi chỉ lặp lại kết quả? Tôi có phải đặt Content-Type
tiêu đề không?
Câu trả lời:
Mặc dù bạn thường ổn nếu không có nó, bạn có thể và nên đặt tiêu đề Kiểu nội dung:
<?PHP
$data = /** whatever you're serializing **/;
header('Content-Type: application/json');
echo json_encode($data);
Nếu tôi không sử dụng một khung cụ thể, tôi thường cho phép một số thông số yêu cầu sửa đổi hành vi đầu ra. Nói chung, nó có thể hữu ích để xử lý sự cố nhanh chóng, không gửi tiêu đề hoặc đôi khi print_r tải trọng dữ liệu đến nhãn cầu (mặc dù trong hầu hết các trường hợp, không cần thiết).
header('Content-type:application/json;charset=utf-8');
Một đoạn hoàn chỉnh của mã PHP đẹp và rõ ràng trả về JSON là:
$option = $_GET['option'];
if ( $option == 1 ) {
$data = [ 'a', 'b', 'c' ];
// will encode to JSON array: ["a","b","c"]
// accessed as example in JavaScript like: result[1] (returns "b")
} else {
$data = [ 'name' => 'God', 'age' => -1 ];
// will encode to JSON object: {"name":"God","age":-1}
// accessed as example in JavaScript like: result.name or result['name'] (returns "God")
}
header('Content-type: application/json');
echo json_encode( $data );
Theo hướng dẫn trênjson_encode
phương thức có thể trả về một chuỗi không ( false ):
Trả về chuỗi được mã hóa JSON khi thành công hoặc
FALSE
thất bại.
Khi điều này xảy ra echo json_encode($data)
sẽ xuất ra chuỗi rỗng, đó là JSON không hợp lệ .
json_encode
chẳng hạn sẽ thất bại (và trả về false
) nếu đối số của nó chứa chuỗi không UTF-8.
Điều kiện lỗi này cần được ghi lại trong PHP, ví dụ như thế này:
<?php
header("Content-Type: application/json");
// Collect what you need in the $data variable.
$json = json_encode($data);
if ($json === false) {
// Avoid echo of empty string (which is invalid JSON), and
// JSONify the error message instead:
$json = json_encode(["jsonError" => json_last_error_msg()]);
if ($json === false) {
// This should not happen, but we go all the way now:
$json = '{"jsonError":"unknown"}';
}
// Set HTTP response status code to: 500 - Internal Server Error
http_response_code(500);
}
echo $json;
?>
Sau đó, kết thúc nhận tất nhiên phải lưu ý rằng sự hiện diện của thuộc tính jsonError chỉ ra một điều kiện lỗi, cần xử lý theo đó.
Trong chế độ sản xuất, tốt hơn là chỉ gửi một trạng thái lỗi chung cho máy khách và ghi nhật ký các thông báo lỗi cụ thể hơn để điều tra sau.
Đọc thêm về cách xử lý các lỗi JSON trong Tài liệu của PHP .
charset
tham số nào cho JSON; xem ghi chú ở cuối công cụ.ietf.org/html/rfc8259#section-11 : "Không có tham số" ký tự "được xác định cho đăng ký này. Thêm một tham số thực sự không có tác dụng đối với người nhận tuân thủ." (JSON phải được truyền dưới dạng UTF-8 trên mỗi công cụ.ietf.org / html / rfc8259#section-8.1 , vì vậy, chỉ định rằng nó được mã hóa dưới dạng UTF-8 là một chút dư thừa.)
charset
Tham số dự phòng được loại bỏ khỏi chuỗi tiêu đề HTTP.
Hãy thử json_encode để mã hóa dữ liệu và đặt loại nội dung với header('Content-type: application/json');
.
Cũng tốt khi đặt bảo mật truy cập - chỉ cần thay thế * bằng tên miền bạn muốn có thể truy cập.
<?php
header('Access-Control-Allow-Origin: *');
header('Content-type: application/json');
$response = array();
$response[0] = array(
'id' => '1',
'value1'=> 'value1',
'value2'=> 'value2'
);
echo json_encode($response);
?>
Dưới đây là nhiều mẫu hơn về điều đó: làm thế nào để bỏ qua Access-Control-Allow-Origin?
<?php
$data = /** whatever you're serializing **/;
header("Content-type: application/json; charset=utf-8");
echo json_encode($data);
?>
Như đã nói ở trên:
header('Content-Type: application/json');
sẽ làm cho công việc. nhưng hãy nhớ rằng:
Ajax sẽ không gặp vấn đề gì khi đọc json ngay cả khi tiêu đề này không được sử dụng, ngoại trừ nếu json của bạn có chứa một số thẻ HTML. Trong trường hợp này, bạn cần đặt tiêu đề là application / json.
Đảm bảo tệp của bạn không được mã hóa trong UTF8-BOM. Định dạng này thêm một ký tự ở đầu tệp, vì vậy cuộc gọi tiêu đề () của bạn sẽ thất bại.
Một hàm đơn giản để trả về phản hồi JSON với mã trạng thái HTTP .
function json_response($data=null, $httpStatus=200)
{
header_remove();
header("Content-Type: application/json");
http_response_code($httpStatus);
echo json_encode($data);
exit();
}
header_remove
và thiết lập rõ ràng phản hồi http là một ý tưởng tốt; mặc dù thiết lập trạng thái và sau đó http_response có vẻ dư thừa. Cũng có thể muốn thêm một exit
tuyên bố vào cuối. Tôi đã kết hợp chức năng của bạn với @trincot 's: stackoverflow.com/a353391449/339440
Vâng, bạn sẽ cần sử dụng echo để hiển thị đầu ra. Mimetype: ứng dụng / json
Nếu bạn cần lấy json từ php gửi thông tin tùy chỉnh, bạn có thể thêm thông tin này header('Content-Type: application/json');
trước để in bất kỳ thứ gì khác, vì vậy sau đó bạn có thể in cho bạn tùy ýecho '{"monto": "'.$monto[0]->valor.'","moneda":"'.$moneda[0]->nombre.'","simbolo":"'.$moneda[0]->simbolo.'"}';
Nếu bạn truy vấn cơ sở dữ liệu và cần tập kết quả ở định dạng JSON thì có thể thực hiện như sau:
<?php
$db = mysqli_connect("localhost","root","","mylogs");
//MSG
$query = "SELECT * FROM logs LIMIT 20";
$result = mysqli_query($db, $query);
//Add all records to an array
$rows = array();
while($row = $result->fetch_array()){
$rows[] = $row;
}
//Return result to jTable
$qryResult = array();
$qryResult['logs'] = $rows;
echo json_encode($qryResult);
mysqli_close($db);
?>
Để được trợ giúp trong việc phân tích kết quả bằng jQuery, hãy xem hướng dẫn này .
Đây là một tập lệnh PHP đơn giản để trả về nam nữ và id người dùng vì giá trị json sẽ là bất kỳ giá trị ngẫu nhiên nào khi bạn gọi tập lệnh json.php.
Mong sự giúp đỡ này
<?php
header("Content-type: application/json");
$myObj=new \stdClass();
$myObj->user_id = rand(0, 10);
$myObj->male = rand(0, 5);
$myObj->female = rand(0, 5);
$myJSON = json_encode($myObj);
echo $myJSON;
?>
Một cách dễ dàng để định dạng các đối tượng miền của bạn thành JSON là sử dụng Trình tuần tự Marshal . Sau đó chuyển dữ liệu đến json_encode
và gửi tiêu đề Kiểu nội dung chính xác cho nhu cầu của bạn. Nếu bạn đang sử dụng một khung như Symfony, bạn không cần phải chăm sóc cài đặt các tiêu đề theo cách thủ công. Ở đó bạn có thể sử dụng JsonResponse .
Ví dụ: Kiểu nội dung chính xác để xử lý Javascript sẽ là application/javascript
.
Hoặc nếu bạn cần hỗ trợ một số trình duyệt cũ, an toàn nhất sẽ là text/javascript
.
Đối với tất cả các mục đích khác như ứng dụng dành cho thiết bị di động, hãy sử dụng application/json
làm Kiểu nội dung.
Đây là một ví dụ nhỏ:
<?php
...
$userCollection = [$user1, $user2, $user3];
$data = Marshal::serializeCollectionCallable(function (User $user) {
return [
'username' => $user->getUsername(),
'email' => $user->getEmail(),
'birthday' => $user->getBirthday()->format('Y-m-d'),
'followers => count($user->getFollowers()),
];
}, $userCollection);
header('Content-Type: application/json');
echo json_encode($data);
Bất cứ khi nào bạn đang cố gắng trả lại phản hồi JSON cho API hoặc nếu không, hãy đảm bảo bạn có các tiêu đề phù hợp và cũng đảm bảo bạn trả về dữ liệu JSON hợp lệ.
Đây là tập lệnh mẫu giúp bạn trả về phản hồi JSON từ mảng PHP hoặc từ tệp JSON.
Tập lệnh PHP (Mã):
<?php
// Set required headers
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
/**
* Example: First
*
* Get JSON data from JSON file and retun as JSON response
*/
// Get JSON data from JSON file
$json = file_get_contents('response.json');
// Output, response
echo $json;
/** =. =.=. =.=. =.=. =.=. =.=. =.=. =.=. =.=. =.=. =. */
/**
* Example: Second
*
* Build JSON data from PHP array and retun as JSON response
*/
// Or build JSON data from array (PHP)
$json_var = [
'hashtag' => 'HealthMatters',
'id' => '072b3d65-9168-49fd-a1c1-a4700fc017e0',
'sentiment' => [
'negative' => 44,
'positive' => 56,
],
'total' => '3400',
'users' => [
[
'profile_image_url' => 'http://a2.twimg.com/profile_images/1285770264/PGP_normal.jpg',
'screen_name' => 'rayalrumbel',
'text' => 'Tweet (A), #HealthMatters because life is cool :) We love this life and want to spend more.',
'timestamp' => '{{$timestamp}}',
],
[
'profile_image_url' => 'http://a2.twimg.com/profile_images/1285770264/PGP_normal.jpg',
'screen_name' => 'mikedingdong',
'text' => 'Tweet (B), #HealthMatters because life is cool :) We love this life and want to spend more.',
'timestamp' => '{{$timestamp}}',
],
[
'profile_image_url' => 'http://a2.twimg.com/profile_images/1285770264/PGP_normal.jpg',
'screen_name' => 'ScottMili',
'text' => 'Tweet (C), #HealthMatters because life is cool :) We love this life and want to spend more.',
'timestamp' => '{{$timestamp}}',
],
[
'profile_image_url' => 'http://a2.twimg.com/profile_images/1285770264/PGP_normal.jpg',
'screen_name' => 'yogibawa',
'text' => 'Tweet (D), #HealthMatters because life is cool :) We love this life and want to spend more.',
'timestamp' => '{{$timestamp}}',
],
],
];
// Output, response
echo json_encode($json_var);
Tệp JSON (JSON DATA):
{
"hashtag": "HealthMatters",
"id": "072b3d65-9168-49fd-a1c1-a4700fc017e0",
"sentiment": {
"negative": 44,
"positive": 56
},
"total": "3400",
"users": [
{
"profile_image_url": "http://a2.twimg.com/profile_images/1285770264/PGP_normal.jpg",
"screen_name": "rayalrumbel",
"text": "Tweet (A), #HealthMatters because life is cool :) We love this life and want to spend more.",
"timestamp": "{{$timestamp}}"
},
{
"profile_image_url": "http://a2.twimg.com/profile_images/1285770264/PGP_normal.jpg",
"screen_name": "mikedingdong",
"text": "Tweet (B), #HealthMatters because life is cool :) We love this life and want to spend more.",
"timestamp": "{{$timestamp}}"
},
{
"profile_image_url": "http://a2.twimg.com/profile_images/1285770264/PGP_normal.jpg",
"screen_name": "ScottMili",
"text": "Tweet (C), #HealthMatters because life is cool :) We love this life and want to spend more.",
"timestamp": "{{$timestamp}}"
},
{
"profile_image_url": "http://a2.twimg.com/profile_images/1285770264/PGP_normal.jpg",
"screen_name": "yogibawa",
"text": "Tweet (D), #HealthMatters because life is cool :) We love this life and want to spend more.",
"timestamp": "{{$timestamp}}"
}
]
}
Screeshot JSON:
Bạn có thể sử dụng cái này thư viện PHP nhỏ . Nó gửi các tiêu đề và cung cấp cho bạn một đối tượng để sử dụng nó một cách dễ dàng.
Nó có vẻ như :
<?php
// Include the json class
include('includes/json.php');
// Then create the PHP-Json Object to suits your needs
// Set a variable ; var name = {}
$Json = new json('var', 'name');
// Fire a callback ; callback({});
$Json = new json('callback', 'name');
// Just send a raw JSON ; {}
$Json = new json();
// Build data
$object = new stdClass();
$object->test = 'OK';
$arraytest = array('1','2','3');
$jsonOnly = '{"Hello" : "darling"}';
// Add some content
$Json->add('width', '565px');
$Json->add('You are logged IN');
$Json->add('An_Object', $object);
$Json->add("An_Array",$arraytest);
$Json->add("A_Json",$jsonOnly);
// Finally, send the JSON.
$Json->send();
?>