Добрый день, уважаемые хабраЛеди и хабраДжемпельмены. Сегодня я поведаю Вам о создании 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. Во избежание ошибок, следует проверять функцию на undefined — habrahabr.ru/post/62314/
end.
Ну вот собственно и все, спасибо за внимание. Замечания-исправления приветствуются, по просьбе трудящихся статья может быть дополнена (возможно что-то и упустил из виду).
Автор: spbcypher