Я пытаюсь отправить объект JSON из Javascript / Jquery в PHP, и я получаю сообщение и сообщение об ошибке в моей консоли. Что я делаю не так. Я новичок в JS и PHP.
Файл JQuery:
$(document).ready(function() { var flickr = {'action': 'Flickr', 'get':'getPublicPhotos'}; // console.log(typeof(flickr)); var makeFlickrCall = function(flickrObj){ $.ajax({ url: '../phpincl/apiConnect.php', type: 'POST', data: flickrObj }) .done(function(data) { console.log("success"); console.log(JSON.stringify(data)); }) .fail(function() { console.log("error"); }) .always(function() { console.log("complete"); }); }; makeFlickrCall(flickr); });
Файл PHP
<?php $obj = $_POST['data']; // print_r($obj); return $obj; ?>
Отличный ответ Фила, однако, поскольку название OP говорит
отправить json-объект из javascript ( не jQuery ) в php
это как сделать это с (ванильным) javascript, в случае, если это поможет кому-то искать этот метод:
var jsondata; var flickr = {'action': 'Flickr', 'get':'getPublicPhotos'}; var data = JSON.stringify(flickr); var xhr = new XMLHttpRequest(); xhr.open("POST", "../phpincl/apiConnect.php", !0); xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8"); xhr.send(data); xhr.onreadystatechange = function () { if (xhr.readyState === 4 && xhr.status === 200) { // in case we reply back from server jsondata = JSON.parse(xhr.responseText); console.log(jsondata); } }
Обратите внимание, что нам все равно нужно преобразовать ответ сервера в объект javascript, используя JSON.parse()
Теперь, на стороне сервера (на основе ответа Фила), если вы отправляете ответ клиенту, вы можете сделать следующее:
header('Content-type: application/json'); $json = file_get_contents('php://input'); $json_decode = json_decode($json, true); $json_encode = json_encode($json_decode); echo $json_encode;
ПРИМЕЧАНИЕ .
Причина декодирования сначала, а затем кодирование назад входного сигнала json заключается в том, чтобы должным образом избежать косой черты (возможно) URL-адресов внутри данных, например
json_encode
преобразует этот URL-адрес
http://example.com
в
http:\/\/example.com
… это не так в ОП, но полезно в некоторых других сценариях.
Стандартный метод jQuery .ajax()
использует свойство data
для создания строки x-www-form-urlencoded для передачи в тело запроса. Что-то вроде этого
action=Flickr&get=getPublicPhotos
Поэтому ваш PHP-скрипт не должен искать $_POST['data']
а вместо этого $_POST['action']
и $_POST['get']
.
Если вы хотите отправить сырую информацию JSON-данных в PHP, сделайте следующее …
Задайте параметр AJAX contentType
для application/json
и отправьте стробированную версию вашего объекта JSON в качестве полезной нагрузки data
, например
$.ajax({ url: '../phpincl/apiConnect.php', type: 'POST', contentType: 'application/json', data: JSON.stringify(flickrObj), dataType: 'json' })
Затем ваш PHP-скрипт будет считывать полезную нагрузку данных из потока php://input
, например
$json = file_get_contents('php://input');
Затем вы можете проанализировать это в PHP-объекте или массиве …
$dataObject = json_decode($json); $dataArray = json_decode($json, true);
И, если вы просто хотите отозвать его обратно клиенту.
header('Content-type: application/json'); // unmodified echo $json; // or if you've made changes to say $dataArray echo json_encode($dataArray);
Использование:
makeFlickrCall( { data: JSON.stringify( flickr )} );
Вместо
makeFlickrCall(flickr);
Ваш скрипт на стороне сервера должен получить ваш JSON следующим образом:
data="{"action":"Flickr","get":"getPublicPhotos"}"