Как правильно спроектировать протокол обмена данными между клиентом и веб-сервисом?

Привет!

Я создаю некоторый веб-сервис с публичным API, доступным по HTTP. Так как API предполагается публичным, хочется учесть все подводные камни заранее — иначе придётся делать новую версию протокола и поддерживать обе — ужас :)

Общение между клиентом и сервером работает в лучших традициях HTTP: запрос-ответ. Все параметры запроса передаются в соответствии с правилами HTTP — через адресную строку для GET-запросов и через multipart/form-data для POST. Для разных задач — разные URL, например, запрос на логин отправляется по адресу http://example.com/login, а на регистрацию — по адресу http://example.com/register)

Однако, не очень понятно, как оформить передачу данных обратно клиенту. На данный момент, информацию о результате запроса я кодирую HTTP статусом (200, 403, 404, 500, etc.), а если нужно что-то еще, то я просто передаю клиенту сплошным текстом значения в заданном порядке, разделённые символом-разделителем (например, 17:150:колбаса) в теле ответа.

Я подумал было, что имеет смысл использовать для этого XML, ибо сейчас все так делают — наверно неспроста. Но, поизучав эту тему, понял, что при таком подходе принято и параметры запроса на сервер передавать в виде XML.

Как быть? Использовать простую строку параметров с разделителями или переходить на XML? Можно ли при этом отправлять данные серверу всё-таки в виде параметров запроса?

Интересуют ответы с точки зрения того, что принято или не принято и насколько это плохо — отходить от принятого. Физически-то как угодно можно сделать.
  • Вопрос задан
  • 8991 просмотр
Решения вопроса 2
vanxant
@vanxant
Во-первых, забудьте про XML, его придумали бюрократы. Вот пусть они его и используют в своих банках и налоговых. Для парсинга и кодирования JSON достаточно пары функций по 10 строк каждая. Для парсинга XML, даже если в нем пару значений, нужно подгружать монструозные библиотеки.

Во-вторых, раз уж вы делаете веб-приложение, используйте возможности протокола HTTP. Это значит идеология REST, а не RPC. То есть вместо каких-то там «процедур» или «функций», вы пляшете от объектов и стандартных действий.
Например, у вас есть объект с идентификатором obj_id. Для любого доступа к нему используется URL вида

example.com/path/to/obj_id

Далее по этому URL-у возможны 4 действия (http verb):
GET example.com/path/to/obj_id — получить данные объекта
PUT example.com/path/to/obj_id — изменить объект
DELETE example.com/path/to/obj_id — удалить объект
POST example.com/path/to/ — создать новый объект в папке /path/to
GET example.com/path/to/ — получить все объекты в папке /path/to

В зависимости от результата операции, вы должны возвращать правильные коды ошибок (200 OK, 404 Not Found, 403 Forbidden и т.п.).

Параметры более сложных запросов идут как get-параметры, ну например
GET example.com/path/to/?search=blabla
— искать объекты
Или можно часть параметров перенести в урл:
GET example.com/my/report/01.01.2011-31.12.2011/
Ответ написан
DevMan
@DevMan
REST + XML/JSON
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 7
@Moxa
добавьте параметр format к запросу и, в зависимости от его значения, отдавайте json/xml/csv…
Ответ написан
@AlexNomad
XML все-таки тормознутее.
Я в похожей ситуации выбрал JSON из-за его скорости.
Нужно оценить везде ли вы сможете применять JSON.
Если нет, то иных вариантов кроме XML нет.
Ответ написан
charon
@charon
сам сталкивался с такой задачей — она не так уж и проста. С большинством советов выше я согласен.
1) Используйте json-encode — очень распространённое и проверенное решение. Значительно проще xml.
2) Разделение типов запросов на HTTP-методы GET, POST, PUT, DELETE лучше не делать, хотя это и правильно. Ограничьтесь GET и POST. Это связано с тем, что многие клиенты не смогут использовать тот же DELETE — ну вот хотя бы флэш.
3) Сразу предусмотрите версии вашего API. То есть в запросе обязательно должен быть параметр типа v=1. В будущем это вам очень пригодится.
Ответ написан
@Fortop
Tech/Team lead
Я бы предложил не изобретать велосипед, а воспользоваться RPC/SOAP
Ответ написан
@MikhailEdoshin
Часто выбор формата делают либо через «расширение файла» (domain.com/method.xml vs method.json), либо через HTTP-заголовок Accept.
Ответ написан
Комментировать
karenishe
@karenishe
Исходя из моего опыта, порядок действий должен быть такой:
1. Попробовать разные API как «юзер» (facebook, twitter, vkontakte, soundcloud, youtube);
2. Понять, что нравится, а что нет (опять же, как «юзеру»);
3. Делать свой API исходя из первых двух пунктов.

На мой взгляд, необходимо придерживаться идеологии REST (с возможностью обходиться и без нее), а по форматам допускать как xml, так и json.
Ответ написан
Комментировать
@strelok_aka_vc
Я подумал было, что имеет смысл использовать для этого XML, ибо сейчас все так делают — наверно неспроста. Но, поизучав эту тему, понял, что при таком подходе принято и параметры запроса на сервер передавать в виде XML.


Не совсем понял как Вы себе представляете GET запрос на сервер с XML данными.
Ответ от сервера в виде XML — общепринятая практика. Используется в платежных системах повсеместно.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы