Как отправить сообщение на конкретный connectionId для веб-сокетов шлюза aws api? - PullRequest
0 голосов
/ 26 октября 2019

Я использую этот код для установки нового соединения на пользовательском устройстве.

var socket = new WebSocket("wss://cdsbxtx2xi.execute-api.us-east-2.amazonaws.com/test"); 
socket.onmessage = function (event) {
  json = JSON.parse(event.data);
  connectionId = json.connectionId;
  document.cookie = "connection_id="+connectionId;
  console.info(json);
}

Предположим, из этого запроса я получаю connectionId CLO5bFP1CYcFSbw =

Другой пользователь с другого устройства также установил новоесоединение с ID соединения Cs42Fs5s5yuSbc =. Теперь, как я могу отправить сообщение с устройства пользователя 2 пользователю 1?

Я уже пробовал это. Я не знаю, верный это путь или нет, но все же я открыт для любых предложений.

use Aws\Signature\SignatureV4;
use GuzzleHttp\Client;
use GuzzleHttp\Psr7\Request;
use Aws\Credentials\Credentials;
$client =  new GuzzleHttp\Client();
$credentials = new Credentials("XXXXXXXXXX","XXXXXXXX");
$url = "https://cdsbxtx2xi.execute-api.us-east-2.amazonaws.com/test/@connections/CLO5bFP1CYcFSbw=";
$region = 'us-east-2'; 
$msg['action'] = 'sendmessage';
$msg['data'] = 'hello world';
$msg = json_encode($msg);
$request = new Request('POST', $url, '["json"=>$msg]');

$s4 = new SignatureV4("execute-api", $region);
$signedrequest = $s4->signRequest($request, $credentials); 
$response = $client->send($signedrequest);
echo $response->getBody();

Этот код продолжает загружаться и, наконец, выдает ошибку времени ожидания шлюза.

Я ожидаючто пользователь 2 должен иметь возможность отправлять сообщения на любой конкретный идентификатор соединения через wss или https.

Я попытался использовать https, подписав этот запрос, но подпись не работает. Я получаю сообщение об ошибке с подписью

1 Ответ

0 голосов
/ 27 октября 2019

После борьбы с этой проблемой в течение последних 3 дней я наконец нашел решение. Ни одно из ранее упомянутых решений для StackOverflow не работало для меня.

Это правильное решение. Я надеюсь, что это будет полезно для кого-то.

use Aws\Signature\SignatureV4;
use GuzzleHttp\Client;
use GuzzleHttp\Psr7\Request;
use Aws\Credentials\Credentials;
$client =  new GuzzleHttp\Client();
$credentials = new Credentials(accessKeyId, secretAccessKey);
$url = "https://xsdsdsd.execute-api.us-east-2.amazonaws.com/test/@connections/CNtBveH2iYcCKrA="; 
// CNtBveH2iYcCKrA= is connectionid
$region = 'us-east-2'; 
$msg['action'] = 'sendmessage';
$msg['data'] = 'hello world'; 
$msg = json_encode($msg); 
$headers = array('Content-Type => application/x-www-form-urlencoded');
$request = new GuzzleHttp\Psr7\Request('POST', $url, ['Content-Type' => 'application/json'], $msg); 
$signer = new Aws\Signature\SignatureV4('execute-api', $region); 
$request = $signer->signRequest($request, $credentials);
$headers = array('Content-Type => application/x-www-form-urlencoded');
$client = new \GuzzleHttp\Client([ 'headers' => $headers]);
$response = $client->send($request);
$result = $response->getBody();
...