sistema - laravel passport tutorial español
¿Puedes tener tu API y comerla(consumirla) en Laravel? (2)
He creado una API que devuelve json en Laravel. ( routes / api.php )
Ahora quiero consumir dicha API dentro de mi web
del proyecto ( routes / web.php (incluido el middleware), vistas de blade, etc.).
La solución actual que tengo es algo como esto:
public function register(Request $request) {
// password1 == password2 etc (form logic / validation)
$internal_request = Request::create($this->base_api_url . ''register'', ''POST'');
$internal_request->replace($request->input());
$response = Route::dispatch($internal_request);
}
Que "reenvía" la solicitud a la contraparte de API de mi api si el formulario es válido. Pero tengo la sensación de que esto no es realmente una buena práctica o inteligente. Otras rutas, excepto el login
y el register
utilizan el token api almacenado en la sesión para realizar las llamadas. añaden el token "x-token" como encabezado a $internal_request
. ¿Es mejor hacer esto en middleware? ¿Hay algún ejemplo de una mejor implementación en algún lado?
Mi API tiene un método como este:
POST api/register
Que verifica si los campos requeridos existen y tienen el formato rigt (validación)
y mi ruta web tiene /register
Esto primero verificará si las contraseñas coinciden con las entradas de validación de contraseñas (pass1 == pass2) y luego las pasará al equivalente de la API.
Entonces web
debería ser un superconjunto (validación sabia) de api
.
Como entiendo su pregunta, desea aplicar la misma lógica a las solicitudes API y de API, y puede que quiera (a) validar el formulario para una solicitud web y / o (b) ajustar la respuesta en json para una solicitud API .
Creo que la mejor manera de hacer esto sería consultar el mismo controlador y método para las solicitudes web y de API , por ejemplo:
En sus rutas / web.php, agregue Route::post(''/register'', ''RegistrationController@register
); `
Y en sus rutas / api.php, agregue Route::post(''/register'', ''RegistrationController@register
) `
Entonces, eventualmente ambas solicitudes (api / register y / register) golpean el mismo controlador y método.
Ahora, en su controlador, puede realizar las acciones adicionales de acuerdo con la solicitud, como sigue:
public function register(Request $request) {
if(!$request->expectsJson()) { // you may want to swap this with $request->isJson() depending on the HTTP headers for your app
$this->validateWebRegistration($request); // your validation logic specific to web requests here
}
// common logic here (including validation); store result as $result
if($request->expectsJson()) { // based on HTTP headers as above
return response()->json($result);
} else {
return view(''register'', $result);
}
}
Creo que lo haré de esta manera:
- detectar en el controlador si tratamos con una solicitud API o una solicitud web
- detectar las credenciales corrosivas (token o sesión)
- forma lógica si web
- hacer api logic en ambas situaciones
- crear una vista o una respuesta json en consecuencia
- todo en el mismo controlador