如何在Laravel中通过sendSignal路由向receiveSignal路由模拟发送并接收JSON数据?
问题解答:模拟Laravel路由间的数据传递
首先直接给结论:你当前的做法完全不可行。访问/sendSignal只会触发sendSignal方法并返回JSON给浏览器,不会自动调用/receiveSignal路由——receiveSignal方法根本没被执行,自然拿不到任何数据。
要实现从sendSignal向receiveSignal发送数据,你需要在sendSignal方法里主动发起一个HTTP请求到receiveSignal路由,下面是具体的修改方案:
步骤1:优化路由定义(可选但推荐)
给路由命名,后续调用时不用硬写URL,更灵活:
Route::get('/receiveSignal', 'SignalController@receiveSignal')->name('receiveSignal'); Route::get('/sendSignal', 'SignalController@sendSignal')->name('sendSignal');
步骤2:修改sendSignal方法,主动发起请求
Laravel自带了封装好的HTTP客户端(基于Guzzle),用它发送请求最便捷:
use Illuminate\Support\Facades\Http; public function sendSignal() { $data = [ 'spotid' => '421156', 'name' => 'Test', 'desc' => 'some desc', 'StartofDetection' => '2018-01-17 22:22:22' ]; // 方式1:发送表单格式的数据(Laravel默认会自动解析) $response = Http::post(route('receiveSignal'), $data); // 方式2:发送原始JSON数据(如果需要严格传递JSON格式) // $response = Http::withHeaders(['Content-Type' => 'application/json']) // ->post(route('receiveSignal'), json_encode($data)); // 返回请求结果,方便你查看反馈 return "信号已发送!receiveSignal的响应:" . $response->body(); }
步骤3:修改receiveSignal方法,正确接收数据
根据你选择的发送方式,调整接收逻辑:
use Illuminate\Http\Request; public function receiveSignal(Request $request) { // 如果你用方式1(表单数据),直接用Laravel的Request对象获取 $data = $request->all(); dd($data); // 如果你用方式2(原始JSON),可以继续用php://input,或者更符合Laravel风格的写法: // $rawJson = file_get_contents('php://input'); // $data = json_decode($rawJson, true); // dd($data); // 或者直接用Request的json方法解析: // $data = $request->json()->all(); // dd($data); }
为什么原方案不行?
你原来的sendSignal只是把JSON字符串返回给浏览器,没有任何代码触发对/receiveSignal的请求。receiveSignal方法只有当有人访问/receiveSignal这个路由时才会执行,所以之前的代码根本不会走到receiveSignal的dd($test)这一步。
另外补充一点:GET请求的php://input通常是空的,所以如果要传递这类结构化数据,用POST请求更合理,这也是上面示例用POST的原因。
内容的提问来源于stack exchange,提问作者harunB10
相关产品推荐
相关产品推荐

