{"id":29538,"date":"2024-11-25T17:13:36","date_gmt":"2024-11-25T09:13:36","guid":{"rendered":"https:\/\/fwq.ai\/blog\/29538\/"},"modified":"2024-11-25T17:13:36","modified_gmt":"2024-11-25T09:13:36","slug":"%e8%a7%a3%e6%9e%90%e5%be%ae%e4%bf%a1%e5%b0%8f%e7%a8%8b%e5%ba%8fsocketio%e5%ae%9e%e4%be%8b","status":"publish","type":"post","link":"https:\/\/fwq.ai\/blog\/29538\/","title":{"rendered":"\u89e3\u6790\u5fae\u4fe1\u5c0f\u7a0b\u5e8fSocketIO\u5b9e\u4f8b"},"content":{"rendered":"<p>\u8fd9\u7bc7\u6587\u7ae0\u4e3b\u8981\u4ecb\u7ecd\u4e86\u5fae\u4fe1\u5c0f\u7a0b\u5e8f socketio \u7684\u76f8\u5173\u8d44\u6599,\u8fd9\u91cc\u7ed9\u5927\u5bb6\u63d0\u4f9b\u4e86\u4e00\u4e2a\u7b80\u5355\u5b9e\u4f8b\uff0c\u9700\u8981\u7684\u670b\u53cb\u53ef\u4ee5\u53c2\u8003\u4e0b<\/p>\n<p><strong>\u5fae\u4fe1\u5c0f\u7a0b\u5e8f ScoketIO \u7b80\u5355\u5b9e\u4f8b\uff1a<\/strong><\/p>\n<p>\u73b0\u5728\u597d\u7684\u4eba\u5728\u641e\u5fae\u4fe1\u5c0f\u7a0b\u5e8f\uff0cScoketIO \u662f\u5fae\u4fe1\u7684\u7f51\u7edc\u901a\u4fe1\uff0c\u5b83\u7684\u91cd\u8981\u6027\u4e0d\u8a00\u800c\u55bb\uff0c\u8fd9\u91cc\u7ed9\u5927\u5bb6\u8bb2\u8bb2\u5982\u4f55\u4f7f\u7528\u4ee5\u53ca\u6ce8\u610f\u4e8b\u9879\uff01<\/p>\n<p>\u5fae\u4fe1\u5c0f\u7a0b\u5e8f \u7684SocketIO \u5b9e\u73b0\uff0c\u57fa\u4e8eCFETram \u7684\u5b9e\u73b0\u57fa\u7840\u4e0a\u5b8c\u5584<\/p>\n<p><\/p>\n<pre>const&nbsp;emitter&nbsp;=&nbsp;require('.\/emitter.js');\r\n\r\n\/**&nbsp;socket.io&nbsp;\u534f\u8bae\u5e38\u91cf&nbsp;*\/\r\nvar&nbsp;packets&nbsp;=&nbsp;{\r\n&nbsp;&nbsp;open:&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;\/\/&nbsp;non-ws\r\n&nbsp;,&nbsp;close:&nbsp;&nbsp;1&nbsp;&nbsp;\/\/&nbsp;non-ws\r\n&nbsp;,&nbsp;ping:&nbsp;&nbsp;&nbsp;2\r\n&nbsp;,&nbsp;pong:&nbsp;&nbsp;&nbsp;3\r\n&nbsp;,&nbsp;message:&nbsp;4\r\n&nbsp;,&nbsp;upgrade:&nbsp;5\r\n&nbsp;,&nbsp;noop:&nbsp;&nbsp;&nbsp;6\r\n};\r\nvar&nbsp;events&nbsp;=&nbsp;{&nbsp;\r\n&nbsp;&nbsp;CONNECT:&nbsp;0,\r\n&nbsp;&nbsp;DISCONNECT:&nbsp;1,\r\n&nbsp;&nbsp;EVENT:&nbsp;2,\r\n&nbsp;&nbsp;ACK:&nbsp;3,\r\n&nbsp;&nbsp;ERROR:&nbsp;4,\r\n&nbsp;&nbsp;BINARY_EVENT:&nbsp;5,\r\n&nbsp;&nbsp;BINARY_ACK:&nbsp;6\r\n};\r\n\r\nconst&nbsp;PING_CHECK_INTERVAL&nbsp;=&nbsp;2000;\r\n\r\n\r\nclass&nbsp;WxSocketIO&nbsp;{\r\n&nbsp;&nbsp;connect(url)&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;new&nbsp;Promise((resolve,&nbsp;reject)&nbsp;=&amp;gt;&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wx.onSocketOpen((response)&nbsp;=&amp;gt;&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.isConnected&nbsp;=&nbsp;true;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/this.ping();\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resolve(response);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wx.onSocketError(error&nbsp;=&amp;gt;&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(this.isConnected)&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.fire('error',&nbsp;error);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reject(error);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wx.onSocketMessage(message&nbsp;=&amp;gt;&nbsp;this._handleMessage(message));\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wx.onSocketClose(result&nbsp;=&amp;gt;&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(this.isConnected)&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.fire('error',&nbsp;new&nbsp;Error(\"The&nbsp;websocket&nbsp;was&nbsp;closed&nbsp;by&nbsp;server\"));\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.fire('close');\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.isConnected&nbsp;=&nbsp;false;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.destory();\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wx.connectSocket({\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url:&nbsp;`${url}\/?EIO=3&amp;amp;transport=websocket`\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});\r\n&nbsp;&nbsp;&nbsp;&nbsp;});\r\n&nbsp;&nbsp;}\r\n&nbsp;&nbsp;ping()&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;setTimeout(()&nbsp;=&amp;gt;&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!this.isConnected)&nbsp;return;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wx.sendSocketMessage({\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data:&nbsp;[packets.ping,&nbsp;'probe'].join('')\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});\r\n&nbsp;&nbsp;&nbsp;&nbsp;},&nbsp;PING_CHECK_INTERVAL);\r\n&nbsp;&nbsp;}\r\n&nbsp;&nbsp;close()&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;new&nbsp;Promise((resolve,&nbsp;reject)&nbsp;=&amp;gt;&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(this.isConnected)&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.isConnected&nbsp;=&nbsp;false;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wx.onSocketClose(resolve);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wx.closeSocket();\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reject(new&nbsp;Error('socket&nbsp;is&nbsp;not&nbsp;connected'));\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;});\r\n&nbsp;&nbsp;}\r\n&nbsp;&nbsp;emit(type,&nbsp;...params)&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;data&nbsp;=&nbsp;[type,&nbsp;...params];\r\n&nbsp;&nbsp;&nbsp;&nbsp;wx.sendSocketMessage({\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data:&nbsp;[packets.message,&nbsp;events.EVENT,&nbsp;JSON.stringify(data)].join(\"\")\r\n&nbsp;&nbsp;&nbsp;&nbsp;});\r\n&nbsp;&nbsp;}\r\n&nbsp;&nbsp;destory()&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;this.removeAllListeners();\r\n&nbsp;&nbsp;}\r\n&nbsp;&nbsp;_handleMessage({&nbsp;data&nbsp;})&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;[match,&nbsp;packet,&nbsp;event,&nbsp;content]&nbsp;=&nbsp;\/^(d)(d?)(.*)$\/.exec(data);\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(+event&nbsp;===&nbsp;events.EVENT)&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch&nbsp;(+packet)&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;packets.message:\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;pack;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pack&nbsp;=&nbsp;JSON.parse(content);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(error)&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.error('\u89e3\u6790&nbsp;ws&nbsp;\u6570\u636e\u5305\u5931\u8d25\uff1a')\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.error(error);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;[type,&nbsp;...params]&nbsp;=&nbsp;pack;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.fire(type,&nbsp;...params);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;(+packet&nbsp;==&nbsp;packets.pong)&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.ping();\r\n&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;}\r\n};\r\n\r\nemitter.setup(WxSocketIO.prototype);\r\n\r\nmodule.exports&nbsp;=&nbsp;WxSocketIO;<\/pre>\n<p>  \u767b\u5f55\u540e\u590d\u5236   <\/p>\n<p><strong>DEMO<\/strong><\/p>\n<p>\u9879\u76ee\u9644\u4e86\u4e00\u4e2a\u5fae\u4fe1\u5c0f\u7a0b\u5e8f\u7684DEMO \u9879\u76ee\u6f14\u793a\u4e86\u63a5\u5165 Scoket.IO \u5b98\u65b9\u7684\u6f14\u793a\u804a\u5929\u5ba4\uff0c\u4ee5\u4fbf\u65b9\u4fbf\u6d4b\u8bd5,\u5173\u4e8e\u8be6\u7ec6\u7528\u6cd5\u8fd8\u8bf7\u53c2\u8003\u5b98\u65b9\u6587\u6863\u3002<\/p>\n<p>How&nbsp; to use<\/p>\n<p><\/p>\n<pre>const&nbsp;opts&nbsp;=&nbsp;{}\r\nconst&nbsp;socket&nbsp;=&nbsp;this.globalData.socket&nbsp;=&nbsp;new&nbsp;WxSocketIO()\r\nsocket.connect('ws:\/\/chat.socket.io',&nbsp;opts)\r\n.then(_&nbsp;=&amp;gt;&nbsp;{\r\n&nbsp;console.info('App::WxSocketIO::onOpen')\r\n&nbsp;console.info('App:onShow:',&nbsp;that.globalData)\r\n})\r\n.catch(err&nbsp;=&amp;gt;&nbsp;{\r\n&nbsp;console.error('App::WxSocketIO::onError',&nbsp;err)\r\n})\r\n\u5176\u4e2dsocket.connect(ws_url,&nbsp;opts)\u4e2d\uff0copts\u76ee\u524d\u53ef\u9009\u503c\u662fpath\uff0c\u7528\u6765\u6307\u5b9a\u4f7f\u7528socket.io\u65f6\u9ed8\u8ba4\u7684path\uff0c\u6bd4\u5982\u8bbe\u7f6eopts\u4e3a\u4e0b\u5217\u503c\uff1a\r\n\r\n{\r\n&nbsp;query:&nbsp;'fanweixiao',\r\n&nbsp;with:&nbsp;'mia&amp;amp;una',\r\n}<\/pre>\n<p>  \u767b\u5f55\u540e\u590d\u5236   <\/p>\n<p>\u4ee5\u4e0a\u5c31\u662f\u89e3\u6790\u5fae\u4fe1\u5c0f\u7a0b\u5e8fSocketIO\u5b9e\u4f8b\u7684\u8be6\u7ec6\u5185\u5bb9\uff0c\u66f4\u591a\u8bf7\u5173\u6ce8\u7c73\u4e91\u5176\u5b83\u76f8\u5173\u6587\u7ae0\uff01<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u8fd9\u7bc7\u6587\u7ae0\u4e3b\u8981\u4ecb\u7ecd\u4e86\u5fae\u4fe1\u5c0f\u7a0b\u5e8f socketio \u7684\u76f8\u5173\u8d44\u6599,\u8fd9\u91cc\u7ed9\u5927\u5bb6\u63d0\u4f9b\u4e86\u4e00\u4e2a\u7b80\u5355\u5b9e\u4f8b\uff0c\u9700\u8981\u7684\u670b\u53cb\u53ef\u4ee5\u53c2\u8003\u4e0b \u5fae\u4fe1\u5c0f\u7a0b\u5e8f ScoketIO \u7b80\u5355\u5b9e\u4f8b\uff1a \u73b0\u5728\u597d\u7684\u4eba\u5728\u641e\u5fae\u4fe1\u5c0f\u7a0b\u5e8f\uff0cScoketIO \u662f\u5fae\u4fe1\u7684\u7f51\u7edc\u901a\u4fe1\uff0c\u5b83\u7684\u91cd\u8981\u6027\u4e0d\u8a00\u800c\u55bb\uff0c\u8fd9\u91cc\u7ed9\u5927\u5bb6\u8bb2\u8bb2\u5982\u4f55\u4f7f\u7528\u4ee5\u53ca\u6ce8\u610f\u4e8b\u9879\uff01 \u5fae\u4fe1\u5c0f\u7a0b\u5e8f \u7684SocketIO \u5b9e\u73b0\uff0c\u57fa\u4e8eCFETram \u7684\u5b9e\u73b0\u57fa\u7840\u4e0a\u5b8c\u5584 const&nbsp;emitter&nbsp;=&nbsp;require(&#8216;.\/emitter.js&#8217;); \/**&nbsp;socket.io&nbsp;\u534f\u8bae\u5e38\u91cf&nbsp;*\/ var&nbsp;packets&nbsp;=&nbsp;{ &nbsp;&nbsp;open:&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;\/\/&nbsp;non-ws &nbsp;,&nbsp;close:&nbsp;&nbsp;1&nbsp;&nbsp;\/\/&nbsp;non-ws &nbsp;,&nbsp;ping:&nbsp;&nbsp;&nbsp;2 &nbsp;,&nbsp;pong:&nbsp;&nbsp;&nbsp;3 &nbsp;,&nbsp;message:&nbsp;4 &nbsp;,&nbsp;upgrade:&nbsp;5 &nbsp;,&nbsp;noop:&nbsp;&nbsp;&nbsp;6 }; var&nbsp;events&nbsp;=&nbsp;{&nbsp; &nbsp;&nbsp;CONNECT:&nbsp;0, &nbsp;&nbsp;DISCONNECT:&nbsp;1, &nbsp;&nbsp;EVENT:&nbsp;2, &nbsp;&nbsp;ACK:&nbsp;3, &nbsp;&nbsp;ERROR:&nbsp;4, &nbsp;&nbsp;BINARY_EVENT:&nbsp;5, &nbsp;&nbsp;BINARY_ACK:&nbsp;6 }; const&nbsp;PING_CHECK_INTERVAL&nbsp;=&nbsp;2000; class&nbsp;WxSocketIO&nbsp;{ &nbsp;&nbsp;connect(url)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;new&nbsp;Promise((resolve,&nbsp;reject)&nbsp;=&amp;gt;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wx.onSocketOpen((response)&nbsp;=&amp;gt;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.isConnected&nbsp;=&nbsp;true; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/this.ping(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resolve(response); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wx.onSocketError(error&nbsp;=&amp;gt;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(this.isConnected)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.fire(&#8216;error&#8217;,&nbsp;error); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reject(error); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wx.onSocketMessage(message&nbsp;=&amp;gt;&nbsp;this._handleMessage(message)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wx.onSocketClose(result&nbsp;=&amp;gt;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(this.isConnected)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.fire(&#8216;error&#8217;,&nbsp;new&nbsp;Error(&#8220;The&nbsp;websocket&nbsp;was&nbsp;closed&nbsp;by&nbsp;server&#8221;)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.fire(&#8216;close&#8217;); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[19],"tags":[],"class_list":["post-29538","post","type-post","status-publish","format-standard","hentry","category-19"],"_links":{"self":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts\/29538","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/comments?post=29538"}],"version-history":[{"count":0,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts\/29538\/revisions"}],"wp:attachment":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/media?parent=29538"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/categories?post=29538"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/tags?post=29538"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}