Php post json отправка. PHP и формат передачи данных JSON. Создаем переменную из строки JSON
Из этого топика вы узнаете как отправить JavaScript функции, через JSON используя PHP (сама концепция может быть применена и для других языков).
PHP, начиная с версии 5.2.0, включает функции json_encode() и json_decode(). Эти функции кодируют данные в формат JSON и декодиуют JSON в ассоциативные массивы. В json_encode() не может быть закодирована функция. В ряде случаев это чертовски неудобно.
$foo = array(
"number" => 1,
"float" => 1.5,
"array" => array(1,2),
"string" => "bar" ,
"function" =>
);
// Теперь преобразуем массив в JSON
$json = json_encode($foo);
// Отдадим клиенту
echo $json; Результат {
"number" :1,
"float" :1.5,
"array" :,
"string" :"bar" ,
"function" :"function(){return \"foo bar\";}"
}
* This source code was highlighted with Source Code Highlighter .
Так как если не заключить определение функции в кавычки, т. е. не определить как строку, код не будет исполнятся. Так что в принципе jscon_encode() не годится для реализации этого функционала.
Решение$foo = array(
"number" => 1,
"float" => 1.5,
"array" => array(1,2),
"string" => "bar" ,
"function" => "function(){return "foo bar";}"
);
$value_arr = array();
$replace_keys = array();
foreach
($foo as
$key => &$value
){
// Проверяем значения на наличие определения функции
if
(strpos($value
, "function("
)===0){
// Запоминаем значение для послудующей замены.
$value_arr = $value
;
// Заменяем определение функции "уникальной" меткой..
$value
= "%"
. $key . "%"
;
// Запоминаем метку для послудующей замены.
$replace_keys = """
. $value
. """
;
}
}
// Кодируем массив в JSON
$json = json_encode($foo);
// Полученный $json будет выглядеть так:
{
"number"
:1,
"float"
:1.5,
"array"
:,
"string"
:"bar"
,
"function"
:"%function%"
}
// Заменяем метски оригинальными значениями.
$json = str_replace($replace_keys, $value_arr, $json);
// Отправляем клиенту.
echo $json;
// Клиент получит JSON такого вида:
{
"number"
:1,
"float"
:1.5,
"array"
:,
"string"
:"bar"
,
"function"
:function(){return
"foo bar"
;}
}
* This source code was highlighted with Source Code Highlighter .
Теперь в полученном обьекте «function» является не строкой, а функцией. Собственно проблема решена. Если использовать это решение совместно с Prototype, то оно будет выглядеть примерно так:new Ajax.Request("json_server.php" , {
method:"get" ,
onSuccess: function(transport){
var json = transport.responseText.evalJSON();
alert(json.function()); // => Отобразится alert "foo bar"
}
});
* This source code was highlighted with Source Code Highlighter .
Реализация в Zend Framework: $foo = array("integer" =>9,
"string" =>"test string" ,
"function" => Zend_Json_Expr(
"function(){ window.alert("javascript function encoded by Zend_Json") }"
),
);
Zend_Json::encode($foo, false
, array("enableJsonExprFinder"
=> true
));
// it will returns json encoded string:
{
"integer"
:9,
"string"
:"test string"
,
"function"
:function(){
window.alert("javascript function encoded by Zend_Json"
)
}
}
* This source code was highlighted with Source Code Highlighter .
Как отправить Ajax’ом список объектов (List) в JSON формате
Пример 1 $(document).ready(function () { $("body").on("click", "button", function () { var product = JSON.stringify({ "Name": $("textarea").val(), "Cost": $("input").val(), }); console.log(product); $.ajax({ url: "/Products/AjaxCreate/", method: "POST", contentType: "application/json", data: product, success: function (response) { console.log(response); } }); }); });Контроллер
Public ActionResult AjaxCreate(Product product){ return Json(new { result = "success" }, JsonRequestBehavior.AllowGet); }
Пример 2 //Сохранение накладной $("body").on("click", "button", function () { //Соберем таблицу как массив объектов var billDetails = ; $(".item").each(function () { var name = $(this).find(".name").val(); //Название var quantity = parseInt($(this).find(".quantity").val()); //Количество var price = parseFloat($(this).find(".price").val());//Цена var summ = parseFloat($(this).find(".item-summ").attr("value"));//Сумма var productId = parseFloat($(this).find(".item-id").attr("value"));//Id Товара var productSkuId = parseInt($(this).find(".item-sku-id").attr("value"));//Id Торгового предложения Товара var notRec = $(this).find(".item-not-rec").prop("checked");//Учитывать товар или нет billDetails.push({ Name: name, Quantity: quantity, Price: price, Summ: summ, ProductId: productId, ProductSkuId: productSkuId, NotRec: notRec }); }); console.log(billDetails); billDetails = JSON.stringify({ "billDetails": billDetails }); //Превратим в Стетхема //Отправим на сохранение $.ajax({ url: "/Bills/AjaxSaveInvoiceBill/", method: "POST", contentType: "application/json", data: billDetails, success: function (response) { window.location.replace("/Bills/List/"); } }); return false; });Контроллер
Public ActionResult AjaxSaveInvoiceBill(List billDetails){ if (billDetails.Count == 0) return Json(new { result = "error", message = "В накладной нет товаров" }, JsonRequestBehavior.AllowGet); //Создадим новую приходную накладную, получим ее ID long billId = Bill.CreateBill(BillTypes.Invoice); //Теперь сохраним каждую позицию под ID новой накладной BillDetail.SaveBillDetails(billDetails, billId); return Json(new { result="success", message="Накладная успешно создана" }, JsonRequestBehavior.AllowGet); }
Ajax запрос в контроллер и получение Json ответа $(document).ready(function () { $.ajax({ url: "/Suppliers/AjaxGetSuppliersList/", method: "GET", success: function (response) { data = JSON.stringify(response.suppliers); var list = eval("(" + data + ")"); suggest_count = list.length; if (suggest_count > 0) { $(".supplier-select").empty();//Очистим список элементов //полученный список элементов добавим в селект $.each(response.suppliers, function (key, value) { $(".supplier-select").append("" + value.Name + ""); }); } } }); });Контроллер
Public ActionResult AjaxGetSuppliersList() { List suppliers = Supplier.GetSuppliers(); return Json(new { suppliers }, JsonRequestBehavior.AllowGet); }
Всем привет! В этой статье мы рассмотрим, как отправлять данные клиенту в JSON формате в NodeJS .
ВведениеВ прошлой статье мы рассмотрели, как отправлять HTML страницы клиенту, испоьзуя потоки в NodeJS . Сегодня же мы рассмотрим, как отправлять данные в формате JSON .
Мы не будем использовать потоки для решения этой задачи, поэтому вы можете удалить весь код, относящийся к ним. Вместо них мы будем использовать end() метод, который нам уже знаком и применялся в одной из предыдущих статей.
Как отправить JSONПервым делом мы должны поменять заголовок, чтобы браузер смог правильно обработать наши данные:
Res.writeHead(200, {"Content-Type": "application/json"});
Теперь давайте создадим объект, который мы хотим отправить клиенту:
Var myObj = {
name: "John",
job: "programmer",
age: 27
};
Теперь давайте отправим данные клиенту:
Res.end(myObj);
Но на самом деле такой код не заработает правильно. Дело все в том, что метод end() ожидает увидеть данные в формате строки или буфер. У нас же есть объект, но мы можем сделать из него строку следующим образом:
Res.end(JSON.stringify(myObj));
Теперь, если вы запустите приложение, то увидите, что данные пришли в JSON формате в виде строки. Также вы можете использовать инструменты разработчика в браузере и посмотреть, что заголовок также был установлен правильно.
Зачем отправлять JSON данные клиентуУ вас, возможно, возник вопрос, а зачем вообще отправлять данные клиенту в JSON формате. Чтобы ответить на этот вопрос, представьте, что у вас есть какой-нибудь javascript , выполняющийся на стороне клиента(frontend ), и он может создать какой-нибудь запрос. Например, у вас есть API . Вы можете написать следующий запрос:
Localhost:3000/api/request
И сервер должен будет отправить нам данные по этому запросу. Удобнее всего будет отправлять их именно в формате JSON , чтобы скрипт, работающий на стороне клиента, мог потом с легкостью эти данные обработать.
ЗаключениеИтак, сегодня мы рассмотрели, как отправлять данные клиенту в формате JSON в NodeJS .
Последнее обновление: 1.11.2015
Принцип отправки данных может отличаться в различных ситуациях. Рассмотрим эти ситуации.
Отправка GET-запросаGET-запрос характеризуется тем, что данные могут отправляться в строке запроса:
// объект для отправки var user = { name: "Tom", age: 23 }; var request = new XMLHttpRequest(); function reqReadyStateChange() { if (request.readyState == 4) { var status = request.status; if (status == 200) { document.getElementById("output").innerHTML=request.responseText; } } } // строка с параметрами для отправки var body = "name=" + user.name + "&age="+user.age; request.open("GET", "http://localhost:8080/postdata.php?"+body); request.onreadystatechange = reqReadyStateChange; request.send();
Для отправки берем свойства объекта user и формируем из их значений сроку с параметрами: "name=" + user.name + "&age="+user.age . Затем эта строка добавляется к строке запроса в методе open("GET", "http://localhost:8080/postdata.php?"+body)
Предполагается, что данные отправляются скрипту на языке php postdata.php, который может иметь, например, следующее содержание:
Конкретная технология стороны сервера тут не важна. И в качестве тестирования можно взять любую другую технологию. Например, ASP.NET MVC. Метод контроллера в ASP.NET MVC, который принимает данные, мог бы выглядеть следующим образом:
Public string PostData(string name, int age) { return "Ваше имя: "+name +"; Ваш возраст: "+ age; }
Кодирование параметровВсе отправляемые в GET-запросе параметры разделяются знаком амперсанда(&). Но что, если какой-нибудь параметр имеет знак амперсанда. Например,
Var user = { name: "Tom&Tim", age: 23 }; // строка с параметрами для отправки var body = "name=" + user.name + "&age="+user.age;
В этом случае при получении параметров скрипт на стороне сервера может неправильно обработать данные и неправильно извлечь параметры. Поэтому, чтобы кодировать все передаваемые данные, нужно применять функцию encodeURIComponent() :
Var body = "name=" + encodeURIComponent(user.name) + "&age="+encodeURIComponent(user.age);
При этом строка "Tom&Tim" будет кодирована в следующую строку: "Tom%26Tim".
При необходимости мы можем выполнить обратное декодирование с помощью функции decodeURIComponent() :
Var encodeName = encodeURIComponent(user.name); // Tom%26Tim var decodeName = decodeURIComponent(encodeName); // Tom&Tim
POST-запросыОтправка данных в POST-запросах будет немного отличаться:
Var user = { name: "Tom", age: 23 }; var request = new XMLHttpRequest(); function reqReadyStateChange() { if (request.readyState == 4 && request.status == 200) document.getElementById("output").innerHTML=request.responseText; } var body = "name=" + user.name + "&age="+user.age; request.open("POST", "http://localhost:8080/postdata.php"); request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); request.onreadystatechange = reqReadyStateChange; request.send(body);
Для отправки данных методом POST надо установить заголовок Content-Type с помощью метода setRequestHeader() . В данном случае заголовок имеет значение application/x-www-form-urlencoded .
Отправка форм. FormDataНачиная со спецификации XMLHttpRequest2 в JavaScript появился новый объект - FormData , который позволяет сериализовать данные формы для ее последующей отправки. При этом нам даже необязательно создавать форму в коде html, мы можем создать ее динамически в JavaScript:
Var formData = new FormData(); formData.append("name", "Tom"); formData.append("age", 23); var request = new XMLHttpRequest(); function reqReadyStateChange() { if (request.readyState == 4 && request.status == 200) document.getElementById("output").innerHTML=request.responseText; } request.open("POST", "http://localhost:8080/display.php"); request.onreadystatechange = reqReadyStateChange; request.send(formData);
Для добавления данных у объекта FormData используется метод append("имя_параметра", значение) . При этом никакие заголовки указывать не надо.
Также мы можем определить форму в html и использовать ее для отправки:
// получаем объект формы
var form = document.forms.user;
// прикрепляем обработчик кнопки
form.submit.addEventListener("click", sendRequest);
// обработчик нажатия
function sendRequest(event){
event.preventDefault();
var formData = new FormData(form);
var request = new XMLHttpRequest();
request.open("POST", form.action);
request.onreadystatechange = function () {
if (request.readyState == 4 && request.status == 200)
document.getElementById("output").innerHTML=request.responseText;
}
request.send(formData);
}
Для сериализации всех полей формы нам достаточно передать объект формы в конструктор FormData: var formData = new FormData(form);
Отправка данных в формате jsonДля отправки данных в формате json нам необходимо установить соответствующий заголовок и сериализовать данные с помощью метода JSON.stringify:
// объект для отправки var user = { username: "Tom", age: 23 }; var json = JSON.stringify(user); var request = new XMLHttpRequest(); request.open("POST", "http://localhost:8080/postjson.php"); request.setRequestHeader("Content-type", "application/json; charset=utf-8"); request.onreadystatechange = function () { if (request.readyState == 4 && request.status == 200) document.getElementById("output").innerHTML=request.responseText; } request.send(json);
У меня есть страница регистрации, чтобы позволить пользователям зарегистрироваться. перед регистрацией мне нужно подтвердить свой номер телефона. Я дал адрес веб-сервиса вместе с его параметрами.
параметры, которые я дал:
Http://********* Method:POST Headers:Content-Type:application/json Body: the following in: { "mobileNo":"0*********", "service":"****", "Code1":"*****", "content":"hi", "actionDate":"2017/09/26", "requestId":"1"}
и вот код, который я нашел в Интернете:
$data = array("mobileNo" => "****", "service" => "***", "Code1" => "*****", "content" => "55", "actionDate" => "2017/09/26"); $options = array("http" => array("method" => "POST", "content" => json_encode($data), "header"=> "Content-Type: application/json" . "Accept: application/json")); $url = "******"; $context = stream_context_create($options); $result = file_get_contents($url, false, $context); $response = json_decode($result);
и вот ошибка, с которой я сталкиваюсь, когда я проверяю local:
File_get_contents(http://********/sms-gateway/sms-external-zone /receive): failed to open stream: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.
и нет ошибки и нет результата (получить SMS) в ответ, когда я тестирую онлайн (cpanel сервер)
По заданным параметрам, где я не прав?
заранее спасибо.
РешениеСудя по вашей ошибке, ваш сервис не отвечает. Вы пытались открыть его в браузере, чтобы проверить, есть ли там ответ?
Возможно, служба, которую вы пытаетесь вызвать, требует от вас предоставления статического IP-адреса с вашего веб-сервера, поскольку они предоставляют доступ только на уровне IP. Значит, ваш IP заблокирован, пока они не позволят.
Я предлагаю вам использовать cURL для выполнения вашего запроса. Таким образом, вы получаете будущие данные для отладки, если что-то не получится. Еще здесь, если служба не отвечает, вы хотите получить любую другую информацию.
$data = array("mobileNo" => "****", "service" => "***", "Code1" => "*****", "content" => "55", "actionDate" => "2017/09/26"); $url = "******"; $ch = curl_init($url); // set data as json string curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); // define json as content type curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type:application/json")); // tell curl to fetch return data curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // follow location if redirect happens like http to https curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // send request $result = curl_exec($ch); // gives you the result - most of the time you only want this var_dump($result); // for debugging purpose, gives you the whole connection info var_dump(curl_getinfo($ch)); // gives back any occurred errors var_dump(curl_error($ch)); curl_close($ch);