如何使用java发送post请求
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用java发送post请求相关的知识,希望对你有一定的参考价值。
/*** 向指定 URL 发送POST方法的请求
*
* @param url
* 发送请求的 URL
* @param param
* 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
* @return 所代表远程资源的响应结果
*/
public static String sendPost(String url, String param)
PrintWriter out = null;
BufferedReader in = null;
String result = "";
try
URL realUrl = new URL(url);
// 打开和URL之间的连接
URLConnection conn = realUrl.openConnection();
// 设置通用的请求属性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
// 发送POST请求必须设置如下两行
conn.setDoOutput(true);
conn.setDoInput(true);
// 获取URLConnection对象对应的输出流
out = new PrintWriter(conn.getOutputStream());
// 发送请求参数
out.print(param);
// flush输出流的缓冲
out.flush();
// 定义BufferedReader输入流来读取URL的响应
in = new BufferedReader(
new InputStreamReader(conn.getInputStream()));
String line;
while ((line = in.readLine()) != null)
result += line;
catch (Exception e)
System.out.println("发送 POST 请求出现异常!"+e);
e.printStackTrace();
//使用finally块来关闭输出流、输入流
finally
try
if(out!=null)
out.close();
if(in!=null)
in.close();
catch(IOException ex)
ex.printStackTrace();
return result;
参考技术A 请参考这份代码:“http://witcheryne.iteye.com/blog/1135817”,如果满意请采纳 参考技术B 页面发送还是後台? 参考技术C doPost方法
如何使用 RestTemplate 将 POST 请求发送到相对 URL?
【中文标题】如何使用 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 请求所做的。以上是关于如何使用java发送post请求的主要内容,如果未能解决你的问题,请参考以下文章
如何通过远程方法发送 json-rpc http post 请求并在 java 中传递加密参数