{"id":40352,"date":"2023-05-20T06:25:49","date_gmt":"2023-08-18T16:00:20","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8openfeign%e4%b8%8edmm-com%e8%bf%9b%e8%a1%8c%e9%80%9a%e4%bf%a1\/"},"modified":"2024-04-30T05:01:30","modified_gmt":"2024-04-29T21:01:30","slug":"%e4%bd%bf%e7%94%a8openfeign%e4%b8%8edmm-com%e8%bf%9b%e8%a1%8c%e9%80%9a%e4%bf%a1","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8openfeign%e4%b8%8edmm-com%e8%bf%9b%e8%a1%8c%e9%80%9a%e4%bf%a1\/","title":{"rendered":"\u4f7f\u7528OpenFeign\u4e0eDMM.com\u8fdb\u884c\u901a\u4fe1."},"content":{"rendered":"<h2>\u76ee\u5f55<\/h2>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u6982\u8981<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u74b0\u5883<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u69cb\u6210<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u5404\u7a2e\u30b5\u30fc\u30d3\u30b9\u306e\u7528\u610f<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u5b9f\u88c5\u5185\u5bb9<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u5b9f\u884c\u7d50\u679c<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u6240\u611f<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\u53c2\u8003\u8cc7\u6599<\/ul>\n<h2>\u7b80\u8981\u6982\u62ec<\/h2>\n<p>\u6211\u5728\u8fd9\u91cc\u63cf\u8ff0\u4e86\u4f7f\u7528OpenFeign\u6765\u521b\u5efa\u4e0eDMM.com\u901a\u4fe1\u7684\u5e94\u7528\u7a0b\u5e8f\u7684\u4e00\u7cfb\u5217\u8fc7\u7a0b\u3002<br \/>\n\u5173\u4e8e\u9875\u9762\u90e8\u5206\uff0c\u6211\u4eec\u8bf7ChatGPT\u4e3a\u6211\u4eec\u521b\u5efa\u4e86\u4e00\u4e2a\u57fa\u7840\uff0c\u7136\u540e\u6211\u4eec\u52aa\u529b\u5c06\u5176\u8f6c\u6362\u4e3aThymeleaf\u3002<br \/>\n\u5982\u679c\u4f60\u53ea\u60f3\u67e5\u770b\u6e90\u4ee3\u7801\uff0c\u8bf7\u70b9\u51fb\u8fd9\u91cc\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d400d37434c4406c90af9\/4-0.png\" alt=\"image.png\" \/><\/div>\n<h2>\u73af\u5883<\/h2>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Kotlin 1.8.22<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">SpringBoot 3.1.5<\/ul>\n<h2>\u7ec4\u6210<\/h2>\n<p>\u901a\u8fc7\u5e94\u7528\u7a0b\u5e8f\u4e0e\u5173\u952e\u5b57\u534f\u4f5c\uff0c\u83b7\u53d6\u5e76\u663e\u793a\u5546\u54c1\u4fe1\u606f\u3002<br \/>\n\u5546\u54c1\u641c\u7d22\u529f\u80fd\u4f7f\u7528\u4e86DMM.com\u63d0\u4f9b\u7684\u5546\u54c1\u641c\u7d22API\u3002<br \/>\n\u8bf7\u67e5\u9605\u6b64\u5904\u4ee5\u4e86\u89e3API\u7684\u89c4\u683c\u3002<\/p>\n<p><iframe>\u8bf7\u7528\u4e2d\u6587\u8fdb\u884c\u51c6\u786e\u7684\u8868\u8fbe\u5e76\u63d0\u4f9b\u4e00\u4e2a\u9009\u9879\u3002The dog is playing in the park.<\/p>\n<p>Option 1: \u72d7\u6b63\u5728\u516c\u56ed\u91cc\u73a9\u800d\u3002<\/p>\n<p><\/iframe><\/p>\n<h2>\u63d0\u4f9b\u591a\u79cd\u670d\u52a1\u63d0\u524d\u51c6\u5907<\/h2>\n<p>\u5728\u4f7f\u7528API\u4e4b\u524d\uff0c\u9700\u8981\u8fdb\u884cDMM.com\u7684\u4f1a\u5458\u6ce8\u518c\u3001\u6ce8\u518c\u4f1a\u5458\u9500\u552e\u8054\u76df\u4ee5\u53ca\u7533\u8bf7API\u4f7f\u7528\u3002\u8bf7\u53c2\u8003\u6b64\u5904\u4ee5\u83b7\u53d6\u66f4\u591a\u8be6\u7ec6\u4fe1\u606f\u3002<\/p>\n<h2>\u5b9e\u65bd\u5185\u5bb9<\/h2>\n<p>OpenFeign\u5141\u8bb8\u6211\u4eec\u901a\u8fc7\u6ce8\u89e3\u6765\u63cf\u8ff0\u901a\u4fe1\u65b9\u5f0f\uff0c\u5982\u4e0b\u6240\u793a\uff1a<br \/>\n\u53ef\u4ee5\u5728Config\u7c7b\u4e2d\u8fdb\u884c\u5404\u79cd\u8bbe\u7f6e\uff0c\u5e76\u901a\u8fc7\u6307\u5b9a\u8be5\u7c7b\u6765\u5e94\u7528\u8fd9\u4e9b\u8bbe\u7f6e\u3002<br \/>\n\u6709\u5173\u6ce8\u89e3\u7684\u8be6\u7ec6\u89c4\u8303\uff0c\u8bf7\u53c2\u8003\u6b64\u5904\u3002<br \/>\n\u203b\u4ee5\u4e0b\u4ee3\u7801\u901a\u8fc7POJO\u65b9\u5f0f\u4f20\u9012\u67e5\u8be2\u53c2\u6570\u3002<br \/>\n\u53ef\u4ee5\u4f7f\u7528@RequestParam\u6ce8\u89e3\u5c06\u6bcf\u4e2a\u503c\u4f5c\u4e3a\u53c2\u6570\u5355\u72ec\u4f20\u9012\u3002<br \/>\n\u4e2a\u4eba\u8ba4\u4e3a\u4f7f\u7528DTO\u66f4\u5bb9\u6613\u7ba1\u7406\uff0c\u56e0\u6b64\u5728\u8fd9\u91cc\u6211\u4f7f\u7528\u4e86DTO\u8fdb\u884c\u8bf4\u660e\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">package<\/span> <span class=\"nn\">com.example.openfeignexample.client<\/span>\r\n\r\n<span class=\"k\">import<\/span> <span class=\"nn\">com.example.openfeignexample.client.dto.GetItemsRequest<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nn\">com.example.openfeignexample.client.dto.GetItemsResponse<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nn\">com.example.openfeignexample.config.interceptor.DmmApiConfig<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nn\">org.springframework.cloud.openfeign.FeignClient<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nn\">org.springframework.cloud.openfeign.SpringQueryMap<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nn\">org.springframework.http.ResponseEntity<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nn\">org.springframework.web.bind.annotation.GetMapping<\/span>\r\n\r\n<span class=\"nd\">@FeignClient<\/span><span class=\"p\">(<\/span><span class=\"n\">name<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"DMMClient\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">url<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"\\${dmm-api.url}\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">configuration<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"nc\">DmmApiConfig<\/span><span class=\"o\">::<\/span><span class=\"k\">class<\/span><span class=\"p\">])<\/span>\r\n<span class=\"kd\">interface<\/span> <span class=\"nc\">DmmClient<\/span> <span class=\"p\">{<\/span>\r\n\r\n\t<span class=\"nd\">@GetMapping<\/span><span class=\"p\">(<\/span><span class=\"s\">\"\/ItemList\"<\/span><span class=\"p\">)<\/span>\r\n\t<span class=\"k\">fun<\/span> <span class=\"nf\">getItems<\/span><span class=\"p\">(<\/span><span class=\"nd\">@SpringQueryMap<\/span> <span class=\"n\">request<\/span><span class=\"p\">:<\/span> <span class=\"nc\">GetItemsRequest<\/span><span class=\"p\">):<\/span> <span class=\"nc\">ResponseEntity<\/span><span class=\"p\">&lt;<\/span><span class=\"nc\">GetItemsResponse<\/span><span class=\"p\">&gt;<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<\/code><\/pre>\n<p>\u4ee5\u4e0b\u4e3a\u5546\u54c1\u641c\u7d22API\u7684\u8bf7\u6c42\u5185\u5bb9\u3002<br \/>\n\u867d\u7136\u9700\u8981API\u5bc6\u94a5\u548c\u8054\u76dfID\uff0c\u4f46\u4e0e\u5176\u4ed6\u901a\u7528\u8981\u6c42\u65e0\u5173\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">package<\/span> <span class=\"nn\">com.example.openfeignexample.client.dto<\/span>\r\n\r\n<span class=\"kd\">data class<\/span> <span class=\"nc\">GetItemsRequest<\/span><span class=\"p\">(<\/span>\r\n\t<span class=\"kd\">val<\/span> <span class=\"py\">site<\/span><span class=\"p\">:<\/span> <span class=\"nc\">String<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"DMM.com\"<\/span><span class=\"p\">,<\/span>\r\n\t<span class=\"kd\">val<\/span> <span class=\"py\">keyword<\/span><span class=\"p\">:<\/span> <span class=\"nc\">String<\/span><span class=\"p\">,<\/span>\r\n\t<span class=\"kd\">val<\/span> <span class=\"py\">hits<\/span><span class=\"p\">:<\/span> <span class=\"nc\">Int<\/span> <span class=\"p\">=<\/span> <span class=\"mi\">100<\/span><span class=\"p\">,<\/span>\r\n\t<span class=\"kd\">val<\/span> <span class=\"py\">sort<\/span><span class=\"p\">:<\/span> <span class=\"nc\">String<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"date\"<\/span>\r\n<span class=\"p\">)<\/span>\r\n<\/code><\/pre>\n<p>\u5728Config\u7c7b\u4e2d\u8fdb\u884c\u4e86\u4ee5\u4e0b\u4e09\u4e2a\u8bbe\u7f6e\u3002\u867d\u7136\u5b83\u4eec\u88ab\u6ce8\u518c\u4e3aBean\uff0c\u4f46\u65e5\u5fd7\u7ea7\u522b\u7b49\u8bbe\u7f6e\u4e5f\u53ef\u4ee5\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u8fdb\u884c\u8bbe\u7f6e\u3002<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">API\u30ad\u30fc\u7b49\u306e\u4ed8\u4e0e\u3002<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u30ea\u30c8\u30e9\u30a4\u8a2d\u5b9a\u3002<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\u30ed\u30b0\u51fa\u529b\u8a2d\u5b9a\u3002<\/ul>\n<pre class=\"post-pre\"><code><span class=\"k\">package<\/span> <span class=\"nn\">com.example.openfeignexample.config.interceptor<\/span>\r\n\r\n<span class=\"k\">import<\/span> <span class=\"nn\">com.example.openfeignexample.client.constant.DmmHeaders<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nn\">com.example.openfeignexample.constant.DmmApiConfigProperty<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nn\">com.example.openfeignexample.util.ConfigUtil<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nn\">feign.Logger<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nn\">feign.Request<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nn\">feign.RequestInterceptor<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nn\">feign.Response<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nn\">feign.RetryableException<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nn\">feign.Retryer<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nn\">feign.codec.ErrorDecoder<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nn\">org.apache.commons.io.IOUtils<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nn\">org.slf4j.LoggerFactory<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nn\">org.springframework.context.annotation.Bean<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nn\">org.springframework.http.HttpHeaders<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nn\">org.springframework.http.HttpStatus<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nn\">org.springframework.http.MediaType<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nn\">java.io.InputStream<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nn\">java.lang.Exception<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nn\">java.net.URLDecoder<\/span>\r\n\r\n<span class=\"kd\">class<\/span> <span class=\"nc\">DmmApiConfig<\/span><span class=\"p\">(<\/span>\r\n\t<span class=\"k\">private<\/span> <span class=\"kd\">val<\/span> <span class=\"py\">property<\/span><span class=\"p\">:<\/span> <span class=\"nc\">DmmApiConfigProperty<\/span><span class=\"p\">,<\/span>\r\n\t<span class=\"k\">private<\/span> <span class=\"kd\">val<\/span> <span class=\"py\">configUtil<\/span><span class=\"p\">:<\/span> <span class=\"nc\">ConfigUtil<\/span>\r\n<span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n\r\n\t<span class=\"k\">private<\/span> <span class=\"kd\">val<\/span> <span class=\"py\">log<\/span> <span class=\"p\">=<\/span> <span class=\"nc\">LoggerFactory<\/span><span class=\"p\">.<\/span><span class=\"nf\">getLogger<\/span><span class=\"p\">(<\/span><span class=\"k\">this<\/span><span class=\"o\">::<\/span><span class=\"k\">class<\/span><span class=\"p\">.<\/span><span class=\"n\">java<\/span><span class=\"p\">)<\/span>\r\n\r\n\t<span class=\"nd\">@Bean<\/span>\r\n\t<span class=\"k\">fun<\/span> <span class=\"nf\">requestInterceptor<\/span><span class=\"p\">():<\/span> <span class=\"nc\">RequestInterceptor<\/span> <span class=\"p\">{<\/span>\r\n\t\t<span class=\"k\">return<\/span> <span class=\"nc\">RequestInterceptor<\/span> <span class=\"p\">{<\/span> <span class=\"n\">requestTemplate<\/span> <span class=\"p\">-&gt;<\/span>\r\n\t\t\t<span class=\"n\">requestTemplate<\/span><span class=\"p\">.<\/span><span class=\"nf\">query<\/span><span class=\"p\">(<\/span><span class=\"nc\">DmmHeaders<\/span><span class=\"p\">.<\/span><span class=\"nc\">DMM_API_ID<\/span><span class=\"p\">,<\/span> <span class=\"n\">property<\/span><span class=\"p\">.<\/span><span class=\"n\">apiId<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"n\">requestTemplate<\/span><span class=\"p\">.<\/span><span class=\"nf\">query<\/span><span class=\"p\">(<\/span><span class=\"nc\">DmmHeaders<\/span><span class=\"p\">.<\/span><span class=\"nc\">AFFILIATE_ID<\/span><span class=\"p\">,<\/span> <span class=\"n\">property<\/span><span class=\"p\">.<\/span><span class=\"n\">affiliateId<\/span><span class=\"p\">)<\/span>\r\n\r\n\t\t\t<span class=\"n\">requestTemplate<\/span><span class=\"p\">.<\/span><span class=\"nf\">header<\/span><span class=\"p\">(<\/span><span class=\"nc\">HttpHeaders<\/span><span class=\"p\">.<\/span><span class=\"nc\">CONTENT_TYPE<\/span><span class=\"p\">,<\/span> <span class=\"nc\">MediaType<\/span><span class=\"p\">.<\/span><span class=\"nc\">APPLICATION_JSON_VALUE<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"n\">requestTemplate<\/span><span class=\"p\">.<\/span><span class=\"nf\">header<\/span><span class=\"p\">(<\/span><span class=\"nc\">HttpHeaders<\/span><span class=\"p\">.<\/span><span class=\"nc\">ACCEPT<\/span><span class=\"p\">,<\/span> <span class=\"nc\">MediaType<\/span><span class=\"p\">.<\/span><span class=\"nc\">APPLICATION_JSON_VALUE<\/span><span class=\"p\">)<\/span>\r\n\t\t<span class=\"p\">}<\/span>\r\n\t<span class=\"p\">}<\/span>\r\n\r\n\t<span class=\"nd\">@Bean<\/span>\r\n\t<span class=\"k\">fun<\/span> <span class=\"nf\">retry<\/span><span class=\"p\">():<\/span> <span class=\"nc\">Retryer<\/span> <span class=\"p\">{<\/span>\r\n\t\t<span class=\"k\">return<\/span> <span class=\"nc\">Retryer<\/span><span class=\"p\">.<\/span><span class=\"nc\">Default<\/span><span class=\"p\">(<\/span>\r\n\t\t\t<span class=\"n\">property<\/span><span class=\"p\">.<\/span><span class=\"n\">retryPeriod<\/span><span class=\"p\">,<\/span>\r\n\t\t\t<span class=\"n\">property<\/span><span class=\"p\">.<\/span><span class=\"n\">retryDuration<\/span><span class=\"p\">,<\/span>\r\n\t\t\t<span class=\"n\">property<\/span><span class=\"p\">.<\/span><span class=\"n\">retryMaxCount<\/span>\r\n\t\t<span class=\"p\">)<\/span>\r\n\t<span class=\"p\">}<\/span>\r\n\r\n\t<span class=\"nd\">@Bean<\/span>\r\n\t<span class=\"k\">fun<\/span> <span class=\"nf\">errorDecoder<\/span><span class=\"p\">():<\/span> <span class=\"nc\">ErrorDecoder<\/span> <span class=\"p\">{<\/span>\r\n\t\t<span class=\"k\">return<\/span> <span class=\"kd\">object<\/span> <span class=\"err\">: <\/span><span class=\"nc\">ErrorDecoder<\/span> <span class=\"p\">{<\/span>\r\n\r\n\t\t\t<span class=\"k\">override<\/span> <span class=\"k\">fun<\/span> <span class=\"nf\">decode<\/span><span class=\"p\">(<\/span><span class=\"n\">methodKey<\/span><span class=\"p\">:<\/span> <span class=\"nc\">String<\/span><span class=\"p\">?,<\/span> <span class=\"n\">response<\/span><span class=\"p\">:<\/span> <span class=\"nc\">Response<\/span><span class=\"p\">?):<\/span> <span class=\"nc\">Exception<\/span> <span class=\"p\">{<\/span>\r\n\t\t\t\t<span class=\"kd\">val<\/span> <span class=\"py\">status<\/span> <span class=\"p\">=<\/span> <span class=\"n\">response<\/span><span class=\"o\">?.<\/span><span class=\"nf\">status<\/span><span class=\"p\">()<\/span>\r\n\t\t\t\t<span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">status<\/span> <span class=\"p\">==<\/span> <span class=\"nc\">HttpStatus<\/span><span class=\"p\">.<\/span><span class=\"nc\">GATEWAY_TIMEOUT<\/span><span class=\"p\">.<\/span><span class=\"nf\">value<\/span><span class=\"p\">())<\/span> <span class=\"p\">{<\/span>\r\n\t\t\t\t\t<span class=\"kd\">val<\/span> <span class=\"py\">request<\/span> <span class=\"p\">=<\/span> <span class=\"n\">response<\/span><span class=\"p\">.<\/span><span class=\"nf\">request<\/span><span class=\"p\">()<\/span>\r\n\t\t\t\t\t<span class=\"kd\">val<\/span> <span class=\"py\">method<\/span> <span class=\"p\">=<\/span> <span class=\"n\">request<\/span><span class=\"o\">?.<\/span><span class=\"nf\">httpMethod<\/span><span class=\"p\">()<\/span>\r\n\t\t\t\t\t<span class=\"k\">return<\/span> <span class=\"nc\">RetryableException<\/span><span class=\"p\">(<\/span><span class=\"n\">status<\/span><span class=\"p\">,<\/span> <span class=\"s\">\"504: Gateway Timeout.\"<\/span><span class=\"p\">,<\/span> <span class=\"n\">method<\/span><span class=\"p\">,<\/span> <span class=\"k\">null<\/span><span class=\"p\">,<\/span> <span class=\"n\">request<\/span><span class=\"p\">)<\/span>\r\n\t\t\t\t<span class=\"p\">}<\/span>\r\n\r\n\t\t\t\t<span class=\"k\">return<\/span> <span class=\"nc\">ErrorDecoder<\/span><span class=\"p\">.<\/span><span class=\"nc\">Default<\/span><span class=\"p\">().<\/span><span class=\"nf\">decode<\/span><span class=\"p\">(<\/span><span class=\"n\">methodKey<\/span><span class=\"p\">,<\/span> <span class=\"n\">response<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"p\">}<\/span>\r\n\t\t<span class=\"p\">}<\/span>\r\n\t<span class=\"p\">}<\/span>\r\n\r\n\t<span class=\"nd\">@Bean<\/span>\r\n\t<span class=\"k\">fun<\/span> <span class=\"nf\">logLevel<\/span><span class=\"p\">():<\/span> <span class=\"nc\">Logger<\/span><span class=\"p\">.<\/span><span class=\"nc\">Level<\/span> <span class=\"p\">{<\/span>\r\n\t\t<span class=\"k\">return<\/span> <span class=\"nc\">Logger<\/span><span class=\"p\">.<\/span><span class=\"nc\">Level<\/span><span class=\"p\">.<\/span><span class=\"nc\">FULL<\/span>\r\n\t<span class=\"p\">}<\/span>\r\n\r\n\t<span class=\"nd\">@Bean<\/span>\r\n\t<span class=\"k\">fun<\/span> <span class=\"nf\">logger<\/span><span class=\"p\">():<\/span> <span class=\"nc\">Logger<\/span> <span class=\"p\">{<\/span>\r\n\t\t<span class=\"k\">return<\/span> <span class=\"kd\">object<\/span> <span class=\"err\">: <\/span><span class=\"nc\">Logger<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n\r\n\t\t\t<span class=\"k\">override<\/span> <span class=\"k\">fun<\/span> <span class=\"nf\">log<\/span><span class=\"p\">(<\/span><span class=\"n\">configKey<\/span><span class=\"p\">:<\/span> <span class=\"nc\">String<\/span><span class=\"p\">?,<\/span> <span class=\"n\">format<\/span><span class=\"p\">:<\/span> <span class=\"nc\">String<\/span><span class=\"p\">?,<\/span> <span class=\"k\">vararg<\/span> <span class=\"n\">args<\/span><span class=\"p\">:<\/span> <span class=\"nc\">Any<\/span><span class=\"p\">?)<\/span> <span class=\"p\">{<\/span>\r\n\t\t\t\t<span class=\"c1\">\/\/ Not Used<\/span>\r\n\t\t\t<span class=\"p\">}<\/span>\r\n\r\n\t\t\t<span class=\"k\">override<\/span> <span class=\"k\">fun<\/span> <span class=\"nf\">logRetry<\/span><span class=\"p\">(<\/span><span class=\"n\">configKey<\/span><span class=\"p\">:<\/span> <span class=\"nc\">String<\/span><span class=\"p\">?,<\/span> <span class=\"n\">logLevel<\/span><span class=\"p\">:<\/span> <span class=\"nc\">Level<\/span><span class=\"p\">?)<\/span> <span class=\"p\">{<\/span>\r\n\t\t\t\t<span class=\"n\">log<\/span><span class=\"p\">.<\/span><span class=\"nf\">info<\/span><span class=\"p\">(<\/span><span class=\"n\">configKey<\/span><span class=\"p\">,<\/span> <span class=\"s\">\"RETRYING!!\"<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"p\">}<\/span>\r\n\r\n\t\t\t<span class=\"k\">override<\/span> <span class=\"k\">fun<\/span> <span class=\"nf\">logRequest<\/span><span class=\"p\">(<\/span><span class=\"n\">configKey<\/span><span class=\"p\">:<\/span> <span class=\"nc\">String<\/span><span class=\"p\">?,<\/span> <span class=\"n\">logLevel<\/span><span class=\"p\">:<\/span> <span class=\"nc\">Level<\/span><span class=\"p\">?,<\/span> <span class=\"n\">request<\/span><span class=\"p\">:<\/span> <span class=\"nc\">Request<\/span><span class=\"p\">?)<\/span> <span class=\"p\">{<\/span>\r\n\t\t\t\t<span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">logLevel<\/span> <span class=\"p\">!=<\/span> <span class=\"nc\">Level<\/span><span class=\"p\">.<\/span><span class=\"nc\">FULL<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n\t\t\t\t\t<span class=\"k\">return<\/span>\r\n\t\t\t\t<span class=\"p\">}<\/span>\r\n\r\n\t\t\t\t<span class=\"kd\">val<\/span> <span class=\"py\">url<\/span> <span class=\"p\">=<\/span> <span class=\"n\">request<\/span><span class=\"o\">?.<\/span><span class=\"nf\">requestTemplate<\/span><span class=\"p\">()<\/span><span class=\"o\">?.<\/span><span class=\"nf\">path<\/span><span class=\"p\">()<\/span>\r\n\t\t\t\t<span class=\"kd\">val<\/span> <span class=\"py\">method<\/span> <span class=\"p\">=<\/span> <span class=\"n\">request<\/span><span class=\"o\">?.<\/span><span class=\"nf\">httpMethod<\/span><span class=\"p\">()<\/span>\r\n\t\t\t\t<span class=\"kd\">val<\/span> <span class=\"py\">query<\/span> <span class=\"p\">=<\/span> <span class=\"nf\">buildQuery<\/span><span class=\"p\">(<\/span><span class=\"n\">request<\/span><span class=\"o\">?.<\/span><span class=\"nf\">requestTemplate<\/span><span class=\"p\">()<\/span><span class=\"o\">?.<\/span><span class=\"nf\">queries<\/span><span class=\"p\">()<\/span> <span class=\"o\">?:<\/span> <span class=\"nf\">emptyMap<\/span><span class=\"p\">())<\/span>\r\n\t\t\t\t<span class=\"kd\">val<\/span> <span class=\"py\">body<\/span> <span class=\"p\">=<\/span> <span class=\"nf\">buildBody<\/span><span class=\"p\">(<\/span><span class=\"n\">request<\/span><span class=\"o\">?.<\/span><span class=\"nf\">body<\/span><span class=\"p\">()<\/span><span class=\"o\">?.<\/span><span class=\"nf\">inputStream<\/span><span class=\"p\">())<\/span>\r\n\t\t\t\t<span class=\"n\">log<\/span><span class=\"p\">.<\/span><span class=\"nf\">info<\/span><span class=\"p\">(<\/span><span class=\"n\">configUtil<\/span><span class=\"p\">.<\/span><span class=\"nf\">getLogMessage<\/span><span class=\"p\">(<\/span><span class=\"s\">\"BE8001\"<\/span><span class=\"p\">),<\/span> <span class=\"n\">url<\/span><span class=\"p\">,<\/span> <span class=\"n\">method<\/span><span class=\"p\">,<\/span> <span class=\"n\">query<\/span><span class=\"p\">,<\/span> <span class=\"n\">body<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"p\">}<\/span>\r\n\r\n\t\t\t<span class=\"k\">override<\/span> <span class=\"k\">fun<\/span> <span class=\"nf\">logAndRebufferResponse<\/span><span class=\"p\">(<\/span><span class=\"n\">configKey<\/span><span class=\"p\">:<\/span> <span class=\"nc\">String<\/span><span class=\"p\">?,<\/span> <span class=\"n\">logLevel<\/span><span class=\"p\">:<\/span> <span class=\"nc\">Level<\/span><span class=\"p\">?,<\/span> <span class=\"n\">response<\/span><span class=\"p\">:<\/span> <span class=\"nc\">Response<\/span><span class=\"p\">?,<\/span> <span class=\"n\">elapsedTime<\/span><span class=\"p\">:<\/span> <span class=\"nc\">Long<\/span><span class=\"p\">):<\/span> <span class=\"nc\">Response<\/span> <span class=\"p\">{<\/span>\r\n\t\t\t\t<span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">logLevel<\/span> <span class=\"p\">!=<\/span> <span class=\"nc\">Level<\/span><span class=\"p\">.<\/span><span class=\"nc\">FULL<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n\t\t\t\t\t<span class=\"k\">return<\/span> <span class=\"n\">response<\/span><span class=\"o\">!!<\/span>\r\n\t\t\t\t<span class=\"p\">}<\/span>\r\n\r\n\t\t\t\t<span class=\"kd\">val<\/span> <span class=\"py\">request<\/span> <span class=\"p\">=<\/span> <span class=\"n\">response<\/span><span class=\"o\">?.<\/span><span class=\"nf\">request<\/span><span class=\"p\">()<\/span>\r\n\t\t\t\t<span class=\"kd\">val<\/span> <span class=\"py\">url<\/span> <span class=\"p\">=<\/span> <span class=\"n\">request<\/span><span class=\"o\">?.<\/span><span class=\"nf\">requestTemplate<\/span><span class=\"p\">()<\/span><span class=\"o\">?.<\/span><span class=\"nf\">path<\/span><span class=\"p\">()<\/span>\r\n\t\t\t\t<span class=\"kd\">val<\/span> <span class=\"py\">method<\/span> <span class=\"p\">=<\/span> <span class=\"n\">request<\/span><span class=\"o\">?.<\/span><span class=\"nf\">httpMethod<\/span><span class=\"p\">()<\/span>\r\n\t\t\t\t<span class=\"kd\">val<\/span> <span class=\"py\">query<\/span> <span class=\"p\">=<\/span> <span class=\"nf\">buildQuery<\/span><span class=\"p\">(<\/span><span class=\"n\">request<\/span><span class=\"o\">?.<\/span><span class=\"nf\">requestTemplate<\/span><span class=\"p\">()<\/span><span class=\"o\">?.<\/span><span class=\"nf\">queries<\/span><span class=\"p\">()<\/span> <span class=\"o\">?:<\/span> <span class=\"nf\">emptyMap<\/span><span class=\"p\">())<\/span>\r\n\t\t\t\t<span class=\"kd\">val<\/span> <span class=\"py\">body<\/span> <span class=\"p\">=<\/span> <span class=\"nf\">buildBody<\/span><span class=\"p\">(<\/span><span class=\"n\">request<\/span><span class=\"o\">?.<\/span><span class=\"nf\">body<\/span><span class=\"p\">()<\/span><span class=\"o\">?.<\/span><span class=\"nf\">inputStream<\/span><span class=\"p\">())<\/span>\r\n\t\t\t\t<span class=\"kd\">val<\/span> <span class=\"py\">status<\/span> <span class=\"p\">=<\/span> <span class=\"n\">response<\/span><span class=\"o\">?.<\/span><span class=\"nf\">status<\/span><span class=\"p\">()<\/span>\r\n\t\t\t\t<span class=\"n\">log<\/span><span class=\"p\">.<\/span><span class=\"nf\">info<\/span><span class=\"p\">(<\/span><span class=\"n\">configUtil<\/span><span class=\"p\">.<\/span><span class=\"nf\">getLogMessage<\/span><span class=\"p\">(<\/span><span class=\"s\">\"BE8002\"<\/span><span class=\"p\">),<\/span> <span class=\"n\">url<\/span><span class=\"p\">,<\/span> <span class=\"n\">method<\/span><span class=\"p\">,<\/span> <span class=\"n\">query<\/span><span class=\"p\">,<\/span> <span class=\"n\">body<\/span><span class=\"p\">,<\/span> <span class=\"n\">status<\/span><span class=\"p\">,<\/span> <span class=\"n\">elapsedTime<\/span><span class=\"p\">)<\/span>\r\n\t\t\t\t<span class=\"k\">return<\/span> <span class=\"n\">response<\/span><span class=\"o\">!!<\/span>\r\n\t\t\t<span class=\"p\">}<\/span>\r\n\r\n\t\t\t<span class=\"k\">private<\/span> <span class=\"k\">fun<\/span> <span class=\"nf\">buildQuery<\/span><span class=\"p\">(<\/span><span class=\"n\">queryMap<\/span><span class=\"p\">:<\/span> <span class=\"nc\">Map<\/span><span class=\"p\">&lt;<\/span><span class=\"nc\">String<\/span><span class=\"p\">,<\/span> <span class=\"nc\">Collection<\/span><span class=\"p\">&lt;<\/span><span class=\"nc\">String<\/span><span class=\"p\">&gt;&gt;):<\/span> <span class=\"nc\">Map<\/span><span class=\"p\">&lt;<\/span><span class=\"nc\">String<\/span><span class=\"p\">,<\/span> <span class=\"nc\">Collection<\/span><span class=\"p\">&lt;<\/span><span class=\"nc\">String<\/span><span class=\"p\">&gt;&gt;<\/span> <span class=\"p\">{<\/span>\r\n\t\t\t\t<span class=\"k\">return<\/span> <span class=\"n\">queryMap<\/span><span class=\"p\">.<\/span><span class=\"nf\">filterNot<\/span> <span class=\"p\">{<\/span>\r\n\t\t\t\t\t<span class=\"n\">it<\/span><span class=\"p\">.<\/span><span class=\"n\">key<\/span> <span class=\"p\">==<\/span> <span class=\"nc\">DmmHeaders<\/span><span class=\"p\">.<\/span><span class=\"nc\">DMM_API_ID<\/span> <span class=\"p\">||<\/span>\r\n\t\t\t\t\t\t<span class=\"n\">it<\/span><span class=\"p\">.<\/span><span class=\"n\">key<\/span> <span class=\"p\">==<\/span> <span class=\"nc\">DmmHeaders<\/span><span class=\"p\">.<\/span><span class=\"nc\">AFFILIATE_ID<\/span>\r\n\t\t\t\t<span class=\"p\">}.<\/span><span class=\"nf\">mapValues<\/span> <span class=\"p\">{<\/span>\r\n\t\t\t\t\t<span class=\"n\">it<\/span><span class=\"p\">.<\/span><span class=\"n\">value<\/span><span class=\"p\">.<\/span><span class=\"nf\">map<\/span> <span class=\"p\">{<\/span> <span class=\"n\">value<\/span> <span class=\"p\">-&gt;<\/span>\r\n\t\t\t\t\t\t<span class=\"nc\">URLDecoder<\/span><span class=\"p\">.<\/span><span class=\"nf\">decode<\/span><span class=\"p\">(<\/span><span class=\"n\">value<\/span><span class=\"p\">,<\/span> <span class=\"nc\">Charsets<\/span><span class=\"p\">.<\/span><span class=\"nc\">UTF_8<\/span><span class=\"p\">)<\/span>\r\n\t\t\t\t\t<span class=\"p\">}<\/span>\r\n\t\t\t\t<span class=\"p\">}<\/span>\r\n\t\t\t<span class=\"p\">}<\/span>\r\n\r\n\t\t\t<span class=\"k\">private<\/span> <span class=\"k\">fun<\/span> <span class=\"nf\">buildBody<\/span><span class=\"p\">(<\/span><span class=\"n\">body<\/span><span class=\"p\">:<\/span> <span class=\"nc\">InputStream<\/span><span class=\"p\">?):<\/span> <span class=\"nc\">String<\/span> <span class=\"p\">{<\/span>\r\n\t\t\t\t<span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">body<\/span> <span class=\"p\">==<\/span> <span class=\"k\">null<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n\t\t\t\t\t<span class=\"k\">return<\/span> <span class=\"s\">\"{}\"<\/span>\r\n\t\t\t\t<span class=\"p\">}<\/span>\r\n\r\n\t\t\t\t<span class=\"k\">return<\/span> <span class=\"nc\">IOUtils<\/span><span class=\"p\">.<\/span><span class=\"nf\">toString<\/span><span class=\"p\">(<\/span><span class=\"n\">body<\/span><span class=\"p\">,<\/span> <span class=\"nc\">Charsets<\/span><span class=\"p\">.<\/span><span class=\"nc\">UTF_8<\/span><span class=\"p\">)<\/span>\r\n\t\t\t<span class=\"p\">}<\/span>\r\n\t\t<span class=\"p\">}<\/span>\r\n\t<span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>\u8fde\u63a5\u4fe1\u606f\u548cAPI\u5bc6\u94a5\u662f\u901a\u8fc7\u73af\u5883\u53d8\u91cf\u8fdb\u884c\u7ba1\u7406\u7684\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"na\">spring<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">application<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">OpenFeign-Example<\/span>\r\n  <span class=\"na\">main<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">banner-mode<\/span><span class=\"pi\">:<\/span> <span class=\"s\">off<\/span>\r\n    <span class=\"na\">log-startup-info<\/span><span class=\"pi\">:<\/span> <span class=\"kc\">false<\/span>\r\n  <span class=\"na\">messages<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">basename<\/span><span class=\"pi\">:<\/span> <span class=\"s\">messages<\/span>\r\n    <span class=\"na\">encoding<\/span><span class=\"pi\">:<\/span> <span class=\"s\">UTF-8<\/span>\r\n    <span class=\"na\">fallback-to-system-locale<\/span><span class=\"pi\">:<\/span> <span class=\"kc\">false<\/span>\r\n\r\n<span class=\"na\">server<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">tomcat<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">max-threads<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${TOMCAT_MAX_THREADS:200}<\/span>\r\n    <span class=\"na\">min-spare-threads<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${TOMCAT_MIN_THREADS:20}<\/span>\r\n  <span class=\"na\">shutdown<\/span><span class=\"pi\">:<\/span> <span class=\"s\">graceful<\/span>\r\n  <span class=\"na\">port<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${PORT:5000}<\/span>\r\n\r\n<span class=\"na\">dmm-api<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">url<\/span><span class=\"pi\">:<\/span> <span class=\"s\">https:\/\/api.dmm.com\/affiliate\/v3<\/span>\r\n  <span class=\"na\">api-id<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${DMM_API_ID}<\/span>\r\n  <span class=\"na\">affiliate-id<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${DMM_API_AFFILIATE_ID}<\/span>\r\n  <span class=\"na\">retry-max-count<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${DMM_API_RETRY_MAX_COUNT:5}<\/span>\r\n  <span class=\"na\">retry-period<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${DMM_API_RETRY_PERIOD:100}<\/span>\r\n  <span class=\"na\">retry-duration<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${DMM_API_RETRY_DURATION:1000}<\/span>\r\n\r\n<span class=\"na\">logging<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">level<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">root<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${LOG_LEVEL:INFO}<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"k\">package<\/span> <span class=\"nn\">com.example.openfeignexample.constant<\/span>\r\n\r\n<span class=\"k\">import<\/span> <span class=\"nn\">org.springframework.beans.factory.annotation.Value<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nn\">org.springframework.context.annotation.Configuration<\/span>\r\n\r\n<span class=\"nd\">@Configuration<\/span>\r\n<span class=\"kd\">class<\/span> <span class=\"nc\">DmmApiConfigProperty<\/span> <span class=\"p\">{<\/span>\r\n\r\n\t<span class=\"nd\">@Value<\/span><span class=\"p\">(<\/span><span class=\"s\">\"\\${dmm-api.url}\"<\/span><span class=\"p\">)<\/span>\r\n\t<span class=\"kd\">val<\/span> <span class=\"py\">url<\/span><span class=\"p\">:<\/span> <span class=\"nc\">String<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"\"<\/span>\r\n\r\n\t<span class=\"nd\">@Value<\/span><span class=\"p\">(<\/span><span class=\"s\">\"\\${dmm-api.api-id}\"<\/span><span class=\"p\">)<\/span>\r\n\t<span class=\"kd\">val<\/span> <span class=\"py\">apiId<\/span><span class=\"p\">:<\/span> <span class=\"nc\">String<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"\"<\/span>\r\n\r\n\t<span class=\"nd\">@Value<\/span><span class=\"p\">(<\/span><span class=\"s\">\"\\${dmm-api.affiliate-id}\"<\/span><span class=\"p\">)<\/span>\r\n\t<span class=\"kd\">val<\/span> <span class=\"py\">affiliateId<\/span><span class=\"p\">:<\/span> <span class=\"nc\">String<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"\"<\/span>\r\n\r\n\t<span class=\"nd\">@Value<\/span><span class=\"p\">(<\/span><span class=\"s\">\"\\${dmm-api.retry-max-count}\"<\/span><span class=\"p\">)<\/span>\r\n\t<span class=\"kd\">val<\/span> <span class=\"py\">retryMaxCount<\/span><span class=\"p\">:<\/span> <span class=\"nc\">Int<\/span> <span class=\"p\">=<\/span> <span class=\"mi\">0<\/span>\r\n\r\n\t<span class=\"nd\">@Value<\/span><span class=\"p\">(<\/span><span class=\"s\">\"\\${dmm-api.retry-period}\"<\/span><span class=\"p\">)<\/span>\r\n\t<span class=\"kd\">val<\/span> <span class=\"py\">retryPeriod<\/span><span class=\"p\">:<\/span> <span class=\"nc\">Long<\/span> <span class=\"p\">=<\/span> <span class=\"mi\">0<\/span>\r\n\r\n\t<span class=\"nd\">@Value<\/span><span class=\"p\">(<\/span><span class=\"s\">\"\\${dmm-api.retry-duration}\"<\/span><span class=\"p\">)<\/span>\r\n\t<span class=\"kd\">val<\/span> <span class=\"py\">retryDuration<\/span><span class=\"p\">:<\/span> <span class=\"nc\">Long<\/span> <span class=\"p\">=<\/span> <span class=\"mi\">0<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>\u8bbe\u5b9a\u65e5\u5fd7\u6d88\u606f<\/p>\n<pre class=\"post-pre\"><code><span class=\"c\"># 8XXX: \u5916\u90e8\u901a\u4fe1\u95a2\u9023\r\n<\/span><span class=\"py\">BE8001<\/span><span class=\"p\">=<\/span><span class=\"s\">SEND: URL={}, Method={}, Query={}, Body={}<\/span>\r\n<span class=\"py\">BE8002<\/span><span class=\"p\">=<\/span><span class=\"s\">RECV: URL={}, Method={}, Query={}, Body={}, Status={}, Time={}ms<\/span>\r\n<\/code><\/pre>\n<h2>\u6267\u884c\u7ed3\u679c<\/h2>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d400d37434c4406c90af9\/26-2.png\" alt=\"image.png\" \/><\/div>\n<pre class=\"post-pre\"><code>\"C:\\Program Files\\Java\\jdk-17\\bin\\java.exe\" \"-javaagent:C:\\Users\\golde\\AppData\\Local\\Programs\\IntelliJ IDEA Community Edition\\lib\\idea_rt.jar=61403:C:\\Users\\golde\\AppData\\Local\\Programs\\IntelliJ IDEA Community Edition\\bin\" -Dfile.encoding=UTF-8 -classpath C:\\Projects\\IdeaProjects\\openfeign-example\\build\\classes\\kotlin\\main;C:\\Projects\\IdeaProjects\\openfeign-example\\build\\resources\\main;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.jetbrains.kotlin\\kotlin-stdlib-jdk8\\1.8.22\\b25c86d47d6b962b9cf0f8c3f320c8a10eea3dd1\\kotlin-stdlib-jdk8-1.8.22.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.springframework.boot\\spring-boot-starter-web\\3.1.5\\3674e5603cc25bc4dccf73b97d50234332fc3d72\\spring-boot-starter-web-3.1.5.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\com.fasterxml.jackson.core\\jackson-databind\\2.11.0\\8f5aaf3878b0647ff3a16610af53b1a5c05d9f15\\jackson-databind-2.11.0.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\com.fasterxml.jackson.module\\jackson-module-kotlin\\2.15.3\\36ea7813ada694e67f562ff1dc6f3b47883e373\\jackson-module-kotlin-2.15.3.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.jetbrains.kotlin\\kotlin-reflect\\1.8.22\\b52be44bc57cb6fd2169a29aefa4507c4e49c858\\kotlin-reflect-1.8.22.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.springframework.cloud\\spring-cloud-starter-openfeign\\4.0.4\\51d8b8ea8698bce969dd3afad8420f04a7251dde\\spring-cloud-starter-openfeign-4.0.4.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.springframework.boot\\spring-boot-starter-aop\\3.1.5\\2ac1f8bf4c2bce13b46d04abafc69a4f1523a08\\spring-boot-starter-aop-3.1.5.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.springframework.boot\\spring-boot-starter-thymeleaf\\3.1.5\\3d5f1bff03e5e58b065ca230b7ee24b84bf7fe75\\spring-boot-starter-thymeleaf-3.1.5.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.springframework.boot\\spring-boot-starter-validation\\3.1.5\\f653e6661ec3da08003789f4a6583d1674e333b1\\spring-boot-starter-validation-3.1.5.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\nz.net.ultraq.thymeleaf\\thymeleaf-layout-dialect\\3.2.1\\526f2e950a4d67ea49198f9ea5b4ec303ed002c2\\thymeleaf-layout-dialect-3.2.1.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.jetbrains.kotlin\\kotlin-stdlib-jdk7\\1.8.22\\4dabb8248310d833bb6a8b516024a91fd3d275c\\kotlin-stdlib-jdk7-1.8.22.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.jetbrains.kotlin\\kotlin-stdlib\\1.8.22\\636bf8b320e7627482771bbac9ed7246773c02bd\\kotlin-stdlib-1.8.22.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.springframework.boot\\spring-boot-starter-json\\3.1.5\\36ce79c1a5c63ffd72b092eb312cb35ac6edb128\\spring-boot-starter-json-3.1.5.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.springframework.boot\\spring-boot-starter\\3.1.5\\a14cd17b86261933929566775d80c65b9f7440fc\\spring-boot-starter-3.1.5.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.springframework.boot\\spring-boot-starter-tomcat\\3.1.5\\4b362b923ec1ca080556c4e55fe4ae73cf5a84d7\\spring-boot-starter-tomcat-3.1.5.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.springframework\\spring-webmvc\\6.0.13\\df1230a7dde55b9ce9d72670b42d621dc2e481df\\spring-webmvc-6.0.13.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.springframework\\spring-web\\6.0.13\\c374fcaf34d82d735a1dcf2c496f064488aa2b20\\spring-web-6.0.13.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\com.fasterxml.jackson.core\\jackson-annotations\\2.15.3\\79baf4e605eb3bbb60b1c475d44a7aecceea1d60\\jackson-annotations-2.15.3.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\com.fasterxml.jackson.core\\jackson-core\\2.15.3\\60d600567c1862840397bf9ff5a92398edc5797b\\jackson-core-2.15.3.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.springframework.cloud\\spring-cloud-openfeign-core\\4.0.4\\30883d013fe1586e06e9f995020124ba6202a317\\spring-cloud-openfeign-core-4.0.4.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.springframework.cloud\\spring-cloud-starter\\4.0.4\\7a90112c371183668b51e657a1f9113ed38f126f\\spring-cloud-starter-4.0.4.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.springframework.cloud\\spring-cloud-commons\\4.0.4\\b8fd08d1066deb7dd7e924d913b21f8c2ff44e70\\spring-cloud-commons-4.0.4.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\io.github.openfeign\\feign-slf4j\\12.4\\25a7a8249a2b9cb9ae3ca4eeba9a57050551913b\\feign-slf4j-12.4.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\io.github.openfeign\\feign-core\\12.4\\7acf105cbe60a58af10fcaa610a41ceec9a4fa9d\\feign-core-12.4.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.springframework\\spring-aop\\6.0.13\\aae1a18033787c9d324322f4470b12264e773e83\\spring-aop-6.0.13.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.aspectj\\aspectjweaver\\1.9.20\\da562407e43f74c0f8f5f5df4065d85ec1736d01\\aspectjweaver-1.9.20.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.thymeleaf\\thymeleaf-spring6\\3.1.2.RELEASE\\6030c7b4e260c41336f378e53da6e8531263f24b\\thymeleaf-spring6-3.1.2.RELEASE.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.apache.tomcat.embed\\tomcat-embed-el\\10.1.15\\49e784ef48d5fc7bc48d7e2a7ceb57e88b4d58b7\\tomcat-embed-el-10.1.15.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.hibernate.validator\\hibernate-validator\\8.0.1.Final\\e49e116b3d3928060599b176b3538bb848718e95\\hibernate-validator-8.0.1.Final.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.apache.groovy\\groovy\\4.0.15\\1fa486007f31bd7f245ba4674fb8afb173bea745\\groovy-4.0.15.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.jetbrains.kotlin\\kotlin-stdlib-common\\1.8.22\\1a8e3601703ae14bb58757ea6b2d8e8e5935a586\\kotlin-stdlib-common-1.8.22.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.jetbrains\\annotations\\13.0\\919f0dfe192fb4e063e7dacadee7f8bb9a2672a9\\annotations-13.0.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\com.fasterxml.jackson.datatype\\jackson-datatype-jdk8\\2.15.3\\80158cb020c7bd4e4ba94d8d752a65729dc943b2\\jackson-datatype-jdk8-2.15.3.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\com.fasterxml.jackson.datatype\\jackson-datatype-jsr310\\2.15.3\\4a20a0e104931bfa72f24ef358c2eb63f1ef2aaf\\jackson-datatype-jsr310-2.15.3.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\com.fasterxml.jackson.module\\jackson-module-parameter-names\\2.15.3\\8d251b90c5358677e7d8161e0c2488e6f84f49da\\jackson-module-parameter-names-2.15.3.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.springframework.boot\\spring-boot-autoconfigure\\3.1.5\\42a5b2ee98f700fba8d8c88d4af7b23266f1de0f\\spring-boot-autoconfigure-3.1.5.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.springframework.boot\\spring-boot\\3.1.5\\c188015a5a79f5df65e876dcfdef16148c45fe2c\\spring-boot-3.1.5.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.springframework.boot\\spring-boot-starter-logging\\3.1.5\\8d8a91061baa4347d97a8fe15f3337d943badab\\spring-boot-starter-logging-3.1.5.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\jakarta.annotation\\jakarta.annotation-api\\2.1.1\\48b9bda22b091b1f48b13af03fe36db3be6e1ae3\\jakarta.annotation-api-2.1.1.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.springframework\\spring-core\\6.0.13\\cd565c2408e37d2026822b871cd43e69da8ec40e\\spring-core-6.0.13.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.yaml\\snakeyaml\\1.33\\2cd0a87ff7df953f810c344bdf2fe3340b954c69\\snakeyaml-1.33.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.apache.tomcat.embed\\tomcat-embed-websocket\\10.1.15\\14cc0999d4a5128dc9bb8862487aa8ed4cd7fcd8\\tomcat-embed-websocket-10.1.15.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.apache.tomcat.embed\\tomcat-embed-core\\10.1.15\\e3a725405f494abc0fd4f30263c2e6ad87052de1\\tomcat-embed-core-10.1.15.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.springframework\\spring-context\\6.0.13\\4c49af6dde7fce9602049f952b45ca29f30e2a37\\spring-context-6.0.13.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.springframework\\spring-beans\\6.0.13\\5b205c9f2fb07c1367db144ce7ab305f94300604\\spring-beans-6.0.13.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.springframework\\spring-expression\\6.0.13\\2bedffa4a3850bbbb652a31c47671824b17fbe01\\spring-expression-6.0.13.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\io.micrometer\\micrometer-observation\\1.11.5\\803f341121416365d1c438fe2a7290b146fadc92\\micrometer-observation-1.11.5.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\io.github.openfeign.form\\feign-form-spring\\3.8.0\\71059f6e16ddbaf0e42f1b1aa0bb60cc2f823e4d\\feign-form-spring-3.8.0.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\commons-fileupload\\commons-fileupload\\1.5\\ad4ad2ab2961b4e1891472bd1a33fabefb0385f3\\commons-fileupload-1.5.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.springframework.cloud\\spring-cloud-context\\4.0.4\\6962fd8ddc995cea96b2499cfbc44df181c41b47\\spring-cloud-context-4.0.4.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.springframework.security\\spring-security-rsa\\1.0.12.RELEASE\\2c6aca9e7eee11aee196a29eeea35d7aa8692398\\spring-security-rsa-1.0.12.RELEASE.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.springframework.security\\spring-security-crypto\\6.1.5\\971a767ef1ef6bea94486ac944f0e17b143dc680\\spring-security-crypto-6.1.5.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.slf4j\\slf4j-api\\2.0.9\\7cf2726fdcfbc8610f9a71fb3ed639871f315340\\slf4j-api-2.0.9.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.thymeleaf\\thymeleaf\\3.1.2.RELEASE\\273997509a4c7aef86cee0521750140c587d9be2\\thymeleaf-3.1.2.RELEASE.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\jakarta.validation\\jakarta.validation-api\\3.0.2\\92b6631659ba35ca09e44874d3eb936edfeee532\\jakarta.validation-api-3.0.2.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.jboss.logging\\jboss-logging\\3.5.3.Final\\c88fc1d8a96d4c3491f55d4317458ccad53ca663\\jboss-logging-3.5.3.Final.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\com.fasterxml\\classmate\\1.5.1\\3fe0bed568c62df5e89f4f174c101eab25345b6c\\classmate-1.5.1.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\ch.qos.logback\\logback-classic\\1.4.11\\54450c0c783e896a1a6d88c043bd2f1daba1c382\\logback-classic-1.4.11.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.apache.logging.log4j\\log4j-to-slf4j\\2.20.0\\d37f81f8978e2672bc32c82712ab4b3f66624adc\\log4j-to-slf4j-2.20.0.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.slf4j\\jul-to-slf4j\\2.0.9\\9ef7c70b248185845f013f49a33ff9ca65b7975\\jul-to-slf4j-2.0.9.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.springframework\\spring-jcl\\6.0.13\\91ea90f2de4c71dac3cff04882156b00cdca3e0d\\spring-jcl-6.0.13.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\io.micrometer\\micrometer-commons\\1.11.5\\3e708f737ba2674823201a836b5858482b183902\\micrometer-commons-1.11.5.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\io.github.openfeign.form\\feign-form\\3.8.0\\3083889996b18443c275a352d3ab4bc6c8321598\\feign-form-3.8.0.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\commons-io\\commons-io\\2.11.0\\a2503f302b11ebde7ebc3df41daebe0e4eea3689\\commons-io-2.11.0.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.bouncycastle\\bcpkix-jdk18on\\1.73\\fd41dae0f564a93888ed5ade426281de94824717\\bcpkix-jdk18on-1.73.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.attoparser\\attoparser\\2.0.7.RELEASE\\e5d0e988d9124139d645bb5872b24dfa23e283cc\\attoparser-2.0.7.RELEASE.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.unbescape\\unbescape\\1.1.6.RELEASE\\7b90360afb2b860e09e8347112800d12c12b2a13\\unbescape-1.1.6.RELEASE.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\ch.qos.logback\\logback-core\\1.4.11\\2f9f280219a9922a74200eaf7138c4c17fb87c0f\\logback-core-1.4.11.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.apache.logging.log4j\\log4j-api\\2.20.0\\1fe6082e660daf07c689a89c94dc0f49c26b44bb\\log4j-api-2.20.0.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.bouncycastle\\bcutil-jdk18on\\1.73\\73a680acd04b249a6773f49200092cadb670bf0\\bcutil-jdk18on-1.73.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.bouncycastle\\bcprov-jdk18on\\1.73\\4bd3de48e5153059fe3f80cbcf86ea221795ee55\\bcprov-jdk18on-1.73.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.springframework.boot\\spring-boot-devtools\\3.1.5\\e7725476fbcd154d7ee5d85446cac2e16db1d818\\spring-boot-devtools-3.1.5.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\nz.net.ultraq.groovy\\groovy-extensions\\2.1.0\\c869dc033867e8861957ff3ff4e1ce0a00260e3a\\groovy-extensions-2.1.0.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\nz.net.ultraq.thymeleaf\\thymeleaf-expression-processor\\3.1.1\\81360e5289e8b4551733708c0ef11799d2716e54\\thymeleaf-expression-processor-3.1.1.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\ognl\\ognl\\3.3.4\\1904789bdd96f226ad252a02f230be1015f4462b\\ognl-3.3.4.jar;C:\\Users\\golde\\.gradle\\caches\\modules-2\\files-2.1\\org.javassist\\javassist\\3.29.0-GA\\d3959fa7e00bf04dbe519228a23213d2afb625d8\\javassist-3.29.0-GA.jar com.example.openfeignexample.OpenfeignExampleApplicationKt\r\n2023-11-03T23:57:03.569+09:00  INFO 10908 --- [  restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable\r\n2023-11-03T23:57:03.573+09:00  INFO 10908 --- [  restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG'\r\n2023-11-03T23:57:04.978+09:00  INFO 10908 --- [  restartedMain] o.s.cloud.context.scope.GenericScope     : BeanFactory id=750cf38b-3d33-3f45-a8b2-68bc6615318c\r\n2023-11-03T23:57:05.017+09:00  INFO 10908 --- [  restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'com.example.openfeignexample.client.DmmClient' of type [org.springframework.cloud.openfeign.FeignClientFactoryBean] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)\r\n2023-11-03T23:57:05.900+09:00  INFO 10908 --- [  restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 5000 (http)\r\n2023-11-03T23:57:05.919+09:00  INFO 10908 --- [  restartedMain] o.apache.catalina.core.StandardService   : Starting service [Tomcat]\r\n2023-11-03T23:57:05.919+09:00  INFO 10908 --- [  restartedMain] o.apache.catalina.core.StandardEngine    : Starting Servlet engine: [Apache Tomcat\/10.1.15]\r\n2023-11-03T23:57:06.025+09:00  INFO 10908 --- [  restartedMain] o.a.c.c.C.[Tomcat].[localhost].[\/]       : Initializing Spring embedded WebApplicationContext\r\n2023-11-03T23:57:06.027+09:00  INFO 10908 --- [  restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2451 ms\r\n2023-11-03T23:57:06.509+09:00  INFO 10908 --- [  restartedMain] o.s.b.d.a.OptionalLiveReloadServer       : LiveReload server is running on port 35729\r\n2023-11-03T23:57:07.581+09:00  INFO 10908 --- [  restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 5000 (http) with context path ''\r\n2023-11-03T23:57:10.266+09:00  INFO 10908 --- [nio-5000-exec-1] o.a.c.c.C.[Tomcat].[localhost].[\/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'\r\n2023-11-03T23:57:10.267+09:00  INFO 10908 --- [nio-5000-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'\r\n2023-11-03T23:57:10.268+09:00  INFO 10908 --- [nio-5000-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 1 ms\r\n2023-11-03T23:57:23.035+09:00  INFO 10908 --- [nio-5000-exec-4] c.e.o.config.interceptor.DmmApiConfig    : SEND: URL=https:\/\/api.dmm.com\/affiliate\/v3\/ItemList, Method=GET, Query={hits=[100], site=[DMM.com], sort=[date], keyword=[\u30d0\u30d3\u30eb\u4e8c\u4e16]}, Body={}\r\n2023-11-03T23:57:23.609+09:00  INFO 10908 --- [nio-5000-exec-4] c.e.o.config.interceptor.DmmApiConfig    : RECV: URL=https:\/\/api.dmm.com\/affiliate\/v3\/ItemList, Method=GET, Query={hits=[100], site=[DMM.com], sort=[date], keyword=[\u30d0\u30d3\u30eb\u4e8c\u4e16]}, Body={}, Status=200, Time=568ms\r\n<\/code><\/pre>\n<h2>\u6211\u5bf9\u6b64\u6709\u6240\u611f\u89e6\u3002<\/h2>\n<p>\u4e0a\u4e00\u6b21\u6211\u4eec\u4f7f\u7528\u4e86 RestTemplate \u8fdb\u884c\u901a\u4fe1\uff0c\u4f46\u662f\u6211\u89c9\u5f97 OpenFeign \u66f4\u76f4\u89c2\u3002<br \/>\n\u5728\u5de5\u4f5c\u4e2d\uff0c\u7edd\u5927\u591a\u6570\u4eba\u90fd\u4f7f\u7528 RestTemplate\uff0c\u4f46\u5982\u679c\u6709\u673a\u4f1a\u8fdb\u884c\u6280\u672f\u9009\u62e9\uff0c\u6211\u60f3\u8bd5\u8bd5\u63a8\u8350 OpenFeign\u3002<\/p>\n<h2>\u8bf7\u770b\u76f8\u5173\u8d44\u6599<\/h2>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u76ee\u5f55 \u6982\u8981 &nbsp; \u74b0\u5883 &nbsp; \u69cb\u6210 &nbsp; \u5404\u7a2e\u30b5\u30fc\u30d3\u30b9\u306e\u7528\u610f &nbsp; \u5b9f\u88c5\u5185\u5bb9  [&hellip;]<\/p>\n","protected":false},"author":10,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-40352","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u4f7f\u7528OpenFeign\u4e0eDMM.com\u8fdb\u884c\u901a\u4fe1. - Blog - Silicon Cloud<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528openfeign\u4e0edmm-com\u8fdb\u884c\u901a\u4fe1\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u4f7f\u7528OpenFeign\u4e0eDMM.com\u8fdb\u884c\u901a\u4fe1.\" \/>\n<meta property=\"og:description\" content=\"\u76ee\u5f55 \u6982\u8981 &nbsp; \u74b0\u5883 &nbsp; \u69cb\u6210 &nbsp; \u5404\u7a2e\u30b5\u30fc\u30d3\u30b9\u306e\u7528\u610f &nbsp; \u5b9f\u88c5\u5185\u5bb9 [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528openfeign\u4e0edmm-com\u8fdb\u884c\u901a\u4fe1\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-08-18T16:00:20+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-29T21:01:30+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d400d37434c4406c90af9\/4-0.png\" \/>\n<meta name=\"author\" content=\"\u5b87, \u534e\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u5b87, \u534e\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"14 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8openfeign%e4%b8%8edmm-com%e8%bf%9b%e8%a1%8c%e9%80%9a%e4%bf%a1\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8openfeign%e4%b8%8edmm-com%e8%bf%9b%e8%a1%8c%e9%80%9a%e4%bf%a1\/\",\"name\":\"\u4f7f\u7528OpenFeign\u4e0eDMM.com\u8fdb\u884c\u901a\u4fe1. - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-08-18T16:00:20+00:00\",\"dateModified\":\"2024-04-29T21:01:30+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/513018e4e121d3add1b7c5de8be21458\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8openfeign%e4%b8%8edmm-com%e8%bf%9b%e8%a1%8c%e9%80%9a%e4%bf%a1\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8openfeign%e4%b8%8edmm-com%e8%bf%9b%e8%a1%8c%e9%80%9a%e4%bf%a1\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8openfeign%e4%b8%8edmm-com%e8%bf%9b%e8%a1%8c%e9%80%9a%e4%bf%a1\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u4f7f\u7528OpenFeign\u4e0eDMM.com\u8fdb\u884c\u901a\u4fe1.\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/513018e4e121d3add1b7c5de8be21458\",\"name\":\"\u5b87, \u534e\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g\",\"caption\":\"\u5b87, \u534e\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/yuhua\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8openfeign%e4%b8%8edmm-com%e8%bf%9b%e8%a1%8c%e9%80%9a%e4%bf%a1\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u4f7f\u7528OpenFeign\u4e0eDMM.com\u8fdb\u884c\u901a\u4fe1. - Blog - Silicon Cloud","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528openfeign\u4e0edmm-com\u8fdb\u884c\u901a\u4fe1\/","og_locale":"zh_CN","og_type":"article","og_title":"\u4f7f\u7528OpenFeign\u4e0eDMM.com\u8fdb\u884c\u901a\u4fe1.","og_description":"\u76ee\u5f55 \u6982\u8981 &nbsp; \u74b0\u5883 &nbsp; \u69cb\u6210 &nbsp; \u5404\u7a2e\u30b5\u30fc\u30d3\u30b9\u306e\u7528\u610f &nbsp; \u5b9f\u88c5\u5185\u5bb9 [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528openfeign\u4e0edmm-com\u8fdb\u884c\u901a\u4fe1\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-08-18T16:00:20+00:00","article_modified_time":"2024-04-29T21:01:30+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d400d37434c4406c90af9\/4-0.png"}],"author":"\u5b87, \u534e","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u5b87, \u534e","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"14 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8openfeign%e4%b8%8edmm-com%e8%bf%9b%e8%a1%8c%e9%80%9a%e4%bf%a1\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8openfeign%e4%b8%8edmm-com%e8%bf%9b%e8%a1%8c%e9%80%9a%e4%bf%a1\/","name":"\u4f7f\u7528OpenFeign\u4e0eDMM.com\u8fdb\u884c\u901a\u4fe1. - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-08-18T16:00:20+00:00","dateModified":"2024-04-29T21:01:30+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/513018e4e121d3add1b7c5de8be21458"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8openfeign%e4%b8%8edmm-com%e8%bf%9b%e8%a1%8c%e9%80%9a%e4%bf%a1\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8openfeign%e4%b8%8edmm-com%e8%bf%9b%e8%a1%8c%e9%80%9a%e4%bf%a1\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8openfeign%e4%b8%8edmm-com%e8%bf%9b%e8%a1%8c%e9%80%9a%e4%bf%a1\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u4f7f\u7528OpenFeign\u4e0eDMM.com\u8fdb\u884c\u901a\u4fe1."}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/513018e4e121d3add1b7c5de8be21458","name":"\u5b87, \u534e","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g","caption":"\u5b87, \u534e"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/yuhua\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8openfeign%e4%b8%8edmm-com%e8%bf%9b%e8%a1%8c%e9%80%9a%e4%bf%a1\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/40352","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/10"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=40352"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/40352\/revisions"}],"predecessor-version":[{"id":89844,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/40352\/revisions\/89844"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=40352"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=40352"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=40352"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}