Связанное чтение:
Полный сравнительный анализ Facebook/GraphQL, APIJSON (1) — основные функции
С момента выпуска APIJSON пользователи сети постоянно сравнивают его с GraphQL Facebook.
Есть даже много людей, которые утверждают, что APIJSON «полностью взорвал».
Однако верно и обратное, и эта серия блогов продемонстрирует множество реальных доказательств,
APIJSON «закончил» GraphQL!
Слоган APIJSON:
Внутренний интерфейс и автоматизация документов, внешняя (клиентская) настройка возвращаемых данных и структуры JSON!
Введение в APIJSON:APIJSON — это сетевой транспортный протокол JSON для API.
Предоставляет полностью автоматизированный API для простых добавлений, удалений, изменений, сложных запросов и простых транзакционных операций.
Это может значительно снизить затраты на разработку и связь, упростить процесс разработки и сократить цикл разработки.
Он подходит для малых и средних проектов с разделением клиентской и серверной части, особенно для предпринимательских интернет-проектов и проектов для самостоятельного использования предприятиями.
Через API автоматизации интерфейс может настроить любые данные, любую структуру!
Большинству серверных частей HTTP-запросов больше не нужно писать интерфейсы, не говоря уже о документах!
Внешнему интерфейсу больше не нужно сообщать о проблемах интерфейса или документации с серверной частью! Больше никаких ошибок в документации!
Бэкенду больше не нужно писать новую версию интерфейса и документацию для совместимости со старым интерфейсом! Никогда не надоедает интерфейс бесконечно в любое время и в любом месте!
Функции
Онлайн анализ
- Автоматически генерировать документацию, понятную, удобочитаемую и всегда актуальную
- Автоматически генерировать код запроса, поддерживать Android и iOS
- Автоматическое управление и тестирование вариантов использования интерфейса, обмен в один клик
- Автоматическая проверка и форматирование JSON, поддержка выделения и расширения
для передней части
- Нет необходимости отправлять интерфейсы и документы на серверную часть
- Данные и структура полностью настраиваются, что вы хотите
- Смотрите запрос, чтобы узнать результат, что вы просите, то и получаете
- Получите любые данные, любую структуру сразу
- Может удалять дубликаты данных, экономить трафик и повышать скорость
для бэкенда
- Обеспечьте общий интерфейс, большинство API не нужно писать заново
- Автоматически генерировать документацию, не нужно писать и поддерживать
- Автоматическая проверка разрешений, автоматическое управление версиями
- Открытые API не нуждаются в разделении на версии и всегда совместимы.
- Поддержка добавления, удаления, модификации, поиска, нечеткого поиска, регулярного сопоставления, удаленных функций и т. д.
Демонстрация видео:i.youku.com/apijson
[Следующий Gif-файл выглядит застрявшим, но на самом деле приложение на телефоне работает без сбоев]
Домашняя страница проекта:GitHub.com/Томми лимон/…
Полный сравнительный анализ Facebook/GraphQL, APIJSON (2) — контроль разрешений
Автоматизированный контроль доступа(конкретно APIJSON):
GraphQL [не] обеспечивает функциональность контроля доступа, даже вОфициальная документация и исходный кодДаже как добиться учебника почти,
В нем упоминалось только, как [вручную] реализовать контроль разрешений роли [владельца] в вашем [бизнес-коде].
Выделенная строка кода
if (context.user && (context.user.id === post.authorId))
В заднем ручном руководстве написано PostType, руководство плюс функция разрешения, где вместе с такими решениями решениями.
То есть при запросе таблицы, соответствующей POSTYPE, только когда авторитет в посте равно идентификатору посещения пользователя, результат будет возвращен.
Следующее любезно напоминает вам не писать его в функции распознавателя определенного типа,
Вместо этого его следует упаковать в PostReponsdom, поместить функцию getBody, а затем реализовать это суждение и вернуть.
Это не только логически понятно, но также может использоваться повторно, когда postType используется в других типах (например, вложенный postType userType). (PS: Это не упоминается в этом документе, я сказал это для этого)
Но даже если вы потратите время на написание нового класса и новой функции и сделаете эту инкапсуляцию, повторно использовать можно будет только postType.
Другой тип человека, тип дроида, тип запросаПосле ожидания большого количества Типов вам все равно приходится писать их один за другим?
https://github.com/graphql/graphql-js/blob/master/src/__tests__/starWarsSchema.js
Более того, в современных интернет-приложениях, будь то веб-сайт или мобильное приложение, не только роль [владельца] немного усложняется.
Большинство из них, особенно социальные приложения, содержат роли [Контакты] и [Круг моментов].
Разумеется, все приложения с входом в учетную запись можно разделить на две роли: [вошел в систему] и [не вошел в систему].
Поскольку GraphQL не предоставляет функций контроля разрешений, его можно писать только по одному для каждой роли.
Согласно единственному официальному примеру выше, наше суждение для всех ролей должно быть следующим:
Не вошли в:
if (context.user == null || context.user.id == null || context.user.id <= 0) {
return post.body;
}
return null;
Зарегистрировано:
if (context.user && context.user.id && context.user.id > 0) {
return post.body;
}
return null;
Круг друзей:
var userId = context.user == null ? null : context.user.id;
var contactIdList = context.user == null ? null : context.user.contactIdList; //联系人id列表
if ((userId && userId === post.authorId) || (contactIdList && contactIdList.indexOf(post.authorId) >= 0)) {
return post.body;
}
return null;
Контакт:
var contactIdList = context.user == null ? null : context.user.contactIdList; //联系人id列表
if (contactIdList && contactIdList.indexOf(post.authorId) >= 0) {
return post.body;
}
return null;
Владелец:
if (context.user && (context.user.id === post.authorId)) {
return post.body;
}
return null;
ТолькоИспользование GraphQL для реализации контроля разрешений роли, соответствующего типу запроса postType, требует написания очень большого количества кода суждения!
Если предположить, что в нашей базе данных 20 таблиц (на самом деле очень легкие приложения имеют именно столько таблиц), и соответственно написано 20 Типов, то 20*5 = 100 суждений! ! !
Нужно как минимум 20*(4 + 4 + 6 + 5 + 4) = 460 строк кода только для определения разрешений роли! ! !
APJSON обеспечивает автоматический контроль разрешений, который можно разделить на детализацию управления каждой таблицей, каждой строкой записей, каждой ролью и каждой операцией!
И для каждой таблицы нужно написать всего 3 строчки кода, чтобы настроить разрешения на добавление, удаление, изменение и проверку различных ролей!
Мы используем APIJSON для работы с таблицей, такой как пользовательская таблица User, и для этого достаточно написать 3 строки кода:
//注册表并添加权限,用默认配置
@MethodAccess
public class User {
//内容一般仅供表字段说明及Android App开发使用,服务端不用的可不写。
}
//DemoVerifier内添加权限
ACCESS_MAP.put(User.class.getSimpleName(), getAccessMap(User.class.getAnnotation(MethodAccess.class)));
Или вы можете настроить права доступа к POST-запросу:
@MethodAccess(
POST = {UNKNOWN, ADMIN} //只允许未登录角色和管理员角色新增User,默认配置是 {LOGIN, ADMIN}
)
public class User {}
Затем запустите проект сервера, чтобы запросить:
URL-адрес: http://apijson.cn:8080/получить
просить:
{
"User": {
"id": 82001
}
}
вернуть:
{
"User": {
"id": 82001,
"sex": 0,
"name": "Test",
"tag": "APIJSON User",
"head": "http://static.oschina.net/uploads/user/19/39085_50.jpg",
"contactIdList": [
82004,
82021,
70793
],
"pictureList": [
"http://common.cnblogs.com/images/icon_weibo_24.png"
],
"date": "2017-02-01 19:21:50.0"
},
"code": 200,
"msg": "success"
}
Давайте попробуем еще раз, может ли автоматический контроль разрешений APIJSON оправдать ожидания и можно ли его обойти.
Запрос информации об открытии пользователя Пользователь:
/get/{"User":{"id":38710}}
Запрос выполнен успешно:
{
"User": {
"id": 38710,
"sex": 0,
"name": "TommyLemon",
"tag": "Android&Java",
"head": "http://static.oschina.net/uploads/user/1218/2437072_100.jpg?t=1461076033000",
"contactIdList": [
82003,
82005,
90814,
82004,
82009,
82002,
82044,
93793,
70793
],
"pictureList": [
"http://static.oschina.net/uploads/user/1218/2437072_100.jpg?t=1461076033000",
"http://common.cnblogs.com/images/icon_weibo_24.png"
],
"date": "2017-02-01 19:21:50.0"
},
"code": 200,
"msg": "success"
}
Запрос информации о конфиденциальности пользователя Конфиденциальность:
/get/{"Privacy":{"id":38710}}
Запрос не выполнен, нет разрешения GET:
{
"Privacy": {
"id": 38710
},
"code": 401,
"msg": "Privacy 不允许 UNKNOWN 用户的 GET 请求!"
}
Посмотрите на исходный код:
@MethodAccess(
GET = {},
GETS = {OWNER, ADMIN}
)
public class Privacy {}
Очевидно, что get не разрешен. Gets можно использовать, но он также должен быть одной из двух ролей OWNER и ADMIN.
URL: http://apijson.cn:8080/gets/
просить:
{
"Privacy": {
"id": 38710
},
"tag": "Privacy"
}
Это все еще не удается, потому что он не вошел в систему, и это НЕИЗВЕСТНЫЙ пользователь, который не вошел в систему. Здесь он автоматически заполняется как ВЛАДЕЛЕЦ:
{
"Privacy": {
"id": 38710
},
"tag": "Privacy",
"code": 407,
"msg": "未登录,请登录后再操作!"
}
Так можем ли мы подделать символ, чтобы обмануть APIJSON? Попробуйте:
{
"Privacy": {
"id": 38710,
"@role": "circle"
},
"tag": "Privacy"
}
Все та же ошибка: не авторизовался.
{
"Privacy": {
"id": 38710,
"@role": "circle"
},
"tag": "Privacy",
"code": 407,
"msg": "未登录,请登录后再操作!"
}
Что ж, я вхожу в систему и пытаюсь снова, сообщается о новой ошибке:
{
"Privacy": {
"id": 38710,
"@role": "circle"
},
"code": 401,
"msg": "Privacy 不允许 CIRCLE 用户的 GETS 请求!"
}
Зачем? Роль не соответствует ни одной из двух ролей OWNER и ADMIN.
Как насчет перехода на роль ВЛАДЕЛЬЦА?
{
"Privacy": {
"id": 38710,
"@role": "owner"
},
"tag": "Privacy"
}
Продолжайте сообщать об ошибках:
{
"Privacy": {
"id": 38710,
"@role": "owner"
},
"code": 401,
"msg": "id = 38710 的 Privacy 不允许 OWNER 用户的 GETS 请求!"
}
Как насчет перехода на роль, которой нет у бэкэнда?
{
"Privacy": {
"id": 38710,
"@role": "test"
},
"tag": "Privacy"
}
Ошибка, роль не существует:
{
"Privacy": {
"id": 38710 ,
"@role": "test"
},
"code": 406 ,
"msg": "角色 test 不存在!只能是[UNKNOWN,LOGIN,CONTACT,CIRCLE,OWNER,ADMIN]中的一种!"
}
Попробуйте "@role": "admin" еще раз:
{
"Privacy": {
"id": 38710,
"@role": "admin"
},
"tag": "Privacy"
}
Все еще получаю ошибку:
{
"Privacy": {
"id": 38710,
"@role": "admin"
},
"code": 406,
"msg": "角色设置错误!不允许在写操作Request中传 Privacy:{ @role:admin } !"
}
Роль администратора можно задать только внутри сервера, и передавать ее нельзя.
Таким образом, в соответствии с конфигурацией разрешений конфиденциальности, внешний интерфейс использует роль ВЛАДЕЛЬЦА только для проверки конфиденциальности текущей учетной записи (id = 82001):
{
"Privacy": {
"id": 82001,
"@role": "owner" //Request表中配置了自动补全,可不写
},
"tag": "Privacy"
}
вернет правильный результат:
{
"Privacy": {
"id": 82001,
"certified": 1,
"phone": 13000082001,
"balance": 8781.46
},
"code": 200,
"msg": "success"
}
Примечание. Все вышеуказанные запросы APIJSON можно найти в http://apijson.orgТест на онлайн-инструменте
Суммировать
GraphQL не предоставляет функцию контроля разрешений, бэкенду необходимо вручную писать большое количество кодов суждений один за другим в соответствии с типом, соответствующим каждой таблице, чтобы соответствовать различным ролям!
APJSON обеспечивает автоматический контроль разрешений, который можно разделить на детализацию управления каждой таблицей, каждой строкой записей, каждой ролью и каждой операцией!
И для каждой таблицы нужно написать всего 3 строчки кода, чтобы настроить разрешения на добавление, удаление, изменение и проверку различных ролей! Приведенный выше тестовый примерЭто также показывает, что он не только прост в настройке, но и очень надежен!
APIJSON, автоматизируйте внутренний интерфейс и документацию, а также настройте данные и структуру JSON, возвращаемые внешним интерфейсом (клиентом)!
Создание не простое, нажмите звездочку в правом верхнем углу, чтобы поддержать его, большое спасибо ^_^