Я пишу API-оболочку .NET для API Netflix.
На этом этапе я могу выбрать представление URL-адресов в виде строк или объектов URI. Мне кажется, что у обоих есть хорошие основания.
Итак, если бы вы использовали API, что бы вы предпочли?





Приведенная ниже цитата взята из: Принципы проектирования каркаса
Я высоко рекомендую эту книгу всем, кто разрабатывает фреймворки на .Net.
Do use System.Uri to represent URI / URL data.
(For Parameters, properties, and return values)System.Uri is a much safer and richer way of representing URIs. Extensive manipulation of URI-related data using plain strings has been shown to cause many security and correctness problems.
Consider providing string-based overloads for most commonly used members with System.Uri parameters.
In cases where the usage pattern of taking a string from a user will be common enough, you should consider adding a convenience overload accepting a string. The string-based overload should be implemented in terms of the Uri-based overload.
Do Not automatically overload all Uri-based members with a version that accepts a string.
Generally, Uri-based APIs are preferred. String-based overloads are meant to be helpers for the most common scenarios. Therefore, you should not automatically provide string-based overloads for all variants of the Uri-based members. Be selective and provide such helpers just for the most commonly used variants.
РЕДАКТИРОВАТЬ (за комментарии): В книге конкретно говорится: «Было показано, что обширные манипуляции с данными, относящимися к URI, с использованием простых строк вызывают множество проблем с безопасностью и правильностью». Я не уверен, какое дополнительное обоснование вам нужно для использования System.Uri / UriBuilder. Кроме того, почему бы вам не воспользоваться фреймворком для чтения / управления URI?
При разработке API, который будет использоваться другими, важно сделать их доступными, а также надежный. По этой причине в книге упоминается, что вы должны предоставить «хорошие» перегрузки для общих функций. Однако для обеспечения корректности вы всегда должны реализовывать базовый код с URI.
Не могли бы вы пояснить свои желания или причины использовать только строки?
Бонусный балл за ссылку на книгу, о которой я не знал до сих пор.
Но почему? Я прочитал книгу, и на самом деле это не оправдывает такое решение.
Вы спросите: «Почему бы вам не воспользоваться фреймворком для чтения / управления URI?». Что ж, большинство предоставляемых фреймворком функций для управления URI работают со строкой, а не с System.Uri. Это осознание и вызвало в первую очередь этот вопрос.
Я бы сказал, что вы должны представить его как URI. Однако, если я являюсь пользователем вашего API и мне приходится постоянно преобразовывать строковые URL-адреса в URI, чтобы использовать ваш API, то я был бы взбешенным пользователем.
Я говорю о том, что вам нужно оценить, какая аудитория будет использовать ваш API.
Зачем использовать URI? Что это на самом деле дает?
Одна вещь, которую я обнаружил, заключалась в том, что при написании методов, принимающих string, мне всегда приходилось инициализировать объект Uri в любом случае только для проверки строки, чтобы UriFormatException затем распространялся из метода, если пользователь передал неверную строку. Но если вы принимаете только Uri, как это сделал я после того, как на меня (справедливо) накричал FxCop, то вы всегда знаете, что ваш ввод действителен - что мне кажется очень хорошим признаком того, что вы правильно проектируете свой API.
Как оказалось, я знаю, что все мои URL-адреса верны, потому что они либо созданы мной, либо переданы мне из надежного источника. Так что, кроме проверки, дает ли это вам что-нибудь на самом деле?
Что ж, это дает вам то же самое, что и принятие int, когда вам нужно целое число (в отличие от строки, а затем вызов int.Parse).
Хотите рассказать о случаях, которые вы могли бы сделать для обоих?