REST сервисы
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 06.08.14 09:32
Оценка: 70 (9) +1
#Имя: wiki.rsdn.restapi
Поскольку ряд товарищей спрашивает про сабж, попытаюсь поддерживать более менее актуальный список того что есть.
Общие моменты: все сервисы на данный момент на вход принимают параметры в виде form data (url для Get, тело запроса для Post), на выходе отдают JSON. Если результат с ошибками, возвращается HTTP код ошибки и JSON вида { field: "error_field", message: "error_message"}. Поле field, если оно есть, указывает на ошибку в конкретном входном параметре, либо содержит all, если ошибка к конкретному параметру не относится.

Аутентификация и сессия — общая с остальным сайтом, т.е. форма //Users/Login.aspx для логина, затем куки .RSDNAUTH и ASP.NET_SessionId.

Часть сервисов поддерживает ETag/If-None-Match и умеет возвращать 304, так что крайне желательно чтобы клиенты, отличные от браузеров, это использовали.

Для некоторых сервисов есть демки — http://rsdn.ru/rs/demo
Сервис Состояние url Метод Параметры Результат Пример
Дерево навигации Beta //frames/navtreenodes GET string node — имя родительского узла. Для корня node=.
Все дочерние узлы, с учетом вложенности, до тех узлов, которые являются либо листьями, либо требуют загрузки по требованию.

GET http://rsdn.ru/frames/navtreenodes?node=./rsdnproject/forauthors

[
    {
        "id": "./rsdnproject/forauthors/requirements",
        "label": "Требования к оформлению материалов",
        "image": "/Images/article18.png",
        "url": "/article/authors/requirements.xml",
        "children": []
    },
    {
        "id": "./rsdnproject/forauthors/template",
        "label": "Шаблон для верстки статей",
        "image": "/Images/article18.png",
        "url": "/article/authors/template.xml",
        "children": []
    },
    {
        "id": "./rsdnproject/forauthors/codestyle",
        "label": "Соглашение по оформлению кода",
        "image": "/Images/article18.png",
        "url": "/article/mag/200401/codestyle.XML",
        "children": []
    },
    {
        "id": "./rsdnproject/forauthors/noway",
        "label": "Как не надо писать статьи",
        "image": "/Images/article18.png",
        "url": "/article/authors/HowNotTowrite.xml",
        "children": []
    }
]

Сообщение RSDN Team Production //about/askteam POST string name, string email, string subj, string message
пустой респонс с 204 кодом, если все хорошо, либо информацию об ошибке
Регистрация пользователя Production //account/doregister POST
string login,
string nick,
string email,
string pwd1,
string pwd2,
string recaptcha_challenge_field,
string recaptcha_response_field

пустой респонс с 204 кодом, если все хорошо, либо информацию об ошибке
Изменение емейла и пароля Production //account/dochangereg POST
int? uid,
string email,
string oldPwd,
string pwd1,
string pwd2

пустой респонс с 204 кодом, если все хорошо, либо информацию об ошибке
Отправка нового сообщения Alpha //forum/<forum_name> POST
string postingID,
string forum,
int msgID,
string subject,
string posterName,
string password,
string text,
bool noSmile,
string name,
string tags,
bool notifyAboutReplies

пустой респонс с 204 кодом, если все хорошо, либо информацию об ошибке
Оценка сообщения Production //rs/message/<messageId>/rate/<rateType> POST
string rateType, — Тип оценки: rate, smile или agree
int messageID,
int? value — Значение оценки. Для типа rate: 1-3, для типа agree: -4 согласен, 0 не согласен

пустой респонс с 204 кодом, если все хорошо, либо информацию об ошибке
Удаление оценок Production //rs/message/<messageId>/rate DELETE
int messageID,

пустой респонс с 204 кодом, если все хорошо, либо информацию об ошибке
Поиск профиля по подстроке Production //rsdnsearch/findauthor GET string name Список идентификаторов и имен пользователей
GET http://rsdn.ru/rsdnsearch/findauthor/?name=vladd

[
    {
        "id":73,
        "displayName":"VladD2"
    },
    {
        "id":39067,
        "displayName":"VladD"
    },
    {
        "id":93688,
        "displayName":"VladdT"
    },
    {
        "id":95381,
        "displayName":"vladdou"
    },
    {
        "id":108143,
        "displayName":"VladD2_PNH"
    },
    {
        "id":110977,
        "displayName":"VladDebil"
    }
]

Получение списка топиков форума Alpha //rs/forum/<forum_name>/topics GET
string forum,
int? from, // По умолчанию 0
int? len // По умолчанию размер страницы из профиля
Список топиков в порядке убывания даты
GET http://rsdn.ru/rs/forum/rsdn/topics?len=2

