{"id":31499,"date":"2024-11-25T17:37:40","date_gmt":"2024-11-25T09:37:40","guid":{"rendered":"https:\/\/fwq.ai\/blog\/31499\/"},"modified":"2024-11-25T17:37:40","modified_gmt":"2024-11-25T09:37:40","slug":"%e5%be%ae%e4%bf%a1%e5%b0%8f%e7%a8%8b%e5%ba%8f%e5%86%85%e5%ae%9e%e7%8e%b0%e4%b8%8a%e4%bc%a0%e5%9b%be%e7%89%87%e9%99%84%e5%90%8e%e7%ab%af%e4%bb%a3%e7%a0%81","status":"publish","type":"post","link":"https:\/\/fwq.ai\/blog\/31499\/","title":{"rendered":"\u5fae\u4fe1\u5c0f\u7a0b\u5e8f\u5185\u5b9e\u73b0\u4e0a\u4f20\u56fe\u7247\u9644\u540e\u7aef\u4ee3\u7801"},"content":{"rendered":"<p style=\"text-align: left\">\u8fd9\u6b21\u7ed9\u5927\u5bb6\u5e26\u6765\u5fae\u4fe1\u5c0f\u7a0b\u5e8f\u5185\u5b9e\u73b0\u4e0a\u4f20\u56fe\u7247\u9644\u540e\u7aef\u4ee3\u7801\uff0c\u5fae\u4fe1\u5c0f\u7a0b\u5e8f\u5185\u5b9e\u73b0\u4e0a\u4f20\u56fe\u7247\u7684\u6709\u54ea\u4e9b\uff0c\u4e0b\u9762\u5c31\u662f\u5b9e\u6218\u6848\u4f8b\uff0c\u4e00\u8d77\u6765\u770b\u4e00\u4e0b\u3002<\/p>\n<p style=\"text-align: left\">\u5f53\u7136\u5c0f\u7a0b\u5e8f\u4e5f\u662f\u53ef\u4ee5\u4e0a\u4f20\u56fe\u7247\u7684\uff0c\u5fae\u4fe1\u5c0f\u7a0b\u5e8f\u6587\u6863\u4e5f\u5199\u7684\u5f88\u6e05\u695a\u3002<\/p>\n<p style=\"text-align: left\"><strong>\u4e0a\u4f20\u56fe\u7247<\/strong><\/p>\n<p style=\"text-align: left\">\u9996\u5148\u9009\u62e9\u56fe\u7247<\/p>\n<p style=\"text-align: left\">\u901a\u8fc7<span style=\"color: #800000\">wx.chooseImage(OBJECT)<\/span>\u5b9e\u73b0<\/p>\n<p style=\"text-align: left\"><img decoding=\"async\" src=\"https:\/\/img.php.cn\/upload\/article\/000\/061\/021\/e274d6a167078149e5432730b3351bdd-0.jpg\" class=\"aligncenter\" title=\"\u5fae\u4fe1\u5c0f\u7a0b\u5e8f\u5185\u5b9e\u73b0\u4e0a\u4f20\u56fe\u7247\u9644\u540e\u7aef\u4ee3\u7801\u63d2\u56fe\" alt=\"\u5fae\u4fe1\u5c0f\u7a0b\u5e8f\u5185\u5b9e\u73b0\u4e0a\u4f20\u56fe\u7247\u9644\u540e\u7aef\u4ee3\u7801\u63d2\u56fe\" \/><\/p>\n<p style=\"text-align: left\">\u5b98\u65b9\u793a\u4f8b\u4ee3\u7801<\/p>\n<pre>wx.chooseImage({\r\n count: 1, \/\/ \u9ed8\u8ba49\r\n sizeType: ['original', 'compressed'], \/\/ \u53ef\u4ee5\u6307\u5b9a\u662f\u539f\u56fe\u8fd8\u662f\u538b\u7f29\u56fe\uff0c\u9ed8\u8ba4\u4e8c\u8005\u90fd\u6709\r\n sourceType: ['album', 'camera'], \/\/ \u53ef\u4ee5\u6307\u5b9a\u6765\u6e90\u662f\u76f8\u518c\u8fd8\u662f\u76f8\u673a\uff0c\u9ed8\u8ba4\u4e8c\u8005\u90fd\u6709\r\n success: function (res) {\r\n \/\/ \u8fd4\u56de\u9009\u5b9a\u7167\u7247\u7684\u672c\u5730\u6587\u4ef6\u8def\u5f84\u5217\u8868\uff0ctempFilePath\u53ef\u4ee5\u4f5c\u4e3aimg\u6807\u7b7e\u7684src\u5c5e\u6027\u663e\u793a\u56fe\u7247\r\n var tempFilePaths = res.tempFilePaths\r\n }\r\n})<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p style=\"text-align: left\">\u56fe\u7247\u6700\u591a\u53ef\u4ee5\u9009\u62e99\u5f20, \u4e5f\u53ef\u4ee5\u901a\u8fc7\u62cd\u6444\u7167\u7247\u5b9e\u73b0\uff0c\u5f53\u9009\u62e9\u5b8c\u56fe\u7247\u4e4b\u540e\u4f1a\u83b7\u53d6\u5230\u56fe\u7247\u8def\u5f84, \u8fd9\u4e2a\u8def\u5f84\u5728\u672c\u6b21\u542f\u52a8\u671f\u95f4\u6709\u6548\u3002 <br \/>\u5982\u679c\u9700\u8981\u4fdd\u5b58\u5c31\u9700\u8981\u7528<span style=\"color: #800000\">wx.saveFile(OBJECT)<\/span><\/p>\n<p style=\"text-align: left\"><span style=\"color: #800000\"><strong>\u4e0a\u4f20\u56fe\u7247<\/strong><\/span><\/p>\n<p style=\"text-align: left\">\u901a\u8fc7<span style=\"color: #800000\">wx.uploadFile(OBJECT)<\/span> \u53ef\u4ee5\u5c06\u672c\u5730\u8d44\u6e90\u5230\u670d\u52a1\u5668\u3002<\/p>\n<p style=\"text-align: left\">\u539f\u7406\u5c31\u662f\u5ba2\u6237\u7aef\u53d1\u8d77\u4e00\u4e2a HTTPS POST \u8bf7\u6c42\uff0c\u5176\u4e2d content-type\u4e3a multipart\/form-data\u3002<\/p>\n<p style=\"text-align: left\"><img decoding=\"async\" src=\"https:\/\/img.php.cn\/upload\/article\/000\/061\/021\/6f45a78ea09077cfb89130b52143cb03-1.jpg\" class=\"aligncenter\" title=\"\u5fae\u4fe1\u5c0f\u7a0b\u5e8f\u5185\u5b9e\u73b0\u4e0a\u4f20\u56fe\u7247\u9644\u540e\u7aef\u4ee3\u7801\u63d2\u56fe1\" alt=\"\u5fae\u4fe1\u5c0f\u7a0b\u5e8f\u5185\u5b9e\u73b0\u4e0a\u4f20\u56fe\u7247\u9644\u540e\u7aef\u4ee3\u7801\u63d2\u56fe1\" \/><\/p>\n<p style=\"text-align: left\">\u5b98\u65b9\u793a\u4f8b\u4ee3\u7801<\/p>\n<pre>wx.chooseImage({\r\n success: function(res) {\r\n var tempFilePaths = res.tempFilePaths\r\n wx.uploadFile({\r\n  url: 'http:\/\/example.weixin.qq.com\/upload', \/\/\u4ec5\u4e3a\u793a\u4f8b\uff0c\u975e\u771f\u5b9e\u7684\u63a5\u53e3\u5730\u5740\r\n  filePath: tempFilePaths[0],\r\n  name: 'file',\r\n  formData:{\r\n  'user': 'test'\r\n  },\r\n  success: function(res){\r\n  var data = res.data\r\n  \/\/do something\r\n  }\r\n })\r\n }\r\n})<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p style=\"text-align: left\"><strong>\u793a\u4f8b\u4ee3\u7801<\/strong><\/p>\n<p style=\"text-align: left\">\u770b\u5b8c\u4e86\u5b98\u65b9\u6587\u6863, \u5199\u4e00\u4e2a\u4e0a\u4f20\u56fe\u7247\u5c31\u6ca1\u6709\u90a3\u4e48\u9ebb\u70e6\u4e86,\u4e0b\u9762\u662f\u771f\u5b9e\u573a\u666f\u7684\u4ee3\u7801<\/p>\n<pre>import constant from '..\/..\/common\/constant';\r\nPage({\r\n data: {\r\n src: \"..\/..\/image\/photo.png\", \/\/\u7ed1\u5b9aimage\u7ec4\u4ef6\u7684src\r\n  \/\/\u7565...\r\n },\r\n onLoad: function (options) {\r\n  \/\/\u7565... \r\n },\r\n uploadPhoto() {\r\n var that = this; \r\n wx.chooseImage({\r\n  count: 1, \/\/ \u9ed8\u8ba49\r\n  sizeType: ['compressed'], \/\/ \u53ef\u4ee5\u6307\u5b9a\u662f\u539f\u56fe\u8fd8\u662f\u538b\u7f29\u56fe\uff0c\u9ed8\u8ba4\u4e8c\u8005\u90fd\u6709\r\n  sourceType: ['album', 'camera'], \/\/ \u53ef\u4ee5\u6307\u5b9a\u6765\u6e90\u662f\u76f8\u518c\u8fd8\u662f\u76f8\u673a\uff0c\u9ed8\u8ba4\u4e8c\u8005\u90fd\u6709\r\n  success: function (res) {\r\n  \/\/ \u8fd4\u56de\u9009\u5b9a\u7167\u7247\u7684\u672c\u5730\u6587\u4ef6\u8def\u5f84\u5217\u8868\uff0ctempFilePath\u53ef\u4ee5\u4f5c\u4e3aimg\u6807\u7b7e\u7684src\u5c5e\u6027\u663e\u793a\u56fe\u7247\r\n  var tempFilePaths = res.tempFilePaths;\r\n  upload(that, tempFilePaths);\r\n  }\r\n })\r\n }\r\n})\r\nfunction upload(page, path) {\r\n wx.showToast({\r\n icon: \"loading\",\r\n title: \"\u6b63\u5728\u4e0a\u4f20\"\r\n }),\r\n wx.uploadFile({\r\n  url: constant.SERVER_URL + \"\/FileUploadServlet\",\r\n  filePath: path[0], \r\n  name: 'file',\r\n  header: { \"Content-Type\": \"multipart\/form-data\" },\r\n  formData: {\r\n  \/\/\u548c\u670d\u52a1\u5668\u7ea6\u5b9a\u7684token, \u4e00\u822c\u4e5f\u53ef\u4ee5\u653e\u5728header\u4e2d\r\n  'session_token': wx.getStorageSync('session_token')\r\n  },\r\n  success: function (res) {\r\n  console.log(res);\r\n  if (res.statusCode != 200) { \r\n   wx.showModal({\r\n   title: '\u63d0\u793a',\r\n   content: '\u4e0a\u4f20\u5931\u8d25',\r\n   showCancel: false\r\n   })\r\n   return;\r\n  }\r\n  var data = res.data\r\n  page.setData({ \/\/\u4e0a\u4f20\u6210\u529f\u4fee\u6539\u663e\u793a\u5934\u50cf\r\n   src: path[0]\r\n  })\r\n  },\r\n  fail: function (e) {\r\n  console.log(e);\r\n  wx.showModal({\r\n   title: '\u63d0\u793a',\r\n   content: '\u4e0a\u4f20\u5931\u8d25',\r\n   showCancel: false\r\n  })\r\n  },\r\n  complete: function () {\r\n  wx.hideToast(); \/\/\u9690\u85cfToast\r\n  }\r\n })\r\n}<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p style=\"text-align: left\"><strong>\u540e\u7aef\u4ee3\u7801<\/strong><\/p>\n<p style=\"text-align: left\">\u540e\u7aef\u662f\u7528java\u5199\u7684\uff0c\u4e00\u5f00\u59cb\u7684\u65f6\u5019\uff0c\u540e\u7aef\u5f00\u59cb\u7528\u4e86\u4e00\u4e9b\u6846\u67b6\u63a5\u6536\u4e0a\u4f20\u7684\u56fe\u7247\uff0c\u51fa\u73b0\u4e86\u5404\u79cd\u95ee\u9898\uff0c\u540e\u6765\u4f7f\u7528\u4e86\u7eaf\u7cb9\u7684Servlet\u5c31\u6ca1\u6709\u4e86\u95ee\u9898, \u628a\u4ee3\u7801\u8d34\u51fa\u6765\u7701\u7684\u4ee5\u540e\u9ebb\u70e6\u4e86\u3002<\/p>\n<p style=\"text-align: left\">\u6ce8\u610f: \u4ee3\u7801\u4f7f\u7528\u4e86\u516c\u53f8\u5185\u90e8\u7684\u6846\u67b6\uff0c\u5efa\u8bae\u4fee\u6539\u540e\u518d\u4f7f\u7528<\/p>\n<pre>public class FileUploadServlet extends HttpServlet {\r\n private static final long serialVersionUID = 1L;\r\n private static Logger logger = LoggerFactory.getLogger(FileUploadServlet.class);\r\n public FileUploadServlet() {\r\n  super();\r\n }\r\n protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {\r\n  JsonMessage&lt;Object&gt; message = new JsonMessage&lt;Object&gt;();\r\n  EOSResponse eosResponse = null;\r\n  String sessionToken = null;\r\n  FileItem file = null;\r\n  InputStream in = null;\r\n  ByteArrayOutputStream swapStream1 = null;\r\n  try {\r\n   request.setCharacterEncoding(\"UTF-8\"); \r\n   \/\/1\u3001\u521b\u5efa\u4e00\u4e2aDiskFileItemFactory\u5de5\u5382 \r\n   DiskFileItemFactory factory = new DiskFileItemFactory(); \r\n   \/\/2\u3001\u521b\u5efa\u4e00\u4e2a\u6587\u4ef6\u4e0a\u4f20\u89e3\u6790\u5668 \r\n   ServletFileUpload upload = new ServletFileUpload(factory);\r\n   \/\/\u89e3\u51b3\u4e0a\u4f20\u6587\u4ef6\u540d\u7684\u4e2d\u6587\u4e71\u7801 \r\n   upload.setHeaderEncoding(\"UTF-8\"); \r\n   \/\/ 1. \u5f97\u5230 FileItem \u7684\u96c6\u5408 items \r\n   List&lt;FileItem&gt; items = upload.parseRequest(request);\r\n   logger.info(\"items:{}\", items.size());\r\n   \/\/ 2. \u904d\u5386 items: \r\n   for (FileItem item : items) { \r\n    String name = item.getFieldName(); \r\n    logger.info(\"fieldName:{}\", name);\r\n    \/\/ \u82e5\u662f\u4e00\u4e2a\u4e00\u822c\u7684\u8868\u5355\u57df, \u6253\u5370\u4fe1\u606f \r\n    if (item.isFormField()) { \r\n     String value = item.getString(\"utf-8\"); \r\n     if(\"session_token\".equals(name)){\r\n      sessionToken = value;\r\n     }\r\n    }else {\r\n     if(\"file\".equals(name)){\r\n      file = item;\r\n     }\r\n    } \r\n   }\r\n   \/\/session\u6821\u9a8c\r\n   if(StringUtils.isEmpty(sessionToken)){\r\n    message.setStatus(StatusCodeConstant.SESSION_TOKEN_TIME_OUT);\r\n    message.setErrorMsg(StatusCodeConstant.SESSION_TOKEN_TIME_OUT_MSG);\r\n   }\r\n   String userId = RedisUtils.hget(sessionToken,\"userId\");\r\n   logger.info(\"userId:{}\", userId);\r\n   if(StringUtils.isEmpty(userId)){\r\n    message.setStatus(StatusCodeConstant.SESSION_TOKEN_TIME_OUT);\r\n    message.setErrorMsg(StatusCodeConstant.SESSION_TOKEN_TIME_OUT_MSG);\r\n   }\r\n   \/\/\u4e0a\u4f20\u6587\u4ef6\r\n   if(file == null){\r\n   }else{\r\n    swapStream1 = new ByteArrayOutputStream();\r\n    in = file.getInputStream();\r\n    byte[] buff = new byte[1024];\r\n    int rc = 0;\r\n    while ((rc = in.read(buff)) &gt; 0) {\r\n     swapStream1.write(buff, 0, rc);\r\n    }\r\n    Usr usr = new Usr();\r\n    usr.setObjectId(Integer.parseInt(userId));\r\n    final byte[] bytes = swapStream1.toByteArray();\r\n    eosResponse= ServerProxy.getSharedInstance().saveHeadPortrait(usr, new RequestOperation() {\r\n     @Override\r\n     public void addValueToRequest(EOSRequest request) {\r\n      request.addMedia(\"head_icon_media\", new EOSMediaData(EOSMediaData.MEDIA_TYPE_IMAGE_JPEG, bytes));\r\n     }\r\n    });\r\n    \/\/ \u8bf7\u6c42\u6210\u529f\u7684\u573a\u5408\r\n    if (eosResponse.getCode() == 0) {\r\n     message.setStatus(ConstantUnit.SUCCESS);\r\n    } else {\r\n     message.setStatus(String.valueOf(eosResponse.getCode()));\r\n    }\r\n   }\r\n  } catch (Exception e) {\r\n   e.printStackTrace();\r\n  } finally{\r\n   try {\r\n    if(swapStream1 != null){\r\n     swapStream1.close();\r\n    }\r\n   } catch (IOException e) {\r\n    e.printStackTrace();\r\n   }\r\n   try {\r\n    if(in != null){\r\n     in.close();\r\n    }\r\n   } catch (IOException e) {\r\n    e.printStackTrace();\r\n   }\r\n  }\r\n  PrintWriter out = response.getWriter(); \r\n  out.write(JSONObject.toJSONString(message)); \r\n }\r\n protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {\r\n  doGet(request, response);\r\n }\r\n}<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>\u76f8\u4fe1\u770b\u4e86\u672c\u6587\u6848\u4f8b\u4f60\u5df2\u7ecf\u638c\u63e1\u4e86\u65b9\u6cd5\uff0c\u66f4\u591a\u7cbe\u5f69\u8bf7\u5173\u6ce8\u7c73\u4e91\u5176\u5b83\u76f8\u5173\u6587\u7ae0\uff01<\/p>\n<p>\u63a8\u8350\u9605\u8bfb\uff1a<\/p>\n<p><\/p>\n<p><\/p>\n<p>\u4ee5\u4e0a\u5c31\u662f\u5fae\u4fe1\u5c0f\u7a0b\u5e8f\u5185\u5b9e\u73b0\u4e0a\u4f20\u56fe\u7247\u9644\u540e\u7aef\u4ee3\u7801\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\u6b21\u7ed9\u5927\u5bb6\u5e26\u6765\u5fae\u4fe1\u5c0f\u7a0b\u5e8f\u5185\u5b9e\u73b0\u4e0a\u4f20\u56fe\u7247\u9644\u540e\u7aef\u4ee3\u7801\uff0c\u5fae\u4fe1\u5c0f\u7a0b\u5e8f\u5185\u5b9e\u73b0\u4e0a\u4f20\u56fe\u7247\u7684\u6709\u54ea\u4e9b\uff0c\u4e0b\u9762\u5c31\u662f\u5b9e\u6218\u6848\u4f8b\uff0c\u4e00\u8d77\u6765\u770b\u4e00\u4e0b\u3002 \u5f53\u7136\u5c0f\u7a0b\u5e8f\u4e5f\u662f\u53ef\u4ee5\u4e0a\u4f20\u56fe\u7247\u7684\uff0c\u5fae\u4fe1\u5c0f\u7a0b\u5e8f\u6587\u6863\u4e5f\u5199\u7684\u5f88\u6e05\u695a\u3002 \u4e0a\u4f20\u56fe\u7247 \u9996\u5148\u9009\u62e9\u56fe\u7247 \u901a\u8fc7wx.chooseImage(OBJECT)\u5b9e\u73b0 \u5b98\u65b9\u793a\u4f8b\u4ee3\u7801 wx.chooseImage({ count: 1, \/\/ \u9ed8\u8ba49 sizeType: [&#8216;original&#8217;, &#8216;compressed&#8217;], \/\/ \u53ef\u4ee5\u6307\u5b9a\u662f\u539f\u56fe\u8fd8\u662f\u538b\u7f29\u56fe\uff0c\u9ed8\u8ba4\u4e8c\u8005\u90fd\u6709 sourceType: [&#8216;album&#8217;, &#8216;camera&#8217;], \/\/ \u53ef\u4ee5\u6307\u5b9a\u6765\u6e90\u662f\u76f8\u518c\u8fd8\u662f\u76f8\u673a\uff0c\u9ed8\u8ba4\u4e8c\u8005\u90fd\u6709 success: function (res) { \/\/ \u8fd4\u56de\u9009\u5b9a\u7167\u7247\u7684\u672c\u5730\u6587\u4ef6\u8def\u5f84\u5217\u8868\uff0ctempFilePath\u53ef\u4ee5\u4f5c\u4e3aimg\u6807\u7b7e\u7684src\u5c5e\u6027\u663e\u793a\u56fe\u7247 var tempFilePaths = res.tempFilePaths } }) \u767b\u5f55\u540e\u590d\u5236 \u56fe\u7247\u6700\u591a\u53ef\u4ee5\u9009\u62e99\u5f20, \u4e5f\u53ef\u4ee5\u901a\u8fc7\u62cd\u6444\u7167\u7247\u5b9e\u73b0\uff0c\u5f53\u9009\u62e9\u5b8c\u56fe\u7247\u4e4b\u540e\u4f1a\u83b7\u53d6\u5230\u56fe\u7247\u8def\u5f84, \u8fd9\u4e2a\u8def\u5f84\u5728\u672c\u6b21\u542f\u52a8\u671f\u95f4\u6709\u6548\u3002 \u5982\u679c\u9700\u8981\u4fdd\u5b58\u5c31\u9700\u8981\u7528wx.saveFile(OBJECT) \u4e0a\u4f20\u56fe\u7247 \u901a\u8fc7wx.uploadFile(OBJECT) \u53ef\u4ee5\u5c06\u672c\u5730\u8d44\u6e90\u5230\u670d\u52a1\u5668\u3002 \u539f\u7406\u5c31\u662f\u5ba2\u6237\u7aef\u53d1\u8d77\u4e00\u4e2a HTTPS POST \u8bf7\u6c42\uff0c\u5176\u4e2d content-type\u4e3a multipart\/form-data\u3002 \u5b98\u65b9\u793a\u4f8b\u4ee3\u7801 wx.chooseImage({ success: function(res) { var tempFilePaths = [&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-31499","post","type-post","status-publish","format-standard","hentry","category-19"],"_links":{"self":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts\/31499","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=31499"}],"version-history":[{"count":0,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts\/31499\/revisions"}],"wp:attachment":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/media?parent=31499"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/categories?post=31499"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/tags?post=31499"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}