如何使用 RestTemplate 将 POST 请求发送到相对 URL?
Posted
技术标签:
【中文标题】如何使用 RestTemplate 将 POST 请求发送到相对 URL?【英文标题】:How to send POST request to relative URL with RestTemplate? 【发布时间】:2017-04-16 03:20:28 【问题描述】:如何向应用程序本身发送POST
请求?
如果我只是发送一个相对的帖子请求:java.lang.IllegalArgumentException: URI is not absolute
。
@RestController
public class TestServlet
@RequestMapping("value = "/test", method = RequestMethod.GET)
public void test()
String relativeUrl = "/posting"; //TODO how to generate like "localhost:8080/app/posting"?
new RestTemplate().postForLocation(relativeUrl, null);
那么使用上面的示例,如何在 url 前面加上绝对服务器 url 路径 localhost:8080/app
?我必须动态找到路径。
【问题讨论】:
【参考方案1】:你可以像下面这样重写你的方法。
@RequestMapping("value = "/test", method = RequestMethod.GET)
public void test(HttpServletRequest request)
String url = request.getRequestURL().toString();
String relativeUrl = url+"/posting";
new RestTemplate().postForLocation(relativeUrl, null);
【讨论】:
【参考方案2】:找到了一种使用ServletUriComponentsBuilder
基本上自动执行任务的简洁方法:
@RequestMapping("value = "/test", method = RequestMethod.GET)
public void test(HttpServletRequest req)
UriComponents url = ServletUriComponentsBuilder.fromServletMapping(req).path("/posting").build();
new RestTemplate().postForLocation(url.toString(), null);
【讨论】:
我很好奇,你为什么要从服务器内部向服务器发出请求?通常,控制器将由服务支持,那么为什么不直接调用此服务呢? spring 具有热重载application.properties
值的功能。这可以通过在包含@Value
属性的类上使用@RefreshScope
来实现。不幸的是,spring需要POST
请求<app-path>/refresh
。 Und 不支持对该 url 的简单 GET
浏览器请求。所以我提供了一个简单的 GET 并在内部发送 POST。
啊,那么我会将您的解决方案限定为黑客;)请参阅下面的答案
我接受我的回答,因为最初的问题是关于如何发送相关的 POST 请求。无论如何,对于我的根本问题,正确的解决方案是使用RefreshEndpoint.refresh()
。【参考方案3】:
如果你想刷新 application.properties,你应该将 RefreshScope 自动连接到你的控制器中,并显式调用它,这样可以更容易地看到它发生了什么。 Here is an example
@Autowired
public RefreshScope refreshScope;
refreshScope.refreshAll();
【讨论】:
注入RefreshEndpoint
并调用.refresh()
可能会更好,因为这正是POST 请求所做的。以上是关于如何使用 RestTemplate 将 POST 请求发送到相对 URL?的主要内容,如果未能解决你的问题,请参考以下文章
通过 JSON 中的 RestTemplate POST 请求
使用RestTemplate在代码内调用POST请求的参数乱码问题