{
    "total":5637,
    "topics":[
        {
            "accountID":187,
            "answersCount":9,
            "createdOn":"\/Date(1407336643590)\/",
            "id":5728461,
            "isAlwayOnTop":false,
            "isClosed":null,
            "lastAnswerBy":"Ops",
            "name":null,
            "lastAnswerId":80747,
            "topicRate":0,
            "topicRateCount":0,
            "topicAgrees":0,
            "topicDisagrees":0,
            "topicSmiles":0,
            "rowVersion":"0000A37F01369035",
            "subject":"сбилась разметка",
            "lastUpdatedOn":"\/Date(1407342168280)\/",
            "authorNick":"Pavel Dvorkin"
        },
        {
            "accountID":100952,
            "answersCount":1,
            "createdOn":"\/Date(1407328363343)\/",
            "id":5728286,
            "isAlwayOnTop":false,
            "isClosed":null,
            "lastAnswerBy":"AndrewVK",
            "name":null,
            "lastAnswerId":80744,
            "topicRate":20,
            "topicRateCount":2,
            "topicAgrees":0,
            "topicDisagrees":0,
            "topicSmiles":0,
            "rowVersion":"0000A37F0110A8CB",
            "subject":"Новый embedded youtube",
            "lastUpdatedOn":"\/Date(1407332030580)\/",
            "authorNick":"Evgeny.Panasyuk"
        }
    ]
}

Получение списка ответов топика Alpha //rs/topic/<topicId>/replies GET int topicId Список ответов в порядке возрастания даты
GET http://rsdn.ru/rs/topic/5727307/replies

[
    {
        "accountID":5161,
        "createdOn":"\/Date(1407332097413)\/",
        "id":5728370,
        "isClosed":null,
        "name":null,
        "rate":0,
        "rateCount":0,
        "agrees":0,
        "disagrees":0,
        "smiles":0,
        "rowVersion":"0000A37F0121C0A8",
        "subject":"Re: Некоторые недочеты",
        "authorNick":"AndrewVK",
        "parentId":5727307
    },
    {
        "accountID":99637,
        "createdOn":"\/Date(1407345231857)\/",
        "id":5728657,
        "isClosed":null,
        "name":null,
        "rate":0,
        "rateCount":0,
        "agrees":0,
        "disagrees":0,
        "smiles":0,
        "rowVersion":"0000A37F015DE095",
        "subject":"Re[2]: Некоторые недочеты",
        "authorNick":"BrainSlug",
        "parentId":5728370
    },
    {
        "accountID":5161,
        "createdOn":"\/Date(1407346966247)\/",
        "id":5728717,
        "isClosed":null,
        "name":null,
        "rate":0,
        "rateCount":0,
        "agrees":0,
        "disagrees":0,
        "smiles":0,
        "rowVersion":"0000A37F0165D112",
        "subject":"Re[3]: Некоторые недочеты",
        "authorNick":"AndrewVK",
        "parentId":5728657
    }
]

Получение сообщения Alpha //rs/message/<messageId> GET
int messageId,
bool? formatted
Сообщение, включая его текст. В зависимости от значения formatted в качестве текста будет либо исходный код, либо готовый html для отображения
GET http://rsdn.ru/rs/message/5728645?formatted=true

{
    "accountID":78670,
    "createdOn":"\/Date(1407344805630)\/",
    "id":5728645,"isClosed":null,
    "name":null,
    "rate":20,
    "rateCount":10,
    "agrees":0,
    "disagrees":0,
    "smiles":0,
    "rowVersion":"0000A37F015BED19",
    "subject":"Теперь вы все мои гости",
    "authorNick":"Берсерк",
    "text":"\u003ctable\u003e\u003ctr\u003e\u003ctd class=
        \u0027m\u0027\u003e\u003cfont size=2\u003eВ
        догонку к истории с Лабиринтом:\u003cbr 
        /\u003e\n\u003cbr /\u003e\n\u003cblockquote
        class=\u0027q\u0027\u003e\u003cp\u003eРоссийские
        туристы ..."
}

Получение сообщений топика Alpha //rs/topic/<topicId>/messages GET
int topicId,
bool? formatted,
int? from,
int? len
Сообщения указанного топика, включая текст. В зависимости от значения formatted в качестве текста будет либо исходный код, либо готовый html для отображения
GET http://rsdn.ru/rs/topic/5727307/messages/?len=2&from=2

