{"id":29148,"date":"2024-11-25T16:22:16","date_gmt":"2024-11-25T08:22:16","guid":{"rendered":"https:\/\/fwq.ai\/blog\/29148\/"},"modified":"2024-11-25T16:22:16","modified_gmt":"2024-11-25T08:22:16","slug":"%e5%88%a9%e7%94%a8java%e5%bc%80%e5%8f%91%e5%be%ae%e4%bf%a1%e5%ae%9e%e7%8e%b0%e5%be%ae%e4%bf%a1%e4%b8%bb%e5%8a%a8%e6%8e%a8%e9%80%81%e6%b6%88%e6%81%af%e5%ae%9e%e4%be%8b","status":"publish","type":"post","link":"https:\/\/fwq.ai\/blog\/29148\/","title":{"rendered":"\u5229\u7528java\u5f00\u53d1\u5fae\u4fe1\u5b9e\u73b0\u5fae\u4fe1\u4e3b\u52a8\u63a8\u9001\u6d88\u606f\u5b9e\u4f8b"},"content":{"rendered":"<p>\u8fd9\u7bc7\u6587\u7ae0\u4e3b\u8981\u4ecb\u7ecd\u4e86\u5229\u7528java\u5f00\u53d1\u5fae\u4fe1\u5b9e\u73b0\u5fae\u4fe1\u4e3b\u52a8\u63a8\u9001\u6d88\u606f\u5b9e\u4f8b,\u9700\u8981\u7684\u670b\u53cb\u53ef\u4ee5\u53c2\u8003\u4e0b<\/p>\n<p>1.\u62c9\u53d6access_token<br \/>2.\u62c9\u53d6\u7528\u6237\u4fe1\u606f<br \/>3.\u4e3b\u52a8\u63a8\u9001\u6d88\u606f<br \/>4.\u63a5\u53e3\u8c8c\u4f3c\u8981\u7533\u8bf7\u6743\u9650<br \/>5.\u4f9d\u8d56httpclient4.2.3 \u548cjackson 2.2.1<\/p>\n<p>&nbsp;\u4ee3\u7801\u5982\u4e0b:<\/p>\n<pre>public&nbsp;class&nbsp;WeixinAPIHelper&nbsp;{\r\n&nbsp;\/**\r\n&nbsp;&nbsp;*&nbsp;\u83b7\u53d6token\u63a5\u53e3\r\n&nbsp;&nbsp;*\/\r\n&nbsp;private&nbsp;String&nbsp;getTokenUrl&nbsp;=&nbsp;\"https:\/\/api.weixin.qq.com\/cgi-bin\/token?grant_type=client_credential&amp;amp;appid={0}&amp;amp;secret={1}\";\r\n&nbsp;\/**\r\n&nbsp;&nbsp;*&nbsp;\u62c9\u5fae\u4fe1\u7528\u6237\u4fe1\u606f\u63a5\u53e3\r\n&nbsp;&nbsp;*\/\r\n&nbsp;private&nbsp;String&nbsp;getUserInfoUrl&nbsp;=&nbsp;\"https:\/\/api.weixin.qq.com\/cgi-bin\/user\/info?access_token={0}&amp;amp;openid={1}\";\r\n&nbsp;\/**\r\n&nbsp;&nbsp;*&nbsp;\u4e3b\u52a8\u63a8\u9001\u4fe1\u606f\u63a5\u53e3\r\n&nbsp;&nbsp;*\/\r\n&nbsp;private&nbsp;String&nbsp;sendMsgUrl&nbsp;=&nbsp;\"https:\/\/api.weixin.qq.com\/cgi-bin\/message\/send?access_token={0}\";\r\n&nbsp;private&nbsp;HttpClient&nbsp;webClient;\r\n&nbsp;private&nbsp;Log&nbsp;log&nbsp;=&nbsp;LogFactory.getLog(getClass());\r\n&nbsp;public&nbsp;void&nbsp;initWebClient(String&nbsp;proxyHost,&nbsp;int&nbsp;proxyPort){\r\n&nbsp;&nbsp;this.initWebClient();\r\n&nbsp;&nbsp;if(webClient&nbsp;!=&nbsp;null&nbsp;&amp;amp;&amp;amp;&nbsp;!StringUtils.isEmpty(proxyHost)){\r\n&nbsp;&nbsp;&nbsp;HttpHost&nbsp;proxy&nbsp;=&nbsp;new&nbsp;HttpHost(proxyHost,&nbsp;proxyPort);\r\n&nbsp;&nbsp;&nbsp;webClient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY,&nbsp;proxy);\r\n&nbsp;&nbsp;}\r\n&nbsp;}\r\n&nbsp;\/**\r\n&nbsp;&nbsp;*&nbsp;@desc&nbsp;\u521d\u59cb\u5316\u521b\u5efa&nbsp;WebClient\r\n&nbsp;&nbsp;*\/\r\n&nbsp;public&nbsp;void&nbsp;initWebClient()&nbsp;{\r\n&nbsp;&nbsp;log.info(\"initWebClient&nbsp;start....\");\r\n&nbsp;&nbsp;try&nbsp;{\r\n&nbsp;&nbsp;&nbsp;PoolingClientConnectionManager&nbsp;tcm&nbsp;=&nbsp;new&nbsp;PoolingClientConnectionManager();\r\n&nbsp;&nbsp;&nbsp;tcm.setMaxTotal(10);\r\n&nbsp;&nbsp;&nbsp;SSLContext&nbsp;ctx&nbsp;=&nbsp;SSLContext.getInstance(\"TLS\");\r\n&nbsp;&nbsp;&nbsp;X509TrustManager&nbsp;tm&nbsp;=&nbsp;new&nbsp;X509TrustManager()&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;checkClientTrusted(X509Certificate[]&nbsp;arg0,&nbsp;String&nbsp;arg1)&nbsp;throws&nbsp;CertificateException&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;checkServerTrusted(X509Certificate[]&nbsp;arg0,&nbsp;String&nbsp;arg1)&nbsp;throws&nbsp;CertificateException&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;X509Certificate[]&nbsp;getAcceptedIssuers()&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;null;\r\n&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;};\r\n&nbsp;&nbsp;&nbsp;ctx.init(null,&nbsp;new&nbsp;X509TrustManager[]&nbsp;{&nbsp;tm&nbsp;},&nbsp;null);\r\n&nbsp;&nbsp;&nbsp;SSLSocketFactory&nbsp;ssf&nbsp;=&nbsp;new&nbsp;SSLSocketFactory(ctx,&nbsp;SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);\r\n&nbsp;&nbsp;&nbsp;Scheme&nbsp;sch&nbsp;=&nbsp;new&nbsp;Scheme(\"https\",&nbsp;443,&nbsp;ssf);\r\n&nbsp;&nbsp;&nbsp;tcm.getSchemeRegistry().register(sch);\r\n&nbsp;&nbsp;&nbsp;webClient&nbsp;=&nbsp;new&nbsp;DefaultHttpClient(tcm);\r\n&nbsp;&nbsp;}&nbsp;catch&nbsp;(Exception&nbsp;ex)&nbsp;{\r\n&nbsp;&nbsp;&nbsp;log.error(\"initWebClient&nbsp;exception\",&nbsp;ex);\r\n&nbsp;&nbsp;}&nbsp;finally&nbsp;{\r\n&nbsp;&nbsp;&nbsp;log.info(\"initWebClient&nbsp;end....\");\r\n&nbsp;&nbsp;}\r\n&nbsp;}\r\n&nbsp;\/**\r\n&nbsp;&nbsp;*&nbsp;@desc&nbsp;\u83b7\u53d6\u6388\u6743token\r\n&nbsp;&nbsp;*&nbsp;@param&nbsp;appid\r\n&nbsp;&nbsp;*&nbsp;@param&nbsp;secret\r\n&nbsp;&nbsp;*&nbsp;@return\r\n&nbsp;&nbsp;*\/\r\n&nbsp;public&nbsp;String&nbsp;getAccessToken(String&nbsp;appid,&nbsp;String&nbsp;secret)&nbsp;{\r\n&nbsp;&nbsp;String&nbsp;accessToken&nbsp;=&nbsp;null;\r\n&nbsp;&nbsp;try&nbsp;{\r\n&nbsp;&nbsp;&nbsp;log.info(\"getAccessToken&nbsp;start.{appid=\"&nbsp;+&nbsp;appid&nbsp;+&nbsp;\",secret:\"&nbsp;+&nbsp;secret&nbsp;+&nbsp;\"}\");\r\n&nbsp;&nbsp;&nbsp;String&nbsp;url&nbsp;=&nbsp;MessageFormat.format(this.getTokenUrl,&nbsp;appid,&nbsp;secret);\r\n&nbsp;&nbsp;&nbsp;String&nbsp;response&nbsp;=&nbsp;executeHttpGet(url);\r\n&nbsp;&nbsp;&nbsp;accessToken&nbsp;=&nbsp;JsonUtils.read(response,&nbsp;\"access_token\");\r\n&nbsp;&nbsp;}&nbsp;catch&nbsp;(Exception&nbsp;e)&nbsp;{\r\n&nbsp;&nbsp;&nbsp;log.error(\"get&nbsp;access&nbsp;toekn&nbsp;exception\",&nbsp;e);\r\n&nbsp;&nbsp;}\r\n&nbsp;&nbsp;return&nbsp;accessToken;\r\n&nbsp;}\r\n&nbsp;\/**\r\n&nbsp;&nbsp;*&nbsp;@desc&nbsp;\u63a8\u9001\u4fe1\u606f\r\n&nbsp;&nbsp;*&nbsp;@param&nbsp;token\r\n&nbsp;&nbsp;*&nbsp;@param&nbsp;msg\r\n&nbsp;&nbsp;*&nbsp;@return\r\n&nbsp;&nbsp;*\/\r\n&nbsp;public&nbsp;String&nbsp;sendMessage(String&nbsp;token,String&nbsp;msg){\r\n&nbsp;&nbsp;try{\r\n&nbsp;&nbsp;&nbsp;log.info(\"sendMessage&nbsp;start.token:\"+token+\",msg:\"+msg);\r\n&nbsp;&nbsp;&nbsp;String&nbsp;url&nbsp;=&nbsp;MessageFormat.format(this.sendMsgUrl,&nbsp;token);\r\n&nbsp;&nbsp;&nbsp;HttpPost&nbsp;post&nbsp;=&nbsp;new&nbsp;HttpPost(url);\r\n&nbsp;&nbsp;&nbsp;ResponseHandler&amp;gt;&nbsp;responseHandler&nbsp;=&nbsp;new&nbsp;BasicResponseHandler();\r\n&nbsp;&nbsp;&nbsp;StringEntity&nbsp;entity&nbsp;=&nbsp;new&nbsp;StringEntity(msg);\r\n&nbsp;&nbsp;&nbsp;post.setEntity(entity);\r\n&nbsp;&nbsp;&nbsp;String&nbsp;response&nbsp;=&nbsp;(String)&nbsp;this.webClient.execute(post,&nbsp;responseHandler);\r\n&nbsp;&nbsp;&nbsp;log.info(\"return&nbsp;response=====start======\");\r\n&nbsp;&nbsp;&nbsp;log.info(response);\r\n&nbsp;&nbsp;&nbsp;log.info(\"return&nbsp;response=====end======\");\r\n&nbsp;&nbsp;&nbsp;return&nbsp;response;\r\n\r\n&nbsp;&nbsp;}catch&nbsp;(Exception&nbsp;e)&nbsp;{\r\n&nbsp;&nbsp;&nbsp;log.error(\"get&nbsp;user&nbsp;info&nbsp;exception\",&nbsp;e);\r\n&nbsp;&nbsp;&nbsp;return&nbsp;null;\r\n&nbsp;&nbsp;}&nbsp;\r\n&nbsp;}\r\n&nbsp;\/**\r\n&nbsp;&nbsp;*&nbsp;@desc&nbsp;\u62c9\u53d6\u7528\u6237\u4fe1\u606f\r\n&nbsp;&nbsp;*&nbsp;@param&nbsp;token\r\n&nbsp;&nbsp;*&nbsp;@param&nbsp;openid\r\n&nbsp;&nbsp;*&nbsp;@return\r\n&nbsp;&nbsp;*\/\r\n&nbsp;public&nbsp;WeixinOpenUser&nbsp;getUserInfo(String&nbsp;token,&nbsp;String&nbsp;openid)&nbsp;{\r\n&nbsp;&nbsp;try&nbsp;{\r\n&nbsp;&nbsp;&nbsp;log.info(\"getUserInfo&nbsp;start.{token:\"&nbsp;+&nbsp;token&nbsp;+&nbsp;\",openid:\"&nbsp;+&nbsp;openid&nbsp;+&nbsp;\"}\");\r\n&nbsp;&nbsp;&nbsp;String&nbsp;url&nbsp;=&nbsp;MessageFormat.format(this.getUserInfoUrl,&nbsp;token,&nbsp;openid);\r\n&nbsp;&nbsp;&nbsp;String&nbsp;response&nbsp;=&nbsp;executeHttpGet(url);\r\n&nbsp;&nbsp;&nbsp;JsonNode&nbsp;json&nbsp;=&nbsp;JsonUtils.read(response);\r\n&nbsp;&nbsp;&nbsp;if&nbsp;(json.get(\"openid\")&nbsp;!=&nbsp;null)&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;WeixinOpenUser&nbsp;user&nbsp;=&nbsp;new&nbsp;WeixinOpenUser();\r\n&nbsp;&nbsp;&nbsp;&nbsp;user.setOpenUserId(json.get(\"openid\").asText());\r\n&nbsp;&nbsp;&nbsp;&nbsp;user.setState(json.get(\"subscribe\").asText());\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(\"1\".equals(user.getState()))&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user.setUserName(json.get(\"nickname\").asText());\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user.setSex(json.get(\"sex\").asText());\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user.setCity(json.get(\"city\").asText());\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user.setLanguage(json.get(\"language\").asText());\r\n&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;user;\r\n&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;}&nbsp;catch&nbsp;(Exception&nbsp;e)&nbsp;{\r\n&nbsp;&nbsp;&nbsp;log.error(\"get&nbsp;user&nbsp;info&nbsp;exception\",&nbsp;e);\r\n&nbsp;&nbsp;}\r\n&nbsp;&nbsp;return&nbsp;null;\r\n&nbsp;}\r\n&nbsp;\/**\r\n&nbsp;&nbsp;*&nbsp;@desc&nbsp;\u53d1\u8d77HTTP&nbsp;GET\u8bf7\u6c42\u8fd4\u56de\u6570\u636e\r\n&nbsp;&nbsp;*&nbsp;@param&nbsp;url\r\n&nbsp;&nbsp;*&nbsp;@return\r\n&nbsp;&nbsp;*&nbsp;@throws&nbsp;IOException\r\n&nbsp;&nbsp;*&nbsp;@throws&nbsp;ClientProtocolException\r\n&nbsp;&nbsp;*\/\r\n&nbsp;private&nbsp;String&nbsp;executeHttpGet(String&nbsp;url)&nbsp;throws&nbsp;IOException,&nbsp;ClientProtocolException&nbsp;{\r\n&nbsp;&nbsp;ResponseHandler&amp;gt;&nbsp;responseHandler&nbsp;=&nbsp;new&nbsp;BasicResponseHandler();\r\n&nbsp;&nbsp;String&nbsp;response&nbsp;=&nbsp;(String)&nbsp;this.webClient.execute(new&nbsp;HttpGet(url),&nbsp;responseHandler);\r\n&nbsp;&nbsp;log.info(\"return&nbsp;response=====start======\");\r\n&nbsp;&nbsp;log.info(response);\r\n&nbsp;&nbsp;log.info(\"return&nbsp;response=====end======\");\r\n&nbsp;&nbsp;return&nbsp;response;\r\n&nbsp;}\r\n}<\/pre>\n<p>  \u767b\u5f55\u540e\u590d\u5236   <\/p>\n<p><\/p>\n<p>\u4ee5\u4e0a\u5c31\u662f\u5229\u7528java\u5f00\u53d1\u5fae\u4fe1\u5b9e\u73b0\u5fae\u4fe1\u4e3b\u52a8\u63a8\u9001\u6d88\u606f\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\u5229\u7528java\u5f00\u53d1\u5fae\u4fe1\u5b9e\u73b0\u5fae\u4fe1\u4e3b\u52a8\u63a8\u9001\u6d88\u606f\u5b9e\u4f8b,\u9700\u8981\u7684\u670b\u53cb\u53ef\u4ee5\u53c2\u8003\u4e0b 1.\u62c9\u53d6access_token2.\u62c9\u53d6\u7528\u6237\u4fe1\u606f3.\u4e3b\u52a8\u63a8\u9001\u6d88\u606f4.\u63a5\u53e3\u8c8c\u4f3c\u8981\u7533\u8bf7\u6743\u96505.\u4f9d\u8d56httpclient4.2.3 \u548cjackson 2.2.1 &nbsp;\u4ee3\u7801\u5982\u4e0b: public&nbsp;class&nbsp;WeixinAPIHelper&nbsp;{ &nbsp;\/** &nbsp;&nbsp;*&nbsp;\u83b7\u53d6token\u63a5\u53e3 &nbsp;&nbsp;*\/ &nbsp;private&nbsp;String&nbsp;getTokenUrl&nbsp;=&nbsp;&#8220;https:\/\/api.weixin.qq.com\/cgi-bin\/token?grant_type=client_credential&amp;amp;appid={0}&amp;amp;secret={1}&#8221;; &nbsp;\/** &nbsp;&nbsp;*&nbsp;\u62c9\u5fae\u4fe1\u7528\u6237\u4fe1\u606f\u63a5\u53e3 &nbsp;&nbsp;*\/ &nbsp;private&nbsp;String&nbsp;getUserInfoUrl&nbsp;=&nbsp;&#8220;https:\/\/api.weixin.qq.com\/cgi-bin\/user\/info?access_token={0}&amp;amp;openid={1}&#8221;; &nbsp;\/** &nbsp;&nbsp;*&nbsp;\u4e3b\u52a8\u63a8\u9001\u4fe1\u606f\u63a5\u53e3 &nbsp;&nbsp;*\/ &nbsp;private&nbsp;String&nbsp;sendMsgUrl&nbsp;=&nbsp;&#8220;https:\/\/api.weixin.qq.com\/cgi-bin\/message\/send?access_token={0}&#8221;; &nbsp;private&nbsp;HttpClient&nbsp;webClient; &nbsp;private&nbsp;Log&nbsp;log&nbsp;=&nbsp;LogFactory.getLog(getClass()); &nbsp;public&nbsp;void&nbsp;initWebClient(String&nbsp;proxyHost,&nbsp;int&nbsp;proxyPort){ &nbsp;&nbsp;this.initWebClient(); &nbsp;&nbsp;if(webClient&nbsp;!=&nbsp;null&nbsp;&amp;amp;&amp;amp;&nbsp;!StringUtils.isEmpty(proxyHost)){ &nbsp;&nbsp;&nbsp;HttpHost&nbsp;proxy&nbsp;=&nbsp;new&nbsp;HttpHost(proxyHost,&nbsp;proxyPort); &nbsp;&nbsp;&nbsp;webClient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY,&nbsp;proxy); &nbsp;&nbsp;} &nbsp;} &nbsp;\/** &nbsp;&nbsp;*&nbsp;@desc&nbsp;\u521d\u59cb\u5316\u521b\u5efa&nbsp;WebClient &nbsp;&nbsp;*\/ &nbsp;public&nbsp;void&nbsp;initWebClient()&nbsp;{ &nbsp;&nbsp;log.info(&#8220;initWebClient&nbsp;start&#8230;.&#8221;); &nbsp;&nbsp;try&nbsp;{ &nbsp;&nbsp;&nbsp;PoolingClientConnectionManager&nbsp;tcm&nbsp;=&nbsp;new&nbsp;PoolingClientConnectionManager(); &nbsp;&nbsp;&nbsp;tcm.setMaxTotal(10); &nbsp;&nbsp;&nbsp;SSLContext&nbsp;ctx&nbsp;=&nbsp;SSLContext.getInstance(&#8220;TLS&#8221;); &nbsp;&nbsp;&nbsp;X509TrustManager&nbsp;tm&nbsp;=&nbsp;new&nbsp;X509TrustManager()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;checkClientTrusted(X509Certificate[]&nbsp;arg0,&nbsp;String&nbsp;arg1)&nbsp;throws&nbsp;CertificateException&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;checkServerTrusted(X509Certificate[]&nbsp;arg0,&nbsp;String&nbsp;arg1)&nbsp;throws&nbsp;CertificateException&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;X509Certificate[]&nbsp;getAcceptedIssuers()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;null; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;}; &nbsp;&nbsp;&nbsp;ctx.init(null,&nbsp;new&nbsp;X509TrustManager[]&nbsp;{&nbsp;tm&nbsp;},&nbsp;null); &nbsp;&nbsp;&nbsp;SSLSocketFactory&nbsp;ssf&nbsp;=&nbsp;new&nbsp;SSLSocketFactory(ctx,&nbsp;SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); &nbsp;&nbsp;&nbsp;Scheme&nbsp;sch&nbsp;=&nbsp;new&nbsp;Scheme(&#8220;https&#8221;,&nbsp;443,&nbsp;ssf); &nbsp;&nbsp;&nbsp;tcm.getSchemeRegistry().register(sch); &nbsp;&nbsp;&nbsp;webClient&nbsp;=&nbsp;new&nbsp;DefaultHttpClient(tcm); &nbsp;&nbsp;}&nbsp;catch&nbsp;(Exception&nbsp;ex)&nbsp;{ &nbsp;&nbsp;&nbsp;log.error(&#8220;initWebClient&nbsp;exception&#8221;,&nbsp;ex); &nbsp;&nbsp;}&nbsp;finally&nbsp;{ &nbsp;&nbsp;&nbsp;log.info(&#8220;initWebClient&nbsp;end&#8230;.&#8221;); &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-29148","post","type-post","status-publish","format-standard","hentry","category-19"],"_links":{"self":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts\/29148","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=29148"}],"version-history":[{"count":0,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts\/29148\/revisions"}],"wp:attachment":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/media?parent=29148"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/categories?post=29148"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/tags?post=29148"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}