Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Websocket 与apollo link ws x-api-key授权抗争_Websocket_Apollo_Apollo Client_Aws Appsync - Fatal编程技术网

Websocket 与apollo link ws x-api-key授权抗争

Websocket 与apollo link ws x-api-key授权抗争,websocket,apollo,apollo-client,aws-appsync,Websocket,Apollo,Apollo Client,Aws Appsync,我正在使用Apollo连接到AWS Appsync API,该API由API密钥保护。通过http进行查询和变异没有问题,但我对使用WebSocket进行订阅并不熟悉 使用apollo link ws,我有以下内容,我不知道如何添加API密钥。任何善良的灵魂都能提供建议吗 const ws = new WebSocketLink({ uri: `wss://xxxxx.appsync-api.eu-west-1.amazonaws.com/graphql`, option

我正在使用Apollo连接到AWS Appsync API,该API由API密钥保护。通过http进行查询和变异没有问题,但我对使用WebSocket进行订阅并不熟悉

使用apollo link ws,我有以下内容,我不知道如何添加API密钥。任何善良的灵魂都能提供建议吗

const ws = new WebSocketLink({
      uri: `wss://xxxxx.appsync-api.eu-west-1.amazonaws.com/graphql`,
      options: {
        reconnect: true
      }
    });
顺便说一句,我假设wss的url与http的url相同……

apollo ws-link不能直接用于AWS AppSync订阅。请看一看处理AppSync授权和订阅的。这将使您的应用程序在几分钟内与AppSync一起工作


如果您想实现自己的订阅客户端,握手记录在中。

您是否查阅了用于构建JavaScript客户端应用程序的AppSync指南:

使用AWSAPSyncClient设置订阅非常轻松。它在设置订阅时自动使用WebSocket

我甚至不知道apollo link ws和apollo使用AppSync订阅时的复杂性。我只对React客户端的AppSync订阅有经验,但简单的JavaScript使用似乎相对简单

根据指南中的示例:

const client = new AWSAppSyncClient({
    url: url,
    region: region,
    auth: {
        type: type,
        credentials: credentials,
    }
});

client.hydrated().then(function (client) {
    //Now subscribe to results
    const observable = client.subscribe({ query: subquery });

    const realtimeResults = function realtimeResults(data) {
        console.log('realtime data: ', data);
    };

    observable.subscribe({
        next: realtimeResults,
        complete: console.log,
        error: console.log,
    });
});

// Set up a subscription query
const subquery = gql(`
subscription NewPostSub {
newPost {
    __typename
    id
    title
    author
    version
}
}`);

对于Node.js的使用,本指南还显示了如何在示例代码中设置global.WebSocket和此类依赖项。

授权通常基于connectionParams,但AWS决定采用不同的方式,他们使用REST和自定义头实现了它

问题是WebSocket。是什么使它难以与阿波罗融合


AppSync的缺陷远不止这一个。无论如何,我不会推荐它做任何比博客或聊天更雄心勃勃的事情。更好地解释它的一些缺点。

谢谢,但它必须是阿波罗。我想要一个最终对后端不可知的设置。我的问题是如何将API密钥授权添加到Apollo-ws-link。请参阅我之前的评论。这是一个关于阿波罗的问题。我要找的只是一个添加API密钥的示例。我对Appsync不感兴趣,因为我希望能够使用其他后端。@Kwoxford是的,我看到了您之前的评论,使用AWSAPSyncClient over Amplify应该可以让您拥有更多的控制权。使用AppSync以外的其他后端并没有明确提到。无论如何,你可以考虑创建一个接口,并在引擎盖下使用AWSAP SysCyclipse,但是可能有一个更简单的方法。当问题原因不明时,请停止否决错误的答案。为了记录在案,这个问题因为不清楚而被否决了。我觉得它很清楚。“我不知道如何添加API密钥。”我还说“我对Appsync不感兴趣,因为我希望能够使用其他后端”。有什么不清楚的?我不明白为什么人们质疑这个问题而不是回答它。这行不通。GraphQL将订阅传输留给实现,因此规范中没有定义它,而您在上面的代码中定义的WSS链接将失败,因为AppSync中授权所需的握手尚未发生。强烈建议您使用AppSync SDK或反向工程它的连接握手,因为代码是OSS。谢谢。我想这就是我想要的答案!