Apache Thrift проверяет параметры? - PullRequest
2 голосов
/ 22 июня 2011

Я рассматриваю возможность использования Apache Thrift для PHP-сервера, который реализует веб-сервисы.

Если бы мой веб-сервис должен был принимать два параметра - имя пользователя в виде строки и пароль в виде целого числа - было бы полезно проверить, что параметры этих типов были предоставлены клиентом, или явсе еще нужно выполнить проверку на сервере?

Здесь я спрашиваю не о целях очистки входных данных, а о возврате осмысленных ответов об ошибках клиентам, а также о том, будет ли служба вызываться с неверными параметрами, даже запросы будут отправляться на сервер.

Ответы [ 2 ]

0 голосов
/ 24 апреля 2013

Это в основном зависит от того, о каком подтверждении мы говорим.

Если параметры необходимо установить, вы можете сделать их «обязательными». В этом случае поля проверяются в большинстве языковых реализаций (не во всех) во время десериализации, и возникает ошибка всякий раз, когда отсутствует повторный параметр. Тем не менее, обязательное значение возникает за счет потенциальных проблем с управлением версиями: вы не можете опустить обязательное поле после публикации API, иначе это нарушит совместимость.

Наличие нормальных («необязательных») значений обычно можно проверить с помощью флагов _isset, которые существуют именно для этой цели. Это то, за что отвечает ваш собственный код - Thrift обеспечивает механизмы обмена сообщениями, но, конечно, не интерпретацию ваших данных.

Если проверка в вашем случае означает, что формат данных (строка и число) должен быть проверен: поскольку код для клиента и сервера генерируется из файла Thrift IDL, реализация будет использовать правильный метод сериализации и десериализации поля согласно файлу IDL:

Service sample
{
  bool Login( 1: string Name, 2: i32 pwd)
}

Если вам необходимо по какой-либо причине изменить пароль из i32 в строку, технически это приводит к двум изменениям:

  1. удалить поле пароля с идентификатором 2, за исключением , если поле "обязательное"
  2. добавить новое поле с новым ID 3

так это выглядит так:

Service sample
{
  bool Login( 1: string Name, /*2: i32 _deprecated_pwd*/, 3: string pwd)
}

Поскольку тип поля и назначение поля связаны с числовым идентификатором поля, настоятельно рекомендуется использовать другой идентификатор поля в таком случае, который до сих пор не используется в этой области. Также рекомендуется оставить старые поля в IDL для указания устаревших идентификаторов.

Хорошую справку об этих «мягких версиях», а также о плюсах и минусах «обязательных» полей можно найти в «Руководстве по отсутствию» Дивакера Гупты.

0 голосов
/ 25 июня 2011

Насколько я понимаю, проверка - если таковая имеется - выполняется на "уровне библиотеки", где локальные типы переводятся в типы Thrift, где происходит генерация кода. Другими словами, это будет зависеть от привязок к конкретному языку, который вы используете (PHP, Erlang и т. Д.), Чтобы вызвать значимые - или нет - ошибки, если типы не соблюдаются. Но я должен рассмотреть это немного подробнее.

...