推动客户数据使用水银协议
编辑该页面异步的工作已经完成或创建聊天应用程序是典型的用例要求“推”功能。
ob娱乐下载Symfony提供了一个简单的组件,之上的美居酒店协议,专门为这类设计的用例。
水银是一个开放的协议而设计的发布更新从服务器到客户端。这是一个现代和高效的基于定时器的轮询和WebSocket替代。
因为它是建立在上面服务器发送的事件(SSE)水银是开箱即用的支持在现代浏览器(旧版本的边缘,即需要一个polyfill),并高层实现在许多编程语言。
美居酒店提供了一个授权机制,自动重新连接的网络检索的丢失更新问题,存在的API,“无连接”推动智能手机和auto-discoverability(支持客户端可以自动发现和订阅更新的给定资源由于特定的HTTP头)。
所有这些特性在Symfony的集成支持。ob娱乐下载
在这个记录你可以看到一个Symfony的webob娱乐下载 API利用水银和API平台更新生活反应应用和移动应用(本地)反应生成使用API平台客户端发电机。
管理持久连接,水银依赖于一个中心:一个专用的服务器处理持久上交所与客户的联系。Symfob娱乐下载ony应用将更新发布中心,广播他们的客户。
多亏了Symfony的码头工人集成ob娱乐下载,Flex建议安装一个水银中心。运行docker-compose起来
启动中心,如果你选择了这个选项。
如果你使用ob娱乐下载Symfony本地Web服务器,你必须开始的——no-tls
选择。
1
美元ob娱乐下载symfony服务器:开始——no-tls - d
环境变量。
当MercureBundle已经安装,.env
您的项目已经更新的文件Flex配方包括可用env var。
同样,如果您正在使用Symfony的码头工人集成本地Web服务器,ob娱乐下载ob娱乐下载Symfony码头工人或者是API平台分布,适当的环境变量自动设置,直接跳到下一节。
否则,设置你的中心的URL的值MERCURE_URL
和MERCURE_PUBLIC_URL
env var。有时必须由Symfony应用调用不同的URL(通常出版),和JavaScript客户机(通常订阅ob娱乐下载)。这是特别常见的Symfony应用时必须使用本地URL和一个公共客ob娱乐下载户端JavaScript代码。在这种情况下,MERCURE_URL
必须包含当地Symfony应用程序所使用的URL(例如ob娱乐下载https://mercure/.well-known/mercure
),MERCURE_PUBLIC_URL
公开的URL(例如https://example.com/.well-known/mercure
)。
客户也必须承担JSON Web标记(JWT)美居中心授权更新和发布,有时,订阅。
这个令牌必须签署相同的密钥使用的一个中心来验证智威汤逊(ChangeThisMercureHubJWTSecretKey !
如果你使用码头工人集成)。这必须存储在密钥MERCURE_JWT_SECRET
环境变量。MercureBundle将用它来自动生成和所需的jwt迹象。
除了这些环境变量,MercureBundle提供了一种更高级的配置:
秘密
:用来标志JWT的关键——相同大小的一个关键作为散列输出(例如,256位“HS256”)必须使用或更大。(所有其他选项,旁边算法
,订阅
,发布
将被忽略)发布
:一个主题列表允许出版在生成智威汤逊(时才可用秘密
,或工厂
提供)订阅
:允许订阅的主题列表生成智威汤逊(时才可用秘密
,或工厂
提供)算法
:该算法使用签署智威汤逊(时才可用秘密
提供)提供者
:一个服务调用的ID提供智威汤逊(所有其他选项将被忽略)工厂
:一个服务调用的ID来创建智威汤逊(所有其他选项,旁边订阅
,发布
将被忽略)价值
:原始JWT使用(所有其他选项将被忽略)
- YAML
- XML
- PHP
1 2 3 4 5 6 7 8 9 10 11 12 13
#配置/包/ mercure.yaml美居酒店:中心:默认值:url:https://mercure-hub.example.com/.well-known/mercurejwt:秘密:“ChangeThisMercureHubJWTSecretKey !”发布:(“foo”,“https://example.com/foo”]订阅:['酒吧',“https://example.com/bar”]算法:“hmac.sha256”供应商:“我的\提供者”工厂:“我的\工厂”值:“my.jwt”
更新值对象代表更新发布。它还提供了一个出版商
服务调度中心的更新。
的出版商
服务可以注射使用自动装配在任何其他服务,包括控制器:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
/ / src /控制器/ PublishController.php名称空间应用程序\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\美居酒店\HubInterface;使用ob娱乐下载\组件\美居酒店\更新;类PublishController扩展AbstractController{公共函数发布(HubInterface美元中心):响应{美元更新=新更新(“https://example.com/books/1”,json_encode (“状态”= >“OutOfStock”)));美元中心- >发布(美元更新);返回新响应(“发表!”);}}
第一个参数传递更新
构造函数是主题被更新。应该是这个主题IRI(国际化资源标识符,RFC 3987):一个惟一的标识符的资源被派出。
通常,这个参数包含资源的原始URL传递给客户端,但它可以是任何字符串或IRI,它不需要存在一个URL(类似于XML名称空间)。
第二个参数的构造函数的内容更新。它可以是任何东西,任何格式的存储。然而,超媒体格式序列化资源如JSON-LD、原子,建议HTML或XML。
出版商
服务调度中心的更新。
的出版商
服务可以注射使用自动装配在任何其他服务,包括控制器:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
/ / src /控制器/ PublishController.php名称空间应用程序\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\美居酒店\HubInterface;使用ob娱乐下载\组件\美居酒店\更新;类PublishController扩展AbstractController{公共函数发布(HubInterface美元中心):响应{美元更新=新更新(“https://example.com/books/1”,json_encode (“状态”= >“OutOfStock”)));美元中心- >发布(美元更新);返回新响应(“发表!”);}}
第一个参数传递更新
构造函数是主题被更新。应该是这个主题IRI(国际化资源标识符,RFC 3987):一个惟一的标识符的资源被派出。
通常,这个参数包含资源的原始URL传递给客户端,但它可以是任何字符串或IRI,它不需要存在一个URL(类似于XML名称空间)。
第二个参数的构造函数的内容更新。它可以是任何东西,任何格式的存储。然而,超媒体格式序列化资源如JSON-LD、原子,建议HTML或XML。
的美居酒店()
树枝函数生成的URL水银中心根据配置。URL包含了主题
查询参数对应的主题作为第一个参数传递。
如果你想从一个外部JavaScript文件,访问这个URL生成URL在一个专用的HTML元素:
1 2 3
<脚本类型=“application / json”id=“mercure-url”>{{美居酒店| (“https://example.com/books/1”)json_encode(常数(“JSON_UNESCAPED_SLASHES”)b或常数(“JSON_HEX_TAG”))|生}}< /脚本>
然后从JS文件中检索它:
1 2 3
常量url =JSON.parse (文档.getElementById (“mercure-url”).textContent);常量eventSource =新EventSource (url);/ /……
水银还允许订阅一些主题,并使用URI模板或一个特殊的值*
(由所有主题匹配)模式:
1 2 3 4 5 6 7 8 9 10 11 12
<脚本>{#订阅更新几个图书资源和审查所有资源匹配给定的模式#}常量eventSource =新EventSource (”{{水银([' https://example.com/books/1 ', ' https://example.com/books/2 ', ' https://example.com/reviews/ {id} ']) |逃避(js)}}”);eventSource。onmessage =事件= >{控制台。log(JSON.parse(event.data)); }< /脚本>
提示
Google Chrome DevTools本地集成实用的用户界面显示在实时接收到的事件:
使用它:
- 打开DevTools
- 选择“网络”选项卡
- 点击请求美居中心
- 点击“EventStream”子。
提示
测试如果URI模板匹配使用的URL在线调试器
链接HTTP报头。
您可以创建链接
头的发现
助手类(在引擎盖下,它使用连接组件):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
/ / src /控制器/ DiscoverController.php名称空间应用程序\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\HttpFoundation\JsonResponse;使用ob娱乐下载\组件\HttpFoundation\请求;使用ob娱乐下载\组件\美居酒店\发现;类DiscoverController扩展AbstractController{公共函数发现(请求美元请求,发现美元发现):JsonResponse{/ /链接:< https://hub.example.com/.well-known/mercure >;rel = "美居酒店"美元发现- >通过addLink (美元请求);返回美元这- >json ([“@ id”= >“/书籍/ 1”,“可用性”= >“https://schema.org/InStock”]);}}
然后,这个头可以解析客户端找到中心的URL,并订阅:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
/ /获取原始资源由Symfony的web服务APIob娱乐下载fetch (“/书籍/ 1”)/ /链接:< https://hub.example.com/.well-known/mercure >;rel = "美居酒店"不要犹豫(响应= >{/ /提取中心的URL链接标题常量hubUrl = response.headers.get (“链接”).match (/ < ([^ >]+)>;\ s + rel =(?:美居酒店|“^”*水银[^]*)/)[1];/ /添加订阅的主题(s)作为查询参数常量中心=新URL (hubUrl,窗口.origin);hub.searchParams.append (“主题”,“https://example.com/books/ {id}”);/ /订阅更新常量eventSource =新EventSource(中心);eventSource。onmessage =事件= >控制台. log (event.data);});
链接
头的发现
助手类(在引擎盖下,它使用连接组件):1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
/ / src /控制器/ DiscoverController.php名称空间应用程序\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\HttpFoundation\JsonResponse;使用ob娱乐下载\组件\HttpFoundation\请求;使用ob娱乐下载\组件\美居酒店\发现;类DiscoverController扩展AbstractController{公共函数发现(请求美元请求,发现美元发现):JsonResponse{/ /链接:< https://hub.example.com/.well-known/mercure >;rel = "美居酒店"美元发现- >通过addLink (美元请求);返回美元这- >json ([“@ id”= >“/书籍/ 1”,“可用性”= >“https://schema.org/InStock”]);}}
1 2 3 4 5 6 7 8 9 10 11 12 13 14
/ /获取原始资源由Symfony的web服务APIob娱乐下载fetch (“/书籍/ 1”)/ /链接:< https://hub.example.com/.well-known/mercure >;rel = "美居酒店"不要犹豫(响应= >{/ /提取中心的URL链接标题常量hubUrl = response.headers.get (“链接”).match (/ < ([^ >]+)>;\ s + rel =(?:美居酒店|“^”*水银[^]*)/)[1];/ /添加订阅的主题(s)作为查询参数常量中心=新URL (hubUrl,窗口.origin);hub.searchParams.append (“主题”,“https://example.com/books/ {id}”);/ /订阅更新常量eventSource =新EventSource(中心);eventSource。onmessage =事件= >控制台. log (event.data);});
更新构造函数真正的
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日24
/ / src /控制器/ Publish.php名称空间应用程序\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\美居酒店\更新;类PublishController扩展AbstractController{公共函数发布(HubInterface美元中心):响应{美元更新=新更新(“https://example.com/books/1”,json_encode (“状态”= >“OutOfStock”]),真正的/ /私有);/ /出版商的JWT必须包含这个话题,水银的URI模板匹配或*。发布或者你会得到一个401年/ /用户的JWT必须包含这个话题,水银的URI模板匹配或*。订阅接收更新美元中心- >发布(美元更新);返回新响应(“私人更新发布!”);}}
订阅私人更新,用户必须提供到中心JWT包含主题选择器匹配的主题更新。
提供这个JWT,订阅者可以使用cookie,或一个授权
HTTP报头。
饼干可以设置自动Symfony通过适当的选项ob娱乐下载美居酒店()
树枝的功能。饼干,Symfony会自动通过ob娱乐下载浏览器如果美居中心withCredentials
的属性EventSource
类是设置为真正的
。然后,中心验证的有效性提供了JWT,并提取主题选择器。
1 2 3 4 5
<脚本>常量eventSource =新EventSource (”{{水银(' https://example.com/books/1 ',{订阅:' https://example.com/books/1 '}) |逃避(js)}}”,{withCredentials:真});< /脚本>
支持的选项是:
订阅
:包括的主题选择器的列表mercure.subscribe
智威汤逊的索赔
发布
:包括的主题选择器的列表mercure.publish
智威汤逊的索赔
additionalClaims
:包括额外索赔JWT(截止日期,令牌ID…)
使用cookie是最安全的,首选方法当客户机是一个web浏览器。如果客户不是一个web浏览器,然后使用一个授权头的路要走。
谨慎
使用cookie验证方法,Symfony应用和中心必须从同一个域(可以是不同子域)。ob娱乐下载
提示
本机实现EventSource不允许指定标题。例如,授权使用不记名令牌。为了达到这个目的,使用一个polyfill
1 2 3 4 5 6 7
<脚本>常量es =新EventSourcePolyfill (”{{美居酒店(https://example.com/books/1)}}”{标题:{“授权”:“持票人”+令牌,}});< /脚本>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日24
/ / src /控制器/ Publish.php名称空间应用程序\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\AbstractController;使用ob娱乐下载\组件\HttpFoundation\响应;使用ob娱乐下载\组件\美居酒店\更新;类PublishController扩展AbstractController{公共函数发布(HubInterface美元中心):响应{美元更新=新更新(“https://example.com/books/1”,json_encode (“状态”= >“OutOfStock”]),真正的/ /私有);/ /出版商的JWT必须包含这个话题,水银的URI模板匹配或*。发布或者你会得到一个401年/ /用户的JWT必须包含这个话题,水银的URI模板匹配或*。订阅接收更新美元中心- >发布(美元更新);返回新响应(“私人更新发布!”);}}
授权
HTTP报头。美居酒店()
树枝的功能。饼干,Symfony会自动通过ob娱乐下载浏览器如果美居中心withCredentials
的属性EventSource
类是设置为真正的
。然后,中心验证的有效性提供了JWT,并提取主题选择器。1 2 3 4 5
<脚本>常量eventSource =新EventSource (”{{水银(' https://example.com/books/1 ',{订阅:' https://example.com/books/1 '}) |逃避(js)}}”,{withCredentials:真});< /脚本>
订阅
:包括的主题选择器的列表mercure.subscribe
智威汤逊的索赔发布
:包括的主题选择器的列表mercure.publish
智威汤逊的索赔additionalClaims
:包括额外索赔JWT(截止日期,令牌ID…)谨慎
使用cookie验证方法,Symfony应用和中心必须从同一个域(可以是不同子域)。ob娱乐下载
提示
本机实现EventSource不允许指定标题。例如,授权使用不记名令牌。为了达到这个目的,使用一个polyfill
1 2 3 4 5 6 7
<脚本>常量es =新EventSourcePolyfill (”{{美居酒店(https://example.com/books/1)}}”{标题:{“授权”:“持票人”+令牌,}});< /脚本>
然后,创建以下实体就足以让一个有很多特色的超媒体的API,通过美居中心和自动更新广播:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/ / src /实体/ Book.php名称空间应用程序\实体;使用ApiPlatform\核心\注释\ApiResource;使用学说\ORM\映射作为ORM;# (ApiResource(水银:真)]# (ORM \实体)类书{# (ORM \ Id)# (ORM \列)公共字符串美元的名字=”;# (ORM \列)公共字符串美元状态=”;}
作为展示在这个记录,API平台客户端发电机还允许支架完成反应和反应本机应用程序从这个API。这些应用程序将在实时渲染美居酒店更新的内容。
结帐平台的专用API文档欧宝官网下载app了解更多关于它的美居酒店的支持。