如何使用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请求的主要内容,如果未能解决你的问题,请参考以下文章

如何使用restclient来发送post请求参数

如何使用java模拟post请求

如何通过远程方法发送 json-rpc http post 请求并在 java 中传递加密参数

如何使用 _csrf 在 angularjs 中发送 POST 请求?

java 怎样发送 POST

如何在 Java 中发送带有 XML 数据的 HTTPS POST 请求