如何访问我在 Laravel 4 中手动发送的请求的查询字符串参数?

Posted

技术标签:

【中文标题】如何访问我在 Laravel 4 中手动发送的请求的查询字符串参数?【英文标题】:How can I access query string parameters for requests I've manually dispatched in Laravel 4? 【发布时间】:2013-05-11 22:27:30 【问题描述】:

我正在编写一个简单的 API,并在此 API 之上构建一个简单的 Web 应用程序。

因为我想直接“使用我自己的 API”,所以我首先在 Google 上搜索并在 *** 上找到了这个答案,它完美地回答了我最初的问题:Consuming my own Laravel API

现在,这很好用,我可以通过执行以下操作来访问我的 API:

$request = Request::create('/api/cars/'.$id, 'GET');
$instance = json_decode(Route::dispatch($request)->getContent());

这太棒了!但是,我的 API 还允许您向 GET 查询字符串添加可选的 fields 参数,以指定应返回的特定属性,例如:

http://cars.com/api/cars/1?fields=id,color

现在我在 API 中实际处理这个问题的方式大致如下:

public function show(Car $car)

     if(Input::has('fields'))
     
          //Here I do some logic and basically return only fields requested
          ....
     ...
 

我会假设我可以做一些类似于我之前使用查询字符串无参数方法所做的事情,如下所示:

$request = Request::create('/api/cars/' . $id . '?fields=id,color', 'GET');
$instance = json_decode(Route::dispatch($request)->getContent());

但是,似乎并非如此。长话短说,在单步执行代码之后,Request 对象似乎已正确创建(并且它正确提取了 fields 参数并为其分配了 id,color ),并且 Route 似乎可以正常发送,但是在我的 API 控制器本身中,我不知道如何访问 field 参数。使用Input::get('fields')(这是我用于“正常”请求的)不会返回任何内容,我很确定这是因为静态Input 引用或限定了传入的初始请求,而不是我发送的新请求从应用程序本身“手动”。

所以,我的问题是我应该怎么做?难道我做错了什么?理想情况下,我希望避免在我的 API 控制器中做任何丑陋或特殊的事情,我希望能够将 Input::get 用于内部调度的请求,而不必进行第二次检查等。

【问题讨论】:

【参考方案1】:

您是正确的,因为使用 Input 实际上是在引用当前请求,而不是您新创建的请求。您的输入将在您使用 Request::create() 实例化的请求实例本身上可用。

如果您使用(应该如此)Illuminate\Http\Request 来实例化您的请求,那么您可以使用 $request->input('key')$request->query('key') 从查询字符串中获取参数。

现在,这里的问题是您可能在路由中没有可用的 Illuminate\Http\Request 实例。这里的一个解决方案(以便您可以继续使用Input 外观)是物理替换当前请求的输入,然后将其切换回来。

// Store the original input of the request and then replace the input with your request instances input.
$originalInput = Request::input();

Request::replace($request->input());

// Dispatch your request instance with the router.
$response = Route::dispatch($request);

// Replace the input again with the original request input.
Request::replace($originalInput);

这应该可行(理论上),并且在发出内部 API 请求之前和之后,您仍然应该能够使用您的原始请求输入。

【讨论】:

这里要记住的一点是内部请求调用另一个内部请求的可能性。您可能需要保留一堆请求并存储原始输入,然后将最后一个请求从堆栈中弹出并相应地替换输入。 有什么方法可以将标头附加到创建的请求中(例如,发送带有请求的公共 api 密钥)?【参考方案2】:

我也刚刚面临这个问题,感谢 Jason 的出色回答,我才得以解决。

只是想补充一点,我发现 Route 也需要更换。否则Route::currentRouteName() 将在脚本后面返回调度的路由。

更多细节可以在我的blog post找到。

我还对堆栈问题进行了一些测试,并使用这种方法从彼此内部重复调用内部 API 方法。结果很好!所有请求和路由均已正确设置。

【讨论】:

感谢您的信息!是的,我最终创建了一个非常简单的模型,它什么都不做,只是在我“执行”请求之后自动处理这些数据位。再次感谢您的信息! 这个url返回404【参考方案3】:

如果您想调用内部 API 并通过数组(而不是查询字符串)传递参数,您可以这样做:

$request = Request::create("/api/cars", "GET", array(
   "id" => $id,
   "fields" => array("id","color")
));
$originalInput = Request::input();//backup original input
Request::replace($request->input());
$car = json_decode(Route::dispatch($request)->getContent());//invoke API
Request::replace($originalInput);//restore orginal input

参考:Laravel : calling your own API

【讨论】:

请求::替换不存在 @neoteknic 请检查一下laravel.com/api/4.2/Illuminate/Http/Request.html

以上是关于如何访问我在 Laravel 4 中手动发送的请求的查询字符串参数?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Passport:手动创建访问令牌

在 Laravel 中使用 AJAX GET 方法发送请求

我无法在 Angular 4 上向 laravel api 发送带有标头的 http 请求

如何在http post请求中发送参数以获取laravel中的数据

如何在 Laravel 中手动重新发送电子邮件验证?

如何在Laravel中手动重新发送电子邮件验证?