Php post json отправка. PHP и формат передачи данных JSON. Создаем переменную из строки JSON

Из этого топика вы узнаете как отправить JavaScript функции, через JSON используя PHP (сама концепция может быть применена и для других языков).

PHP, начиная с версии 5.2.0, включает функции json_encode() и json_decode(). Эти функции кодируют данные в формат JSON и декодиуют JSON в ассоциативные массивы. В json_encode() не может быть закодирована функция. В ряде случаев это чертовски неудобно.

  • Добавлен пример реализации в Zend Framework.
  • Вопрос к кармавампирам - вы знаете вариант как передать handler для создания объекта иначе?
  • Комментарий о том для чего и кому это нужно.
  • Проблема // Возьмем произвольный массив
    $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() не годится для реализации этого функционала.

    Решение
  • Проходим по массиву который будет закодирован.
  • Проверяем кодируемое значение на предмет наличия определения функции.
  • Запоминаем значение и заменяем его уникальной меткой.
  • Кодируем измененный массив используя json_encode().
  • Заменяем уникальную метку на оригинальное значение.
  • Отдаем JSON клиенту.
  • // Обрабатываемый массив.
    $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);

    trify.ru - Советы. Программы. Операционные системы. Живые обои