{"id":10008146,"date":"2023-08-23T13:02:42","date_gmt":"2023-08-23T05:02:42","guid":{"rendered":"https:\/\/blog.itmax.cn\/?p=10008146"},"modified":"2023-08-23T13:02:42","modified_gmt":"2023-08-23T05:02:42","slug":"%e7%9c%9f%e5%ae%9e%e6%a1%88%e4%be%8b%ef%bc%9afeign-%e5%88%87%e6%8d%a2-okhttp-%e6%97%a0%e6%b3%95%e7%94%9f%e6%95%88%ef%bc%8c%e8%a2%ab%e8%80%81%e5%a4%a7%e9%aa%82%e7%9a%84%e6%9c%89%e7%82%b9%e6%85%8c","status":"publish","type":"post","link":"https:\/\/itmax.cn\/?p=10008146","title":{"rendered":"\u771f\u5b9e\u6848\u4f8b\uff1aFeign \u5207\u6362 okhttp \u65e0\u6cd5\u751f\u6548\uff0c\u88ab\u8001\u5927\u9a82\u7684\u6709\u70b9\u614c\uff01"},"content":{"rendered":"<p>\u6765\u6e90\uff1a<a target=\"_blank\" href=\"https:\/\/link.segmentfault.com\/?enc=%2BOEhj14oxw0bgcWgp8Wfjg%3D%3D.G66p0Hr0Ks%2F4uGqxMmCgqVbUy8R4Vjv80kXNrXVjerTrw%2BFM1eTMPXUiMywlxZQCO3yNMS2CUOOKgijK6zWNig%3D%3D\" rel=\"noopener noreferrer\">https:\/\/www.cnblogs.com\/mufeng3421\/p\/11442412.html<\/a><\/p>\n<p>\u63d0\u793a\uff1a\u5982\u679c\u53ea\u770b\u5982\u4f55\u89e3\u51b3\u95ee\u9898\uff0c\u8bf7\u770b\u6587\u7ae0\u7684\u672b\u5c3e\u5982\u4f55\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898<\/p>\n<h2>1. \u573a\u666f\u63cf\u8ff0<\/h2>\n<p>\u6700\u8fd1\u9879\u76ee\u4e2d\u4f7f\u7528\u4e86feign\u5f53\u505ahttp\u8bf7\u6c42\u5de5\u5177\u6765\u4f7f\u7528\u3001\u76f8\u5bf9\u4e8ehttpclient\u3001resttemplate\u6765\u8bf4\uff0cfegin\u7528\u8d77\u6765\u65b9\u4fbf\u5f88\u591a\u3002\u7136\u540e\u9879\u76ee\u6709httptrace\u7684\u9700\u6c42\uff0c\u9700\u8981\u8f93\u51fa\u8bf7\u6c42\u65e5\u5fd7\u3002<\/p>\n<p>\u6240\u4ee5\u5c31\u5f00\u542f\u4e86feign\u81ea\u5df1\u7684\u65e5\u5fd7\uff0c\u53d1\u73b0\u5b83\u81ea\u5e26\u7684\u65e5\u5fd7\u662fdebug\u7ea7\u522b\u624d\u80fd\u6253\u5370\u3002\u800c\u4e14\u662f\u9010\u884c\u6253\u5370\u7684\uff0c\u770b\u65e5\u5fd7\u975e\u5e38\u7684\u4e0d\u65b9\u4fbf\u3002\u6240\u4ee5\u9700\u8981\u8f93\u51fajson\u683c\u5f0f\u7684\u65e5\u5fd7\u6700\u597d\u3002<\/p>\n<h2>2.\u89e3\u51b3\u6b65\u9aa4<\/h2>\n<h3>2.1 \u5f15\u5165feign\u4f9d\u8d56<\/h3>\n<pre><code class=\"xml\">&lt;dependency&gt;\n  &lt;groupId&gt;org.springframework.cloud&lt;\/groupId&gt;\n  &lt;artifactId&gt;spring-cloud-starter-openfeign&lt;\/artifactId&gt;\n&lt;\/dependency&gt;\n\n&lt;dependencyManagement&gt;\n  &lt;dependencies&gt;\n    &lt;dependency&gt;\n      &lt;groupId&gt;org.springframework.cloud&lt;\/groupId&gt;\n      &lt;artifactId&gt;spring-cloud-dependencies&lt;\/artifactId&gt;\n      &lt;version&gt;${\u81ea\u884c\u9009\u62e9\u9002\u5408\u9879\u76ee\u7684\u7248\u672c}&lt;\/version&gt;\n      &lt;type&gt;pom&lt;\/type&gt;\n      &lt;scope&gt;import&lt;\/scope&gt;\n    &lt;\/dependency&gt;\n  &lt;\/dependencies&gt;\n&lt;\/dependencyManagement&gt;<\/code><\/pre>\n<p>\u8fd9\u91cc\u4f7f\u7528\u4e86spring-cloud-openfeing\u6765\u907f\u514d\u81ea\u5df1\u624b\u5de5\u5b9e\u73b0feign\u7684\u6ce8\u5165\uff0c\u7528\u6cd5\u4e0a\u548cfeign\u4e00\u6837<\/p>\n<p>\u63a8\u8350\u4e00\u4e2a\u5f00\u6e90\u514d\u8d39\u7684 Spring Boot \u5b9e\u6218\u9879\u76ee\uff1a<\/p>\n<blockquote><p><a target=\"_blank\" href=\"https:\/\/link.segmentfault.com\/?enc=%2FS%2BPSM4pfr6w7EXxLdiwCw%3D%3D.KPlxJ7E1cyJ3cB%2BsjscdxhYHq7o%2Ba09mpTv%2BgwDC1KfEsF8NHJTCiiOrb8kBen7n%2F8H%2BhMBdWb6CtGG351le6w%3D%3D\" rel=\"noopener noreferrer\">https:\/\/github.com\/javastacks\/spring-boot-best-practice<\/a><\/p><\/blockquote>\n<h3>2.2 \u914d\u7f6efeign<\/h3>\n<p>\u5728\u5165\u53e3\u7c7b\u4e0a\u6dfb\u52a0 <code>@EnableFeignClients<\/code> \u6ce8\u89e3<\/p>\n<pre><code class=\"java\">@SpringBootApplication\n@EnableFeignClients\npublic class Application {\n\n    public static void main(String[] args) {\n        SpringApplication.run(Application.class, args);\n    }\n\n}<\/code><\/pre>\n<p>\u4f7f\u7528feing\u81ea\u5df1\u7684Contract\uff0c\u65b9\u4fbf\u4f7f\u7528feign\u81ea\u5df1\u7684\u6ce8\u89e3\u6765\u58f0\u660ehttp\u63a5\u53e3\u3002\u8fd9\u91cc\u4f7f\u7528\u4e86\u4e00\u4e2a\u914d\u7f6e\u7c7b<\/p>\n<pre><code class=\"java\">@Configuration\npublic class FeignConfig {\n    @Bean\n    public Contract feignContract() {\n        return new feign.Contract.Default();\n    }\n}<\/code><\/pre>\n<h3>2.3 \u58f0\u660e\u63a5\u53e3<\/h3>\n<p>\u53ea\u9700\u8981\u58f0\u660e\u4e00\u4e2a\u5e26\u6709@FeignClient\u6ce8\u89e3\u7684\u63a5\u53e3\uff0c\u5c31\u58f0\u660e\u597d\u4e86\u4e00\u4e2aFeign\u7684http\u8bf7\u6c42\u63a5\u53e3<\/p>\n<pre><code class=\"java\">@FeignClient(name = &quot;accessPlatform&quot;, url = &quot;${url.access-platform}&quot;)\npublic interface AccessPlatformFeignClient {\n    @RequestLine(&quot;GET \/access-platform\/resource&quot;)\n    List&lt;AccessResource&gt; queryResourceList(@QueryMap Map&lt;String, Object&gt; query);\n}<\/code><\/pre>\n<h2>3.\u5207\u6362Feign\u7684\u5ba2\u6237\u7aef\u4e3aOkHttp<\/h2>\n<blockquote><p>\u7531\u4e8efeign\u81ea\u5e26\u7684http\u5ba2\u6237\u7aef\u5b9e\u73b0\u662fHttpURLConnection\uff0c\u6ca1\u6709\u8fde\u63a5\u6c60\u529f\u80fd\uff0c\u53ef\u914d\u7f6e\u80fd\u529b\u4e5f\u6bd4\u8f83\u5dee\uff0c\u56e0\u6b64\u6211\u4eec\u4f7f\u7528okhttp\u4f5c\u4e3a\u5e95\u5c42\u7684http\u5ba2\u6237\u7aef\u7684\u5177\u4f53\u5b9e\u73b0\u3002<\/p><\/blockquote>\n<h3>3.1 \u5f15\u5165okhttp\u7684\u4f9d\u8d56<\/h3>\n<pre><code class=\"xml\"> &lt;dependency&gt;\n    &lt;groupId&gt;io.github.openfeign&lt;\/groupId&gt;\n    &lt;artifactId&gt;feign-okhttp&lt;\/artifactId&gt;\n    &lt;version&gt;${feign-okhttp.version}&lt;\/version&gt;\n&lt;\/dependency&gt;<\/code><\/pre>\n<h3>3.2 \u4fee\u6539\u4e4b\u524d\u7684FeignConfig\u914d\u7f6e\u7c7b<\/h3>\n<p>\u95ee\u9898\u5c31\u51fa\u5728\u8fd9\u91cc\u3001\u4e0d\u8fc7\u5148\u4e0d\u6025\uff0c\u6211\u4eec\u7ee7\u7eed<\/p>\n<pre><code class=\"java\">@Configuration\n@ConditionalOnClass(Feign.class)\n@AutoConfigureBefore(FeignAutoConfiguration.class)\npublic class FeignConfig {\n    \/\/ \u6ce8\u5165feignContract\n    @Bean\n    public Contract feignContract() {\n        return new feign.Contract.Default();\n    }\n\n    \/\/ \u6ce8\u5165\u81ea\u5b9a\u4e49\u7684okHttpClient\n    @Bean\n    public okhttp3.OkHttpClient okHttpClient(){\n        return new okhttp3.OkHttpClient.Builder()\n            .readTimeout(60, TimeUnit.SECONDS)\n            .connectTimeout(60, TimeUnit.SECONDS)\n            .writeTimeout(120, TimeUnit.SECONDS)\n            .connectionPool(new ConnectionPool())\n            .build();\n    }\n}<\/code><\/pre>\n<p>\u5f00\u542fokhttp\u4f5c\u4e3afeign\u7684\u5ba2\u6237\u7aef<\/p>\n<pre><code class=\"yaml\"># application.yml\nfeign:\n    okhttp:\n        enabled: true<\/code><\/pre>\n<p>\u4e00\u5207\u5b8c\u7f8e\u3001\u7f51\u4e0a\u7684\u8bb8\u591a\u535a\u5ba2\u4e5f\u90fd\u662f\u8fd9\u4e48\u5199\u7684\u3002\u7136\u540e\u5b83\u4eec\u544a\u8bc9\u4f60\u5df2\u7ecf\u914d\u7f6e\u5b8c\u4e86\uff1f\u5475\u5475\uff0c\u4f60\u4eec\u5230\u5e95\u81ea\u5df1\u8bd5\u8fc7\u6ca1\u6709\uff1f\uff1f<\/p>\n<h3>3.3 \u8bd5\u7740\u8bf7\u6c42\u4e00\u4e0b<\/h3>\n<p>\u5f53\u7136\u8fd9\u91cc\u51fa\u95ee\u9898\u4e86\uff0c\u53d1\u51fa\u7684\u8bf7\u6c42\u5e76\u975e\u6765\u81eaokhttp\uff0c\u8fd8\u662f\u9ed8\u8ba4\u7684JDK\u7684HttpURLConnection\uff0c\u95ee\u9898\u51fa\u5728\u54ea\u91cc\u5462\uff1f\u63a5\u7740\u770b<\/p>\n<h2>4.\u627e\u51fa\u95ee\u9898\u6240\u5728<\/h2>\n<p>\u6211\u6000\u7591\u662ffeing\u5728\u6ce8\u5165\u914d\u7f6e\u7684\u65f6\u5019\uff0c\u6839\u672c\u5c31\u6ca1\u6709\u8fd0\u884c\u5173\u4e8eokhttp\u7684\u914d\u7f6e<\/p>\n<h3>4.1 \u67e5\u770b\u670d\u52a1\u542f\u52a8\u65f6feign\u914d\u7f6e\u8fc7\u7a0b<\/h3>\n<p>1.\u5c06\u670d\u52a1\u6839\u65e5\u5fd7\u7ea7\u522b\u8c03\u6574\u4e3adebug\u7ea7\u522b<\/p>\n<pre><code class=\"yaml\">logging:\n    level:\n        root: debug<\/code><\/pre>\n<p>2.\u542f\u52a8\u670d\u52a1\u3001\u67e5\u770b\u63a7\u5236\u53f0\u8f93\u51fa<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"723\" height=\"123\" referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/bVc8mny\" alt=\"\u63a7\u5236\u53f0\u8f93\u51fa\" title=\"\u63a7\u5236\u53f0\u8f93\u51fa\"><\/p>\n<p>\u770b\u5230\u6ca1\uff0cokhttp\u7684\u914d\u7f6e\u4e0d\u7b26\u5408\u914d\u7f6e\u8fd0\u884c\u6761\u4ef6\u3002<\/p>\n<p>3.\u67e5\u8be2 <code>FeignAutoConfiguration<\/code> \u8fd9\u4e2a\u914d\u7f6e\u7c7b\u7684\u7ec6\u8282<\/p>\n<pre><code class=\"java\">@Configuration\n@ConditionalOnClass({Feign.class})\n@EnableConfigurationProperties({FeignClientProperties.class, FeignHttpClientProperties.class})\npublic class FeignAutoConfiguration {\n        \/\/ .....\u5176\u4ed6\u7684\u914d\u7f6e\n      @Configuration\n    @ConditionalOnClass({OkHttpClient.class})\n    @ConditionalOnMissingClass({&quot;com.netflix.loadbalancer.ILoadBalancer&quot;})\n    @ConditionalOnMissingBean({okhttp3.OkHttpClient.class})\n    @ConditionalOnProperty({&quot;feign.okhttp.enabled&quot;})\n    protected static class OkHttpFeignConfiguration {\n       \/\/ ...okhttp\u7684\u914d\u7f6e\n    }\n\n      \/\/ .....\u5176\u4ed6\u7684\u914d\u7f6e\n}<\/code><\/pre>\n<p>\u5c31\u662f\u8fd9\u4e2a\u81ea\u52a8\u914d\u7f6e\u7c7b\u641e\u7684\u9b3c\u3001\u5f53\u6211\u770b\u5230 <code>@ConditionalOnMissingBean({okhttp3.OkHttpClient.class})<\/code> \u8fd9\u4e2a\u6ce8\u89e3\u65f6\uff0c\u6211\u5c31\u660e\u767d\u4e86\u3002<br \/>\u7ffb\u6210\u767d\u8bdd\u5c31\u662f\uff0c\u53ea\u6709\u5f53\u5bb9\u5668\u4e2d\u6ca1\u6709OkHttpClient\u7684\u5b9e\u4f8b\u65f6\u3002\u4ed6\u624d\u4f1a\u8fd0\u884c\u3002\u5982\u679c\u5728 FeignAutoConfiguration\u4e4b\u524d\u6ce8\u5165\u4e86\u6211\u4eec\u81ea\u5df1\u5b9a\u4e49\u7684OkHttpClient\u5b9e\u4f8b\uff0c\u90a3\u4e0d\u597d\u610f\u601d\uff0c\u6211\u4e0d\u5e72\u4e86\uff1f\u65e0\u4e0d\u6ce8\u5165\u3002<\/p>\n<h2>5.\u89e3\u51b3\u95ee\u9898<\/h2>\n<p>\u65e2\u7136\u81ea\u52a8\u914d\u7f6e\u4e0d\u5e72\uff0c\u90a3\u6211\u4eec\u81ea\u5df1\u52a8\u624b\u5e72\u3002\u62f7\u8d1d <code>FeignAutoConfiguration<\/code> \u914d\u7f6e\u7c7b\u4e2d\u7684\u914d\u7f6e\u8fc7\u7a0b\uff0c\u7c98\u8d34\u5728FeignConfig\u914d\u7f6e\u7c7b\u4e2d\u624b\u52a8\u6ce8\u5165feign\u7684client\u3002Ok\uff01\u5b8c\u7f8e\u89e3\u51b3\u3002<\/p>\n<pre><code class=\"java\">@Configuration\n@ConditionalOnClass(Feign.class)\n@AutoConfigureAfter(FeignAutoConfiguration.class)\npublic class FeignConfig {\n\/\/    private okhttp3.OkHttpClient okHttpClient;\n\n    @Bean\n    public Contract feignContract() {\n        return new feign.Contract.Default();\n    }\n\n    @Bean\n    @ConditionalOnMissingBean({Client.class})\n    public Client feignClient(okhttp3.OkHttpClient client) {\n        return new feign.okhttp.OkHttpClient(client);\n    }\n\n    @Bean\n    @ConditionalOnMissingBean({ConnectionPool.class})\n    public ConnectionPool httpClientConnectionPool(FeignHttpClientProperties httpClientProperties, OkHttpClientConnectionPoolFactory connectionPoolFactory) {\n        Integer maxTotalConnections = httpClientProperties.getMaxConnections();\n        Long timeToLive = httpClientProperties.getTimeToLive();\n        TimeUnit ttlUnit = httpClientProperties.getTimeToLiveUnit();\n        return connectionPoolFactory.create(maxTotalConnections, timeToLive, ttlUnit);\n    }\n\n    @Bean\n    public OkHttpClient client(OkHttpClientFactory httpClientFactory, ConnectionPool connectionPool, FeignHttpClientProperties httpClientProperties) {\n        Boolean followRedirects = httpClientProperties.isFollowRedirects();\n        Integer connectTimeout = httpClientProperties.getConnectionTimeout();\n        Boolean disableSslValidation = httpClientProperties.isDisableSslValidation();\n        return httpClientFactory.createBuilder(disableSslValidation)\n                .connectTimeout((long)connectTimeout, TimeUnit.MILLISECONDS)\n                .followRedirects(followRedirects)\n                .connectionPool(connectionPool)\n                .addInterceptor(new OkHttpLogInterceptor()) \/\/ \u81ea\u5b9a\u4e49\u8bf7\u6c42\u65e5\u5fd7\u62e6\u622a\u5668\n                .build();\n    }\n}<\/code><\/pre>\n<h2>6.\u5c0f\u7ed3<\/h2>\n<p>\u5982\u679c\u4f60\u6ca1\u6709\u8010\u5fc3\u770b\u5b8c\u6240\u6709\u7684\u8fc7\u7a0b\u7684\u8bdd\u3002\u5c31\u8bb0\u4f4f\u4e00\u53e5\u8bdd\uff1a\u7528\u81ea\u5df1\u624b\u52a8\u6ce8\u5165Feign\u7684Client\u5b9e\u73b0\uff0c\u6765\u4ee3\u66ff Feign\u7684\u81ea\u52a8\u914d\u7f6e\u6240\u505a\u7684\u8fc7\u7a0b\u5c31\u597d\u4e86\u3002\u5177\u4f53\u7684\u914d\u7f6e\u8bf7\u770b\u7b2c5\u70b9\u3002<\/p>\n<p><strong>\u8fd1\u671f\u70ed\u6587\u63a8\u8350\uff1a<\/strong><\/p>\n<p>1.<a target=\"_blank\" href=\"https:\/\/link.segmentfault.com\/?enc=r%2BMU8Rwl24G1iEsCi7lE0A%3D%3D.KZ%2BvFXN7F3GKx%2F0LSmnhxgcXSahcB5QiSmXd22qf0hs%3D\" rel=\"noopener noreferrer\">1,000+ \u9053 Java\u9762\u8bd5\u9898\u53ca\u7b54\u6848\u6574\u7406(2022\u6700\u65b0\u7248)<\/a><\/p>\n<p>2.<a target=\"_blank\" href=\"https:\/\/link.segmentfault.com\/?enc=THatuoCNkHbAjsw%2BUsrebQ%3D%3D.VrMy7NpichjnNdjCM15XyBBcnczqDyQvdzsT3Yvp1d0V46pe7oaOSzNMUlvAkJi8FQ2ZcDkrQKGvsHBPiYcGig%3D%3D\" rel=\"noopener noreferrer\">\u52b2\u7206\uff01Java \u534f\u7a0b\u8981\u6765\u4e86\u3002\u3002\u3002<\/a><\/p>\n<p>3.<a target=\"_blank\" href=\"https:\/\/link.segmentfault.com\/?enc=iL6MP6jbHfUWaDw7Fe%2BOBw%3D%3D.vFr%2FFJhIpiI1%2FvlHqT2pHKHHxJY4pnLIYf0D%2Bo6cU9MQkyFopww%2BDZ4lccuLTzrH\" rel=\"noopener noreferrer\">Spring Boot 2.x \u6559\u7a0b\uff0c\u592a\u5168\u4e86\uff01<\/a><\/p>\n<p>4.<a target=\"_blank\" href=\"https:\/\/link.segmentfault.com\/?enc=w97fcBRtHmejXNjGcaWzDg%3D%3D.zpeAvvC54E1UctkBk53UvZe5isEzESSoHdnNdRrrJOvxABT%2B%2F9mhxvxSXRtilq4G4JXC1MSEl8MBD63jvVEnkQ%3D%3D\" rel=\"noopener noreferrer\">\u522b\u518d\u5199\u6ee1\u5c4f\u7684\u7206\u7206\u7206\u70b8\u7c7b\u4e86\uff0c\u8bd5\u8bd5\u88c5\u9970\u5668\u6a21\u5f0f\uff0c\u8fd9\u624d\u662f\u4f18\u96c5\u7684\u65b9\u5f0f\uff01\uff01<\/a><\/p>\n<p>5.<a target=\"_blank\" href=\"https:\/\/link.segmentfault.com\/?enc=9FhsT7yu1gRh69cQOYo4oQ%3D%3D.j3YGL%2FHg4oVPGP95SqFWomZKoysqoEy3oT2Qi7uLzgWSJ%2FL0mXxKTGX03n3FnxhBaqlLhHJko13VYQPaYAvlDxZjFywxo4dh5MiVylh7taI%3D\" rel=\"noopener noreferrer\">\u300aJava\u5f00\u53d1\u624b\u518c\uff08\u5d69\u5c71\u7248\uff09\u300b\u6700\u65b0\u53d1\u5e03\uff0c\u901f\u901f\u4e0b\u8f7d\uff01<\/a><\/p>\n<p>\u89c9\u5f97\u4e0d\u9519\uff0c\u522b\u5fd8\u4e86\u968f\u624b\u70b9\u8d5e+\u8f6c\u53d1\u54e6\uff01<\/p>\n<p><a href=\"https:\/\/segmentfault.com\/a\/1190000044140885\">https:\/\/segmentfault.com\/a\/1190000044140885<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u6765\u6e90\uff1ahttps:\/\/www.cnblogs.com\/mufeng3421\/p\/11442412.html \u63d0 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[4],"tags":[],"class_list":["post-10008146","post","type-post","status-publish","format-standard","hentry","category-share"],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/posts\/10008146","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=10008146"}],"version-history":[{"count":0,"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/posts\/10008146\/revisions"}],"wp:attachment":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=10008146"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=10008146"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=10008146"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}