PHPFixing
  • Privacy Policy
  • TOS
  • Ask Question
  • Contact Us
  • Home
  • PHP
  • Programming
  • SQL Injection
  • Web3.0

Tuesday, February 1, 2022

[FIXED] How to send a request to another controller in Laravel using Guzzle

 February 01, 2022     guzzle, laravel, laravel-5.6, php     No comments   

Issue

I am trying to send a POST request using Guzzle to a route defined in my routes/web.php from a model. Both the model and the controller are defined in the same Laravel application. The controller action linked to the route returns a JSON response and works fine when called from javascript using Ajax. However, when I try to do this using Guzzle, I have the following error:

GuzzleHttp \ Exception \ ClientException (419)
Client error: `POST https://dev.application.com/login` resulted in a `419 unknown status` response

When searching for a solution, I read that it may be caused by a missing csrf token, so I added it to my reuqest, but I still get the same error.

Here's the model code that uses Guzzle to send the request:

$client = new Client();
$response = $client->post(APPLICATION_URL.'login', [
    'headers' => [
        'X-CSRF-Token' => csrf_token()
    ],
    'form_params' => [
        'socialNetwork' => 'L',
        'id_token' => $id
    ],
]);

APPLICATION_URL is simply the base URL of the application, starting with https://.

Am I missing something? Thanks in advance!


Solution

Don't send requests internally in your app, forward the call by dispatching post requests to routes instead

This method seems faster than using an HTTP client library like Guzzle

Your code should look something like this

$request = Request::create(APPLICATION_URL . 'login', 'POST', [
        'socialNetwork' => 'L',
        'id_token' => $id
    ]);
$request->headers->set('X-CSRF-TOKEN', csrf_token());
$response = app()->handle($request);
$response = json_decode($response->getContent(), true);

Update

You have to manually handle the response from internally dispatched routes, here's an example to get started

web.php

use Illuminate\Http\Request;

Route::get('/', function () {
    $request = Request::create('/test', 'POST', ['var' => 'bar']);
    $request->headers->set('X-CSRF-TOKEN', csrf_token());
    $response = app()->handle($request);
    $responseContent = json_decode($response->getContent(), true);
    return $responseContent;
});

Route::post('test', function () {
    $upperCaseVar = strtoupper(request()->var);
    return response(['foo' => $upperCaseVar]);
});

Access / route by GET request and get response from /test as if it's POST request Result

{
   "foo": "BAR"
}

Hope this helps



Answered By - Salim Djerbouh
  • Share This:  
  •  Facebook
  •  Twitter
  •  Stumble
  •  Digg
Newer Post Older Post Home

0 Comments:

Post a Comment

Note: Only a member of this blog may post a comment.

Total Pageviews

Featured Post

Why Learn PHP Programming

Why Learn PHP Programming A widely-used open source scripting language PHP is one of the most popular programming languages in the world. It...

Subscribe To

Posts
Atom
Posts
Comments
Atom
Comments

Copyright © PHPFixing