[
    {
        "accountId":99637,
        "createdOn":"2014-08-05T23:03:52.2700000",
        "id":5727307,
        "isClosed":null,
        "name":null,
        "rate":5,
        "rateCount":1,
        "agrees":0,
        "disagrees":0,
        "smiles":0,
        "rowVersion":"0000A37E017C1771",
        "subject":"Некоторые недочеты",
        "authorNick":"BrainSlug",
        "text":"В принципе ничего серьезного. Но у меня при голосовании (rsdn.ru/poll/5136) под анонимом ...",
        "gravatarHash":"35d4bb2787c66a855fdcf912d8f04ad6",
        "forum":"rsdn",
        "versions":[]
    },
    {
        "accountId":99637,
        "createdOn":"2014-08-06T21:13:51.8570000",
        "id":5728657,
        "isClosed":null,
        "name":null,
        "rate":0,
        "rateCount":0,
        "agrees":0,
        "disagrees":0,
        "smiles":0,
        "rowVersion":"0000A37F015DE095",
        "subject":"Re[2]: Некоторые недочеты",
        "authorNick":"BrainSlug",
        "text":"\r\nAVK\u003eНе воспроизвелось. У тебя воспроизводится?\r\nуже нет :)...",
        "gravatarHash":"35d4bb2787c66a855fdcf912d8f04ad6",
        "forum":"rsdn",
        "versions":[]
    }
]

AVK Blog
Отредактировано 05.09.2014 23:36 AndrewVK . Предыдущая версия . Еще …
Отредактировано 01.09.2014 13:54 AndrewVK . Предыдущая версия .
Отредактировано 15.08.2014 12:12 AndrewVK . Предыдущая версия .
Re: REST сервисы
От: koandrew Канада http://thingselectronic.blogspot.ca/
Дата: 06.08.14 15:01
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Поскольку ряд товарищей спрашивает про сабж, попытаюсь поддерживать более менее актуальный список того что есть.


Спасибо! А можно сделать самое важное — получение списка тем в форуме, и собственно сообщений? Я тут на досуге пилю метро-клиент для винпланшетов, и пока приходится врукопашную html обрабатывать, что очень геморно — особенно в свете того, что вы постоянно меняете вёрстку...
[КУ] оккупировала армия.
Re[2]: REST сервисы
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 06.08.14 17:55
Оценка: 8 (1)
Здравствуйте, koandrew, Вы писали:

K>Спасибо! А можно сделать самое важное — получение списка тем в форуме


Добавил.
... << RSDN@Home 1.2.0 alpha 5 rev. 100 on Windows 8 6.2.9200.0>>
AVK Blog
Re[3]: REST сервисы
От: koandrew Канада http://thingselectronic.blogspot.ca/
Дата: 06.08.14 20:08
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Добавил.


Спасибо! С нетерпением жду вторую половину реквеста
[КУ] оккупировала армия.
Re[4]: REST сервисы
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 06.08.14 20:19
Оценка:
Здравствуйте, koandrew, Вы писали:

AVK>>Добавил.


K>Спасибо! С нетерпением жду вторую половину реквеста


2/3. Ты про список ответов топика забыл. Но ты пока попробуй этот использовать.
... << RSDN@Home 1.2.0 alpha 5 rev. 100 on Windows 8 6.2.9200.0>>
AVK Blog
Re[5]: REST сервисы
От: koandrew Канада http://thingselectronic.blogspot.ca/
Дата: 07.08.14 01:59
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>2/3. Ты про список ответов топика забыл. Но ты пока попробуй этот использовать.


Не, я на выходных этим занимаюсь — в будни некогда сейчас, на работе дурдом.
[КУ] оккупировала армия.
Re: REST сервисы
От: Нахлобуч Великобритания https://hglabhq.com
Дата: 07.08.14 10:04
Оценка:
Здравствуйте, AndrewVK, Вы писали:

Не хочу показаться занудой, но это не совсем REST. Гораздо ближе к RPC-подобному API с JSON на выхлопе.
HgLab: Mercurial Server and Repository Management for Windows
Re[2]: REST сервисы
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 07.08.14 11:08
Оценка:
Здравствуйте, Нахлобуч, Вы писали:

Н>Не хочу показаться занудой, но это не совсем REST. Гораздо ближе к RPC-подобному API с JSON на выхлопе.


Ну давай глянем вики:

Client–server
Stateless
Cacheable
Layered system
Code on demand (optional)
Uniform interface
Identification of resources
Manipulation of resources through these representations
Self-descriptive messages

Что из этого, кроме code on demand, принципиально не подходит?
... << RSDN@Home 1.2.0 alpha 5 rev. 100 on Windows 8 6.2.9200.0>>
AVK Blog
Re[3]: REST сервисы
От: Нахлобуч Великобритания https://hglabhq.com
Дата: 07.08.14 15:44
Оценка: +6
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, Нахлобуч, Вы писали:


