ฉันต้องการส่งคืน JSON จากสคริปต์ PHP
ฉันแค่สะท้อนผลลัพธ์หรือไม่ ฉันต้องตั้งค่าContent-Type
ส่วนหัวหรือไม่?
ฉันต้องการส่งคืน JSON จากสคริปต์ PHP
ฉันแค่สะท้อนผลลัพธ์หรือไม่ ฉันต้องตั้งค่าContent-Type
ส่วนหัวหรือไม่?
คำตอบ:
แม้ว่าโดยปกติคุณจะใช้งานได้โดยที่ไม่มีมันคุณสามารถและควรตั้งส่วนหัวของประเภทเนื้อหา:
<?PHP
$data = /** whatever you're serializing **/;
header('Content-Type: application/json');
echo json_encode($data);
หากฉันไม่ได้ใช้เฟรมเวิร์กเฉพาะฉันมักจะอนุญาตให้พารามิเตอร์บางตัวร้องขอแก้ไขพฤติกรรมของเอาต์พุต มันอาจมีประโยชน์โดยทั่วไปสำหรับการแก้ไขปัญหาอย่างรวดเร็วไม่ส่งส่วนหัวหรือบางครั้งพิมพ์ข้อมูลเพื่อบรรจุลูกตา (แต่ในกรณีส่วนใหญ่ไม่ควรจำเป็น)
header('Content-type:application/json;charset=utf-8');
โค้ด PHP ที่ดีและชัดเจนที่ส่งคืน JSON คือ:
$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 );
ตามคู่มือในjson_encode
วิธีการที่สามารถส่งกลับไม่ใช่สตริง ( เท็จ ):
ส่งคืนสตริงที่เข้ารหัสของ JSON เมื่อสำเร็จหรือ
FALSE
ล้มเหลว
เมื่อเกิดเหตุการณ์นี้echo json_encode($data)
ออกจะสตริงที่ว่างเปล่าซึ่งเป็นJSON ที่ไม่ถูกต้อง
json_encode
จะเช่นล้มเหลว (และกลับfalse
) ถ้าอาร์กิวเมนต์มีสตริงที่ไม่ใช่ UTF-8
เงื่อนไขข้อผิดพลาดนี้ควรถูกบันทึกไว้ใน PHP เช่นนี้
<?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;
?>
แน่นอนว่าจุดสิ้นสุดการรับควรทราบว่าการปรากฏตัวของคุณสมบัติjsonErrorบ่งชี้ถึงข้อผิดพลาดซึ่งควรปฏิบัติตาม
ในโหมดการผลิตอาจเป็นการดีกว่าที่จะส่งเฉพาะสถานะข้อผิดพลาดทั่วไปไปยังไคลเอนต์และบันทึกข้อความแสดงข้อผิดพลาดเฉพาะสำหรับการตรวจสอบในภายหลัง
อ่านข้อมูลเพิ่มเติมเกี่ยวกับการจัดการกับข้อผิดพลาด JSON ในเอกสารของ PHP
charset
พารามิเตอร์สำหรับ JSON; ดูหมายเหตุที่ส่วนท้ายของtools.ietf.org/html/rfc8259#section-11 : "ไม่มีการกำหนดพารามิเตอร์ 'charset' สำหรับการลงทะเบียนนี้การเพิ่มเข้าจริงไม่มีผลกับผู้รับที่สอดคล้องกัน" (JSON จะต้องส่งตาม UTF-8 tools.ietf.org/html/rfc8259#section-8.1ดังนั้นการระบุว่ามันเข้ารหัสเป็น UTF-8 เป็นซ้ำซ้อนบิต.)
charset
พารามิเตอร์ที่ซ้ำซ้อนถูกลบออกจากสตริงส่วนหัว HTTP
ลองjson_encodeheader('Content-type: application/json');
การเข้ารหัสข้อมูลและการตั้งค่าชนิดเนื้อหาด้วย
ตั้งค่าประเภทเนื้อหาด้วยheader('Content-type: application/json');
แล้วสะท้อนข้อมูลของคุณ
นอกจากนี้ยังเป็นการดีที่จะตั้งค่าความปลอดภัยการเข้าถึง - เพียงแค่แทนที่ * ด้วยโดเมนที่คุณต้องการเข้าถึง
<?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);
?>
นี่คือตัวอย่างเพิ่มเติมเกี่ยวกับวิธีการหลีกเลี่ยง Access-Control-Allow-Origin
<?php
$data = /** whatever you're serializing **/;
header("Content-type: application/json; charset=utf-8");
echo json_encode($data);
?>
ดังกล่าวข้างต้น:
header('Content-Type: application/json');
จะทำให้งาน แต่โปรดจำไว้ว่า:
Ajax จะไม่มีปัญหาในการอ่าน json แม้ว่าส่วนหัวนี้จะไม่ได้ใช้ยกเว้นว่า json ของคุณมีแท็ก HTML บางส่วน ในกรณีนี้คุณต้องตั้งค่าส่วนหัวเป็น application / json
ตรวจสอบให้แน่ใจว่าไฟล์ของคุณไม่ได้เข้ารหัสใน UTF8-BOM รูปแบบนี้เพิ่มอักขระที่ด้านบนของไฟล์ดังนั้นการโทรส่วนหัว () ของคุณจะล้มเหลว
ฟังก์ชั่นที่ง่ายที่จะกลับมาตอบสนอง JSONกับรหัสสถานะ 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
และการตั้งค่าการตอบกลับ http อย่างชัดเจนเป็นความคิดที่ดี แม้ว่าการตั้งค่าสถานะแล้ว http_response ดูเหมือนซ้ำซ้อน อาจต้องการเพิ่มexit
คำสั่งไปยังจุดสิ้นสุด ฉันรวมฟังก์ชั่นของคุณกับ @trincot 's: stackoverflow.com/a/35391449/339440
คำตอบสำหรับคำถามของคุณ อยู่ที่นี่ ,
มันบอกว่า.
ชนิดสื่อ MIME สำหรับข้อความ JSON คือ application / json
ดังนั้นหากคุณตั้งค่าส่วนหัวเป็นประเภทนั้นและส่งออกสตริง JSON ของคุณมันควรจะทำงาน
ใช่คุณจะต้องใช้เสียงสะท้อนเพื่อแสดงผล Mimetype: application / json
หากคุณต้องการรับ json จาก php ส่งข้อมูลที่กำหนดเองคุณสามารถเพิ่มสิ่งนี้header('Content-Type: application/json');
ก่อนที่จะพิมพ์สิ่งอื่นใดดังนั้นจากนั้นคุณสามารถพิมพ์คุณ customeecho '{"monto": "'.$monto[0]->valor.'","moneda":"'.$moneda[0]->nombre.'","simbolo":"'.$moneda[0]->simbolo.'"}';
หากคุณสอบถามฐานข้อมูลและต้องการชุดผลลัพธ์ในรูปแบบ JSON สามารถทำได้ดังนี้:
<?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);
?>
สำหรับความช่วยเหลือในการวิเคราะห์ผลลัพธ์โดยใช้ jQuery ดูที่บทช่วยสอนนี้
นี่เป็นสคริปต์ PHP ง่าย ๆ ในการคืนค่าเพศหญิงและรหัสผู้ใช้เป็นค่า json จะเป็นค่าสุ่มใด ๆ เมื่อคุณเรียกใช้สคริปต์ json.php
หวังว่าความช่วยเหลือนี้ขอบคุณ
<?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;
?>
วิธีง่ายๆในการจัดรูปแบบวัตถุโดเมนของคุณ JSON คือการใช้จอมพล Serializer จากนั้นส่งผ่านข้อมูลไปยังjson_encode
และส่งส่วนหัวประเภทเนื้อหาที่ถูกต้องสำหรับความต้องการของคุณ หากคุณใช้เฟรมเวิร์กอย่าง Symfony คุณไม่จำเป็นต้องดูแลส่วนหัวด้วยตนเอง คุณสามารถใช้JsonResponse ได้ที่นั่นได้ที่นั่น
ตัวอย่างที่ถูกต้องเนื้อหาชนิดสำหรับการรับมือกับ Javascript application/javascript
จะเป็น
text/javascript
หรือถ้าคุณต้องการที่จะสนับสนุนเบราว์เซอร์เก่าสวยบางที่ปลอดภัยที่สุดที่จะเป็น
สำหรับวัตถุประสงค์อื่นทั้งหมดเช่นแอพมือถือใช้application/json
เป็นประเภทเนื้อหา
นี่คือตัวอย่างเล็ก ๆ :
<?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);
เมื่อใดก็ตามที่คุณพยายามส่งคืนการตอบสนองของ JSON สำหรับ API มิฉะนั้นให้แน่ใจว่าคุณมีส่วนหัวที่เหมาะสมและตรวจสอบให้แน่ใจว่าคุณส่งคืนข้อมูล JSON ที่ถูกต้อง
นี่คือสคริปต์ตัวอย่างที่ช่วยให้คุณส่งคืนการตอบสนอง JSON จากอาร์เรย์ PHP หรือจากไฟล์ JSON
PHP Script (รหัส):
<?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);
ไฟล์ JSON (ข้อมูล JSON):
{
"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}}"
}
]
}
JSON Screeshot:
คุณสามารถใช้ห้องสมุด PHP เล็ก ๆนี้ มันจะส่งส่วนหัวและมอบวัตถุให้คุณใช้อย่างง่ายดาย
ดูเหมือนว่า :
<?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();
?>