Dojo, JSONP и все-все-все

в 12:46, , рубрики: api, dojo, javascript, JSONP, smd, метки: , , ,

Добрый день, уважаемые хабраЛеди и хабраДжемпельмены. Сегодня я поведаю Вам о создании API для вашего сайта. Знаю, тема в какой-то своей части достаточно обсосанная, но я наткнулся на недостаток определенной информации при разработке API для одного из проектов.
Речь пойдет о JSONP, SMD и компоненте Dojo dojox.rpc.Service.
Интересно? — Прошу под кат.

Начнем от печки.

JSONP (JSON Padding) или «JSON с подкладкой» является расширением JSON, когда имя функции обратного вызова указывается в качестве входного аргумента © Wikipedia
Хитрость заключается в том, что в качестве результата сервер возвращает javascript-код вызова этой самой функции с передачей в неё самих данных. Таким образом, подключив этот код на клиентской стороне, мы можем обойти ограничение same origin для обычного Ajax-взаимодействия.

SMD. SMD (service message description) — язык описания веб-сервисов и доступа к ним, основанный на языке JSON.
Приведу пример простого smd-файла:

{
    transport: "JSONP",
    envelope: "URL",
    target: "http://mysite.org/api/find",
    parameters: [
        { name: "appid", optional: false, "default": "client" }
    ],
    services: {
        service1: {
            target: "http://mysite.org/api/find_image",
            parameters: [
                    { name: "query", type: "string", optional: false, "default": "" },
                    { name: "max_height", type: "integer", optional: true },
            ]            
        },
        service2: {
            target: "http://mysite.org/api/find_video",
            parameters: [
                    { name: "query", type: "string", optional: false, "default": "" }
            ]            
        },
    }
}

Как видно, smd-файл можно условно разделить на две части — параметры по-умолчанию и блок с параметрами конкретных сервисов.
Не буду останавливаться на расшифровке названий всех параметров — они говорят сами за себя — замечу только, что в рамках компонента dojox.rpc.Service
параметр transport может принимать одно из следующих значений: POST, GET, JSONP
параметр envelope — одно из: URL, JSON, PATH

Теперь о вкусном, или как заставить это работать

var smd = new dojox.rpc.Service("/smd/api_1.smd");
var d = smd.service1({query:"image_001"});

d.addCallback(function(result) {
    alert("gotcha! " + result);
});

smd.service1({query:«image_001»})
эта строчка вернет нам deferred-объект, которому мы можем назначить callback-функцию (или несколько).
Теперь мы можем обращаться к сервисам по имени, имея в своем расположении конфигурационный файл.

Замечания:
begin

1. Для использования транспорта JSONP нужно подключить библиотеку dojo.io.script
2. Компонент dojox.rpc.Service должен быть загружен до dojo.io.script во избежание ошибки «no match found»
3. Сервер в качестве ответа должен возвращать тело скрипта (без парного тега script) с вызовом функции, имя которой передаётся в параметре callback. Во избежание ошибок, следует проверять функцию на undefinedhabrahabr.ru/post/62314/

end.

Ну вот собственно и все, спасибо за внимание. Замечания-исправления приветствуются, по просьбе трудящихся статья может быть дополнена (возможно что-то и упустил из виду).

Автор: spbcypher


* - обязательные к заполнению поля