Н>>Не хочу показаться занудой, но это не совсем REST. Гораздо ближе к RPC-подобному API с JSON на выхлопе.


AVK>Ну давай глянем вики:


Мы академиев не кончали, но есть мнение, что ресурса "/f/ratemessage/{id}" (и подобных "/f/gettopics") не существует. А параметр "bool set" говорит о RPC-направленности. Как мне кажется, более тру было бы что-то типа "/forum/{name}/messages/{id}/rates" с операциями GET и POST (rate = 1|2|3|smile|upvote|downvote), а так же DELETE для "../rates/{rate}". С остальными "ресурсами" -- аналогично.

"Пустой респонс с 200 кодом" -- это 204. Всегда плеваться пятисотой ошибкой тоже не шибко канонично.

Ну и HATEOAS, но это совсем уже высший пилотаж.
HgLab: Mercurial Server and Repository Management for Windows
Re[4]: REST сервисы
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 07.08.14 16:13
Оценка:
Здравствуйте, Нахлобуч, Вы писали:

Н>Мы академиев не кончали, но есть мнение, что ресурса "/f/ratemessage/{id}" (и подобных "/f/gettopics") не существует.


Почему ты так решил? Они вполне существуют, просто не все реализовано . Смутило get? Это просто для гарантии отсутствия конфликта с урлами страничек. Впрочем, уже переделано на /rs/forum/<forumname>/topics. <forumname>/topics — идентификатор ресурса.

Н> А параметр "bool set" говорит о RPC-направленности


Ничего подобного он не говорит, это тело POST запроса.

Н>. Как мне кажется, более тру было бы что-то типа "/forum/{name}/messages/{id}/rates" с операциями GET и POST (rate = 1|2|3|smile|upvote|downvote), а так же DELETE для "../rates/{rate}". С остальными "ресурсами" -- аналогично.


Это несложно переделать. Насчет DELETE так наверняка, заодно set выкинется.

Н>"Пустой респонс с 200 кодом" -- это 204.


В смысле?

Н> Всегда плеваться пятисотой ошибкой тоже не шибко канонично.


А оно там не всегда, я просто не описал. Бывает, как минимум, еще 400, 403 и 404.

Н>Ну и HATEOAS, но это совсем уже высший пилотаж.


Это в данном случае совсем без надобности.
... << RSDN@Home 1.2.0 alpha 5 rev. 100 on Windows 8 6.2.9200.0>>
AVK Blog
Re[4]: REST сервисы
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 07.08.14 16:22
Оценка:
Здравствуйте, koandrew, Вы писали:

K>Спасибо! С нетерпением жду вторую половину реквеста


Добавил получение ответов
... << RSDN@Home 1.2.0 alpha 5 rev. 100 on Windows 8 6.2.9200.0>>
AVK Blog
Re[4]: REST сервисы
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 07.08.14 18:06
Оценка:
Здравствуйте, koandrew, Вы писали:

K>Спасибо! С нетерпением жду вторую половину реквеста


Добавил получение сообщений. С возможностью форматирования. И есть демка.
... << RSDN@Home 1.2.0 alpha 5 rev. 100 on Windows 8 6.2.9200.0>>
AVK Blog
Re[5]: REST сервисы
От: koandrew Канада http://thingselectronic.blogspot.ca/
Дата: 07.08.14 18:14
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Добавил получение ответов


