发出 POST 请求时出现推送错误的 Laravel WebSocket
Posted
技术标签:
【中文标题】发出 POST 请求时出现推送错误的 Laravel WebSocket【英文标题】:Laravel WebSocket with Pusher Error when making POST Request 【发布时间】:2021-06-14 03:20:32 【问题描述】:我正在尝试将 web socket 集成到我的 laravel 项目中。我从here完成了所有步骤
composer require pusher/pusher-php-server
/Users/alpha/Sites/jdoe/config/broadcasting.php
https://dashboard.pusher.com/apps/888
app_id = "888"
key = "***"
secret = "333"
cluster = "us2"
|
V
BROADCAST_DRIVER=pusher
PUSHER_APP_ID=888
PUSHER_APP_KEY=***
PUSHER_APP_SECRET=333
PUSHER_APP_CLUSTER=us2
.env.example + .env
npm install --save laravel-echo pusher-js
npm run watch
---------------------------------------------------
php artisan make:event logEvent
<?php
namespace App\Events;
use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
class logEvent implements ShouldBroadcast
use Dispatchable, InteractsWithSockets, SerializesModels;
private $data;
/**
* Create a new event instance.
*
* @return void
*/
public function __construct($data)
$this->data = $data;
/**
* Get the channels the event should broadcast on.
*
* @return \Illuminate\Broadcasting\Channel|array
*/
public function broadcastOn()
return new Channel('logEventChannel');
public function broadcastWith()
return [
'data' => $this->data
];
---------------------------------------------------
/Users/alpha/Sites/jdoe/resources/js/app.js
require('./bootstrap');
Echo.channel('logEventChannel').listen('logEvent', (e) =>
// console.log(typeof JSON.parse(JSON.stringify(e))) //object
// console.log(typeof JSON.parse(JSON.stringify(e.data))) //string
// console.log(JSON.parse(e.data)); //decode or parse it
let data = JSON.parse(e.data);
/*=============================
= Debug =
=============================*/
console.log('data ===== ',data);
);
---------------------------------------------------
route
Route::post('ws/log', 'BroadcastController@logEvent');
---------------------------------------------------
Controller
<?php
namespace App\Http\Controllers;
use App\Events\LogEvent;
use Illuminate\Http\Request;
class BroadcastController extends Controller
public function vnfevent(Request $request)
$body = json_decode($request->getContent(),true);
dd($body); ????
$json = json_encode($body);
broadcast(new LogEvent($json));
return response()->json($body,200);
---------------------------------------------------
CSRF
/Users/alpha/Sites/jdoe/app/Http/Middleware/VerifyCsrfToken.php
protected $except = [
'/ws/log'
];
---------------------------------------------------
TEST
POSTman
ws/log
"type": "poop"
place a dd in broadbast
arrived !!
array:1 [
"type" => "poop"
]
ErrorException: array_merge(): Expected parameter 2 to be an array, null given in file
---------------------------------------------------
Debug the crashing line
/Users/alpha/Sites/jdoe/vendor/pusher/pusher-php-server/src/Pusher.php
dd($post_params, $params);
$all_params = array_merge($post_params, $params);
array:3 [▼
"name" => "App\Events\logEvent"
"data" => array:1 [▼
"data" => ""type":"poop""
]
"channels" => array:1 [▼
0 => "logEventChannel"
]
]
Look correct
我测试了在我的 /ws/log 上发帖
"type": "poop"
我一直得到
ErrorException: array_merge(): Expected parameter 2 to be an array, null 在文件 /Users/alpha/Sites/jdoe/vendor/pusher/pusher-php-server/src/Pusher.php 第 518 行给出
我打开了那个文件
$all_params = array_merge($post_params, $params);
$params 一些方法 = null
如何继续进一步调试?
编辑
我删除了我的 vendor/ 并按照建议尝试了 4.1 版。
"require":
"php": "^7.2.5",
"doctrine/dbal": "^2.10",
"fideloper/proxy": "^4.2",
"fruitcake/laravel-cors": "^1.0",
"guzzlehttp/guzzle": "^6.3",
"intervention/image": "^2.3",
"laravel/framework": "^7.0",
"laravel/tinker": "^2.0",
"laravelcollective/html": "~6.0",
"pusher/pusher-php-server":"^4.1"
,
我在通过 POSTman 向我的路线发送 POST 时仍然遇到问题。
【问题讨论】:
【参考方案1】:所以对于这个问题,其实这是 Laravel 的一个问题,现在已经解决了 使用 (laravel 8.29.0) 或更高版本。 所以 pusher-http-php 库 v5.0.1 和 Laravel v8.29.0 可以很好地为你工作。
另一个解决方案: 是在 composer.json 上将 pusher 降级到 4.1 版本,这个版本似乎可以与旧的 laravel 版本(早于 8.29.0)一起正常工作。
如果您想解决当前安装的问题:
问题是触发函数的调用,至少在 laravel 8 上没有发送正确的参数,所以在PusherBroadcaster.php
和pusher-php-server/Pusher.php
中有两个触发函数调用:
$this->pusher->trigger(
$this->formatChannels($channels), $event, $payload, $socket, true
);
和
public function trigger($channels, $event, $data, $params = array(), $already_encoded = false)
您只需更改Pusher
。
1- 更改(第 496 行)。
$data_encoded = $this->crypto->encrypt_payload($channels[0], $already_encoded ? $data : json_encode($data));
收件人:
$data_encoded = $this->crypto->encrypt_payload($channels[0], $already_encoded && !is_array( $data) ? $data : json_encode($data));
2- 更改(第 499 行)。
$data_encoded = $already_encoded ? $data : json_encode($data);
收件人:
$data_encoded = $already_encoded && !is_array( $data) ? $data : json_encode($data);
3- 更改(第 518 行)
$all_params = array_merge($post_params, $params);
收件人:
$all_params = array_merge($post_params, is_array($params) ? $params:[]);
4- 更改(第 542 行)
return $result;
收件人:
return $response;
这会让它对你很好。
注意:正如我所说,它已在 Laravel 的 v8.29.0 中得到解决。 Link注意:或者你可以使用composer require pusher/pusher-php-server ^4.1
请注意:
主要问题是 $param
在这种情况下是 null
并且它没有检查这个值是否是 array()
所以当代码尝试将 array()
与 null
合并时。
资源:
Link_1Link_2Link_3
【讨论】:
以上是关于发出 POST 请求时出现推送错误的 Laravel WebSocket的主要内容,如果未能解决你的问题,请参考以下文章
使用 Go 向 APNS 发出推送请求时出现 403 禁止错误。我是不是正确创建了 JWT?
发出 POST 请求时出现 Google Cloud Function CORS 错误