jsonp asp.net mvc

Programming
Предыдущий Следующий

json logo JSONP (JSON with padding) - это дополнение к базовому формату JSON, основное предназначение которого делать междоменные запросы. Стандартными средствами обмена данными междоменные запросы запрещены из-за политики безопасности. Суть формата, что сервер при запросе JSONP возвращает не JSON, а произвольный JavaScript-код. Этот скрипт обрабатываются интерпретатором JavaScript, а не парсером JSON. Грубо говоря сервер вернет JavaScript, который браузер выполнит.

Расмотри пример, реализации посредством jquery и asp.net mvc

Для этой цели я использую метод getJSON:

$.getJSON("otherdomain.com?callback=MyCallback", { MyParam: "Value" });

function MyCallback(data) {
     alert("JSON Data: " + data);
}

Обратите внимания на url запроса. Мы методом GET передаем названия функции (MyCallback), которая будет вызвана после возврата данных из сервера. Что бы не плодить много функций, jquery упрощает вызов, до такой конструкции:

$.getJSON("otherdomain.com?callback=?", { MyParam: "Value" }, function (data) {
     alert("JSON Data: " + data);
});

Параметр "?" означает что название функции будет генерироваться автоматически. Этот пример я рекомендую использовать.

Теперь перейдем к серверной части. Серверный код должен принимать параметр callback и возвращать не JSON, а JavaScript-код (и то в определенном формате).

Создаем свой ActionResult. Я наследуюсь от ContentResult, что бы не было не каких лишних данных в ответе:

 public class JsonpResult : ContentResult
{
    private string Callback;
    private object Data;
    public JsonpResult(string callback, object data)
    {
        Callback = callback;
        Data = data;
    }

    public override void ExecuteResult(ControllerContext context)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }
        if (string.IsNullOrEmpty(Callback))
        {
            throw new ArgumentNullException("Callback");
        }

        HttpResponseBase response = context.HttpContext.Response;
        response.ContentType = "application/javascript";

        JavaScriptSerializer serializer = new JavaScriptSerializer() { MaxJsonLength = int.MaxValue, RecursionLimit = int.MaxValue };
        if (Data != null)
        {
            response.Write(Callback + "(" + serializer.Serialize(Data) + ");");
        }
        else
        {
            response.Write(Callback + "();");
        }
    }
}

 Конструктор (JsonpResult(string callback, object data) ) у меня принемает два параметра - это функцию, которая должна вызываться, и данные, которые мы хотим вернуть. Далее я формирую JavaScript, который сервер и верне.

Если бы мы использовали обычный запрос, то сервер вернул бы данные в формате:

{
   "Param1":"Valeu1",
   "Param2":"Valeu2"
}

JSONP должен возвращать эти данные так:

MyCallback({
   "Param1":"Valeu1",
   "Param2":"Valeu2"
})

Теперь перейдем к Controller

public class HomeController : Controller
{
        public ActionResult Index(string  callback, string  MyParam)
        {
            //что-то делаем

            return new JsonpResult(callback, new { success = true });
        }
}

На этом все, если вместо jquery используется другой framework, то там тоже должны быть аналогичные функции. Пример для angularjs:

$http.jsonp("otherdomain.com?callback=JSON_CALLBACK",
    { params: { MyParam: "Value" } }).success(function (data) {
              alert("JSON Data: " + data);
});

Главное не стоит забывать, что все параметры при таком запросе передаються методом GET

Самостоятельный отпуск Опыт заказа вывоза мусора в Киеве Магія зміни: Від ночі до дня
Магія Вечірнього Неба: Відлякуйте втомленість дня і зануртеся у світ загадок і краси Якби Росія була людиною, то як би її описав психіатр?