Спасибо! Вопросы (смотрю на вывод http://rsdn.ru/rs/topic/5728024/replies ):
1. Нужен ParentId, чтобы можно было построить дерево.
2. Что такое "name" (который null) и "rowVersion"?
3. дата "createdOn" я так понимаю в тиках?

Ну и ещё нужна третья "половина"
[КУ] оккупировала армия.
Re[6]: REST сервисы
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 07.08.14 18:39
Оценка:
Здравствуйте, koandrew, Вы писали:

K>1. Нужен ParentId, чтобы можно было построить дерево.


Упустил момент, поправлю

K>2. Что такое "name" (который null) и "rowVersion"?


У некоторых сообщений есть уникальное имя. Потом на них можно сослаться [#имя_сообщения].
RowVersion это равномерно возрастающее число, обновляющееся при каждом изменении сообщения.

K>3. дата "createdOn" я так понимаю в тиках?


https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

Integer value representing the number of milliseconds since 1 January 1970 00:00:00 UTC (Unix Epoch).


K>Ну и ещё нужна третья "половина"


Так вроде уже.
... << RSDN@Home 1.2.0 alpha 5 rev. 100 on Windows 8 6.2.9200.0>>
AVK Blog
Re[5]: REST сервисы
От: Нахлобуч Великобритания https://hglabhq.com
Дата: 08.08.14 08:29
Оценка:
Здравствуйте, AndrewVK, Вы писали:

Н>>Мы академиев не кончали, но есть мнение, что ресурса "/f/ratemessage/{id}" (и подобных "/f/gettopics") не существует.

AVK>Почему ты так решил?

Потому, что наличие глагола в имени ресурса делает его не совсем ресурсом.

Н>> А параметр "bool set" говорит о RPC-направленности

AVK>Ничего подобного он не говорит, это тело POST запроса.

Да, это тело RPC-стайл POST-запроса. Если бы происходила манипуляция ресурсами, то было бы ровно так, как я описывал:

"/forum/{name}/messages/{id}/rates" с операциями GET и POST (rate = 1|2|3|smile|upvote|downvote), а так же DELETE для "../rates/{rate}"


Н>>"Пустой респонс с 200 кодом" -- это 204.

AVK>В смысле?

В смысле, по заветам HTTP каноничнее было бы в ответ на успешный POST-запрос возвращать не пустой ответ с HTTP 200, а пустой ответ с HTTP 204.

AVK>Это в данном случае совсем без надобности.


См. свой пассаж о "переделано". Если бы в результате переделок сервер научился бы выплевывать HTTP 301 для перенаправления со старых на новые URL'ы и эти URL'ы не формировались бы клиентом, а получались непосредственно из ответа, то жизнь клиентских приложений была бы тёплой и сухой.

И раз уж мы заговорили о REST и Stateless'ности -- может быть, подумать насчет какого-то альтернативного способа аутентификации и авторизации?
HgLab: Mercurial Server and Repository Management for Windows
Re[6]: REST сервисы
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 08.08.14 09:04
Оценка:
Здравствуйте, Нахлобуч, Вы писали:

Н>Потому, что наличие глагола в имени ресурса делает его не совсем ресурсом.


Ну я так и подумал.

Н>См. свой пассаж о "переделано". Если бы в результате переделок сервер научился бы выплевывать HTTP 301 для перенаправления со старых на новые URL'ы и эти URL'ы не формировались бы клиентом, а получались непосредственно из ответа, то жизнь клиентских приложений была бы тёплой и сухой.


Пока никаких клиентских приложений для этих сервисов нет.

Н>И раз уж мы заговорили о REST и Stateless'ности -- может быть, подумать насчет какого-то альтернативного способа аутентификации и авторизации?


Может быть. Какого?
... << RSDN@Home 1.2.0 alpha 5 rev. 100 on Windows 8 6.2.9200.0>>
AVK Blog
Re[7]: REST сервисы
От: Нахлобуч Великобритания https://hglabhq.com
Дата: 08.08.14 09:53
Оценка:
Здравствуйте, AndrewVK, Вы писали:

Н>>И раз уж мы заговорили о REST и Stateless'ности -- может быть, подумать насчет какого-то альтернативного способа аутентификации и авторизации?

AVK>Может быть. Какого?

Сам напрашивается Basic (и HTTPS, разумеется). Или что-то типа такого.
HgLab: Mercurial Server and Repository Management for Windows
Re[8]: REST сервисы
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 08.08.14 10:08
Оценка:
Здравствуйте, Нахлобуч, Вы писали:

Н>Сам напрашивается Basic (и HTTPS, разумеется).


Basic предполагает хранение на клиенте пароля, что не здорово.

Н> Или что-то типа такого.


Что то такое в планах, только пока без конкретно OAuth2. В первой итерации, скорее всего, будет просто метод Login, возвращающий те же самые данные, что и форма. Аналог Login.aspx, только без вьюстейтов.
... << RSDN@Home 1.2.0 alpha 5 rev. 100 on Windows 8 6.2.9200.0>>
AVK Blog
Re: REST сервисы
От: -n1l-  
Дата: 08.08.14 10:39
Оценка:
Пользуясь случаем хочу попросить, что бы мне пояснили, в чем отличие между REST и RPC.
Re[2]: REST сервисы
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 08.08.14 10:45
Оценка:
Здравствуйте, -n1l-, Вы писали:

N>Пользуясь случаем хочу попросить, что бы мне пояснили, в чем отличие между REST и RPC.


Архитектурные подходы отличаются. В википедии довольно подробно расписано.
... << RSDN@Home 1.2.0 alpha 5 rev. 100 on Windows 8 6.2.9200.0>>
AVK Blog
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.