2008-10-18 11 views
11

Estoy escribiendo una .NET wrapper API para la API de Netflix.Cadenas o URI en API .NET?

En este punto puedo elegir representar las URL como cadenas u objetos URI. Me parece que hay un buen caso para ambos.

Entonces, si estuviera usando una API, ¿cuál preferiría?

+0

¿Te gustaría compartir las fundas que podrías hacer para ambos? – Quantenmechaniker

Respuesta

17

La cita es de más abajo: Framework Design Guildelines
I altamente recomienda este libro a cualquier persona en los marcos de desarrollo .Net

No utilizar System.Uri para representar datos URI/URL.
(para parámetros, propiedades y valores de retorno)

System.Uri es una mucho más segura y más rica forma de representar URIs. La amplia manipulación de de datos relacionados con URI utilizando cadenas simples ha demostrado causar muchos problemas de seguridad y corrección .

Considere que proporciona sobrecargas basadas en cadenas para los miembros más comúnmente usados ​​con parámetros System.Uri.

En los casos en que el patrón de uso de teniendo una cadena de un usuario se le bastante comunes, se debe considerar la adición de una sobrecarga conveniencia aceptar una cadena. La sobrecarga de basada en cadenas debe implementarse en términos de la sobrecarga basada en Uri.

Do not sobrecargan automáticamente todos los miembros basados ​​en Uri con una versión que acepta una cadena.

Generalmente, las API basadas en Uri son preferidas. Las sobrecargas basadas en cadenas son destinadas a ser ayudantes para la mayoría de los escenarios comunes . Por lo tanto, no debería proporcionar automáticamente sobrecargas basadas en cadenas para todas las variantes de los miembros basados ​​en Uri. Sea selectivo y proporcione dichos auxiliares solo para las variantes más comunes .

EDITAR (por los comentarios): El libro establece específicamente: "extenso manipulación de los datos relacionados con el URI utilizando cuerdas de civil se ha demostrado que causa muchos problemas de seguridad y exactitud." No estoy seguro de qué justificación adicional desea para usar System.Uri/UriBuilder. Además, ¿por qué no quieres aprovechar el marco para leer/manipular un URI?

Al diseñar una API que será utilizada por otros, es importante hacerla accesible, , así como confiable. Por esta razón, el libro menciona, debe proporcionar sobrecargas "agradables" para la funcionalidad común. Sin embargo, para garantizar la corrección, siempre debe implementar el código subyacente con URI.

¿Puede aclarar sus deseos o razones para usar solo cadenas?

+0

Punto de bonificación por proporcionar el enlace al libro, que no sabía hasta ahora. – OregonGhost

+0

¿Pero por qué? He leído el libro y en realidad no justifica esa decisión. –

+0

Pregunta: "¿por qué no quiere aprovechar el marco para leer/manipular un URI?". Bueno, la mayoría de las funciones proporcionadas por el marco para manipular URI funcionan en cadena, no en System.Uri. Esa comprensión es lo que provocó esta pregunta en primer lugar. –

1

Yo diría que debe representarlo como URI. Sin embargo, si soy un usuario de su API y tengo que convertir continuamente URL basadas en cadenas a URI para usar su API, entonces sería un usuario cabreado.

Lo que estoy diciendo es que debe evaluar qué tipo de público consumirá su API.

+0

¿Por qué usar un URI? ¿Qué te da realmente? –

0

Una cosa que encontré fue que al escribir string métodos -accepting, siempre tendría para inicializar un objeto Uri de todos modos sólo para validar la cadena, de manera que la UriFormatException entonces propagarse fuera del método si el usuario aprobó una mala cuerda. Pero si solo acepta Uri s, como lo hice después de que FxCop me gritara (con razón), siempre sabrá que su entrada es válida, lo que para mí es una muy buena señal de que está diseñando su API correctamente.

+0

Da la casualidad, sé que todas mis direcciones URL son correctas porque las he generado o me las ha proporcionado una fuente confiable. Así que aparte de la validación, ¿realmente le da algo? –

+1

Bueno, te da lo mismo que aceptar un "int" cuando deseas un entero (a diferencia de una cadena, y luego llamar a int.Parse). – Domenic