Estaba diseñando una aplicación web y luego me detuve a pensar en cómo debería diseñarse mi api como un servicio web RESTful. Por ahora, la mayoría de mis URI son genéricos y pueden aplicarse a varias aplicaciones web:
GET /logout // destroys session and redirects to /
GET /login // gets the webpage that has the login form
POST /login // authenticates credentials against database and either redirects home with a new session or redirects back to /login
GET /register // gets the webpage that has the registration form
POST /register // records the entered information into database as a new /user/xxx
GET /user/xxx // gets and renders current user data in a profile view
POST /user/xxx // updates new information about user
Tengo la sensación de que estoy haciendo mucho mal aquí después de hurgar en SO y Google.
Comenzando con /logout
, quizás ya que realmente no tengo GET
nada, puede ser más apropiado para POST
una solicitud /logout
, destruir la sesión y luego GET
la redirección. ¿Y debería /logout
quedarse el plazo?
¿Qué pasa con /login
y /register
. Podría cambiar /register
a, /registration
pero eso no altera el funcionamiento fundamental de mi servicio, si tiene problemas más profundos.
Ahora me doy cuenta de que nunca expongo un /user
recurso. Quizás eso podría utilizarse de alguna manera. Por ejemplo, tomemos al usuario myUser
:
foo.com/user/myUser
o
foo.com/user
El usuario final no requiere esa verbosidad adicional en el URI. Sin embargo, ¿cuál es más atractivo visualmente?
Noté algunas otras preguntas aquí en SO sobre este negocio REST, pero realmente agradecería alguna orientación sobre lo que he presentado aquí si es posible.
¡Gracias!
ACTUALIZAR:
También me gustaría algunas opiniones sobre:
/user/1
vs
/user/myUserName
fuente
Respuestas:
Una cosa destaca en particular como no REST-ful: el uso de una solicitud GET para cerrar la sesión.
(de http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Safe_methods )
En cuanto al cierre de sesión y la redirección, puede hacer que una publicación en su URI de cierre de sesión dé una respuesta 303 que redirija a la página posterior al cierre de sesión.
http://en.wikipedia.org/wiki/Post/Redirect/Get
http://en.wikipedia.org/wiki/HTTP_303
Edite para abordar los problemas de diseño de URL:
"¿Cómo diseño mis recursos?" es una pregunta importante para mi; "¿Cómo diseño mis URL?" es una consideración en dos áreas:
Las URL que verán los usuarios no deben ser demasiado feas y significativas si es posible; Si desea que las cookies se envíen en solicitudes a algún recurso pero no a otros, querrá estructurar sus rutas y rutas de cookies.
Si
JRandomUser
quiere ver su propio perfil y desea que la URL sea más bonita quefoo.com/user/JRandomUser
ofoo.com/user/(JRandom's numeric user id here)
, puede crear una URL separada solo para que un usuario vea su propia información:Afirmaría ignorancia mucho más fácilmente que sabiduría sobre este tema, pero aquí hay algunas consideraciones sobre el diseño de recursos:
fuente
GET foo.com/profile/
), ¿sería parte de, como sugirió momo, la capa de presentación? En otras palabras, ¿qué deberíaGET
devolver exactamente esa solicitud? ¿Una página web o algún JSON?GET
,POST
,PUT
, yDELETE
recursos. Un sitio web es solo otra plataforma que accede a la API. En otras palabras, el diseño de la URL del sitio web es completamente diferente al diseño de la API RESTful. Por favor dime si sigo equivocado jaja.RESTful se puede utilizar como una guía para construir URL, y puede crear sesiones y recursos de usuarios :
GET /session/new
obtiene la página web que tiene el formulario de inicio de sesiónPOST /session
autentica las credenciales contra la base de datosDELETE /session
destruye la sesión y redirige a /GET /users/new
obtiene la página web que tiene el formulario de registroPOST /users
registra la información ingresada en la base de datos como un nuevo / usuario / xxxGET /users/xxx
// obtiene y muestra los datos del usuario actual en una vista de perfilPOST /users/xxx
// actualiza nueva información sobre el usuarioEstos pueden ser en plural o en singular (no estoy seguro de cuál es el correcto). Por lo general, lo he usado
/users
para una página de índice de usuario (como se esperaba) y/sessions
para ver quién inició sesión (como se esperaba).El uso del nombre en la URL en lugar de un número (
/users/43
vs./users/joe
) generalmente se debe al deseo de ser más amigable con los usuarios o los motores de búsqueda, no por requisitos técnicos. Cualquiera de los dos está bien, pero te recomiendo que seas constante.Creo que si va con el registro / inicio de sesión / cierre de sesión o
sign(in|up|out)
, no funciona tan bien con la terminología relajante.fuente
/new
aGET /session/
no RESTful? He oído que los verbos normalmente se dejan a los verbos HTTP (GET
,POST
, etc).Las sesiones no son RESTful
Sí, lo sé. Se está haciendo, generalmente con OAuth, pero en realidad las sesiones no son RESTful. No debería tener un recurso / login / logout principalmente porque no debería tener sesiones.
Si vas a hacerlo, hazlo DESCANSO. Los recursos son sustantivos y / login y / logout no son sustantivos. Yo iría con / session. Esto hace que la creación y el borrado sean una acción más natural.
POST vs. GET para sesiones es fácil. Si envía usuario / contraseña como variables, usaría POST porque no quiero que se envíe la contraseña como parte del URI. Aparecerá en registros y posiblemente quede expuesto sobre el cable. También corre el riesgo de que el software falle en las limitaciones de GET args.
Por lo general, uso la autenticación básica o ninguna autenticación con los servicios REST.
Creando usuarios
Es un recurso, por lo que no debería necesitar / registrarse.
Qué tipo de identificación usar es una pregunta difícil. Tienes que pensar en hacer cumplir la singularidad, en la reutilización de identificadores antiguos que fueron ELIMINADOS. Por ejemplo, no desea utilizar esos identificadores como claves externas en un backend si los identificadores se van a reciclar (si es posible). Sin embargo, puede tener una búsqueda para la conversión de identificación externa / interna para mitigar los requisitos de backend.
fuente
Simplemente hablaré de mi experiencia en la integración de varios servicios web REST para mis clientes, ya sea que se utilicen para aplicaciones móviles o para la comunicación de servidor a servidor, así como para la creación de API REST para otros. Aquí hay algunas observaciones que he recopilado de la API REST de otras personas, así como las que construimos nosotros mismos:
Como REST están diseñados como servicios, funciones como el inicio de sesión y el cierre de sesión normalmente devuelven un resultado de éxito / error (normalmente en formato de datos JSON o XML) que luego el consumidor interpretaría. Dicha interpretación podría incluir la redirección a la página web adecuada como mencionó.
Estos son algunos puntos de lo que he tratado. Espero que pueda proporcionarle algunas ideas.
Ahora, en cuanto a la implementación de su REST, estas son las implementaciones típicas que he encontrado:
Ejecute el cierre de sesión en el backend y devuelva JSON para indicar el éxito / fracaso de la operación
Envíe las credenciales al backend. Devuelve éxito / fracaso. Si tiene éxito, normalmente también devolverá el token de sesión, así como la información del perfil.
Envíe el registro al backend. Devuelve éxito / fracaso. Si tiene éxito, normalmente se trata de la misma manera que un inicio de sesión exitoso o puede optar por registrarse como un servicio distinto
Obtenga el perfil de usuario y devuelva el formato de datos JSON para el perfil del usuario
Publique información de perfil actualizada en formato JSON y actualice la información en el backend. Devolver éxito / fracaso a la persona que llama
fuente
Creo que este es un enfoque RESTful para la autenticación. Para iniciar sesión, utiliza
HttpPut
. Este método HTTP se puede utilizar para la creación cuando se proporciona la clave y las llamadas repetidas son idempotentes. Para LogOff, especifique la misma ruta en elHttpDelete
método. No se utilizan verbos. Pluralización adecuada de la colección. Los métodos HTTP apoyan el propósito.Si lo desea, puede sustituir la corriente por activa.
fuente
Recomendaría usar una URL de cuenta de usuario similar a Twitter, donde la URL de la cuenta de usuario sería algo
foo.com/myUserName
así como puede acceder a mi cuenta de Twitter con la URL https://twitter.com/joelbylerNo estoy de acuerdo con que el cierre de sesión requiera un POST. Como parte de su API, si va a mantener una sesión, entonces una identificación de sesión en forma de UUID podría ser algo que se puede usar para realizar un seguimiento de un usuario y confirmar que la acción que se está tomando está autorizada. Entonces, incluso un GET puede pasar la identificación de la sesión al recurso.
En resumen, recomendaría que lo mantenga simple, las URL deben ser cortas y memorables.
fuente