Chcę zwrócić JSON ze skryptu PHP.
Czy po prostu odbijam wynik? Czy muszę ustawić Content-Type
nagłówek?
Chcę zwrócić JSON ze skryptu PHP.
Czy po prostu odbijam wynik? Czy muszę ustawić Content-Type
nagłówek?
Odpowiedzi:
Chociaż bez niego zwykle nic ci nie jest, możesz i powinieneś ustawić nagłówek Content-Type:
<?PHP
$data = /** whatever you're serializing **/;
header('Content-Type: application/json');
echo json_encode($data);
Jeśli nie używam określonego frameworka, zazwyczaj pozwalam niektórym parametrom żądania modyfikować zachowanie wyjściowe. Przydatne może być, na ogół, szybkie rozwiązywanie problemów, aby nie wysyłać nagłówka, a czasem print_r ładunku danych, aby go zobaczyć (choć w większości przypadków nie powinno to być konieczne).
header('Content-type:application/json;charset=utf-8');
Kompletny kawałek ładnego i przejrzystego kodu PHP zwracającego JSON to:
$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 );
Zgodnie z instrukcją dotyczącąjson_encode
metody może zwrócić ciąg nieciągowy ( false ):
Zwraca ciąg zakodowany w JSON w przypadku powodzenia lub
FALSE
niepowodzenia.
Kiedy tak się echo json_encode($data)
stanie, wyświetli pusty ciąg znaków, który jest niepoprawny JSON .
json_encode
na przykład zawiedzie (i zwróci false
), jeśli jego argument zawiera łańcuch inny niż UTF-8.
Ten warunek błędu powinien zostać przechwycony w PHP, na przykład tak:
<?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;
?>
Następnie koniec odbierający powinien oczywiście mieć świadomość, że obecność właściwości jsonError wskazuje na warunek błędu, który należy odpowiednio traktować.
W trybie produkcyjnym lepiej byłoby wysłać klientowi tylko ogólny status błędu i zapisać bardziej szczegółowe komunikaty o błędach w celu późniejszego zbadania.
Przeczytaj więcej o radzeniu sobie z błędami JSON w Dokumentacji PHP .
charset
parametru dla JSON; patrz uwaga na końcu tools.ietf.org/html/rfc8259#section-11 : „Dla tej rejestracji nie zdefiniowano parametru„ charset ”. Dodanie jednego naprawdę nie ma wpływu na zgodnych odbiorców”. (JSON musi być przesyłany jako UTF-8 na tools.ietf.org/html/rfc8259#section-8.1 , więc określenie, że jest zakodowane jako UTF-8, jest nieco zbędne.)
charset
parametr usunięty z ciągu nagłówka HTTP.
Spróbuj json_encode, aby zakodować dane i ustawić typ zawartości za pomocą header('Content-type: application/json');
.
Dobrze jest również ustawić bezpieczeństwo dostępu - wystarczy zastąpić * domeną, do której chcesz uzyskać dostę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);
?>
Oto więcej przykładów na ten temat : jak ominąć Access-Control-Allow-Origin?
Jak powiedziano powyżej:
header('Content-Type: application/json');
wykona pracę. ale pamiętaj, że:
Ajax nie będzie miał problemu z odczytaniem jsona, nawet jeśli ten nagłówek nie zostanie użyty, chyba że twój json zawiera pewne tagi HTML. W takim przypadku musisz ustawić nagłówek jako application / json.
Upewnij się, że plik nie jest zakodowany w UTF8-BOM. Ten format dodaje znak na początku pliku, więc wywołanie header () zakończy się niepowodzeniem.
Prosta funkcja zwracająca odpowiedź JSON z kodem stanu 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
, i jawne ustawienie odpowiedzi http jest dobrym pomysłem; chociaż ustawienie statusu, a następnie odpowiedź http_ wydaje się zbędna. Może też chcesz dodać exit
instrukcję na końcu. Połączyłem twoją funkcję z @trincot's: stackoverflow.com/a/35391449/339440
Odpowiedź na twoje pytanie jest tutaj ,
To mówi.
Media typu MIME dla tekstu JSON to application / json.
więc jeśli ustawisz nagłówek na ten typ i wypiszesz swój ciąg JSON, powinien on działać.
Tak, musisz użyć echa, aby wyświetlić dane wyjściowe. Mimetype: application / json
Jeśli potrzebujesz dostać jsona z php wysyłającego niestandardowe informacje, możesz dodać to header('Content-Type: application/json');
wcześniej, aby wydrukować coś innego, więc możesz wydrukować ci klientaecho '{"monto": "'.$monto[0]->valor.'","moneda":"'.$moneda[0]->nombre.'","simbolo":"'.$moneda[0]->simbolo.'"}';
Jeśli przeszukujesz bazę danych i potrzebujesz zestawu wyników w formacie JSON, możesz to zrobić w następujący sposób:
<?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);
?>
Aby uzyskać pomoc w analizowaniu wyniku za pomocą jQuery, zapoznaj się z tym samouczkiem .
Jest to prosty skrypt PHP zwracający męską kobietę i identyfikator użytkownika, ponieważ wartość json będzie dowolną wartością losową, gdy wywołasz skrypt json.php.
Mam nadzieję, że dzięki tej pomocy
<?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;
?>
Prostym sposobem sformatowania obiektów domeny w JSON jest użycie Marshal Serializer . Następnie przekaż dane json_encode
i wyślij odpowiedni nagłówek Content-Type do swoich potrzeb. Jeśli używasz frameworka takiego jak Symfony, nie musisz ręcznie ustawiać nagłówków. Tam możesz użyć JsonResponse .
Na przykład poprawnym typem treści do obsługi JavaScript byłby application/javascript
.
Lub jeśli potrzebujesz obsługi kilku dość starych przeglądarek, najbezpieczniejszym byłoby text/javascript
.
Do wszystkich innych celów, takich jak korzystanie z aplikacji mobilnej application/json
jako Content-Type.
Oto mały przykład:
<?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);
Ilekroć próbujesz zwrócić odpowiedź JSON dla interfejsu API lub upewnij się, że masz odpowiednie nagłówki, a także upewnij się, że zwracasz prawidłowe dane JSON.
Oto przykładowy skrypt, który pomaga zwrócić odpowiedź JSON z tablicy PHP lub z pliku JSON.
Skrypt PHP (kod):
<?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);
Plik 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}}"
}
]
}
JSON Screeshot:
Możesz użyć tej małej biblioteki PHP . Wysyła nagłówki i daje obiekt do łatwego użycia.
To wygląda jak :
<?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();
?>