Java 使用GET和POST方式提交HttpURLConnection请求
Java调用接口进行获取对方服务器的数据在开发中特别常见,在实际开发过程中,很多项目都会封装规定好本身项目的接口规范,所以大多数需要去调用对方提供的接口或第三方接口(短信、天气等)或者测试自己写的接口。
那么Java如何调用接口?==》通过 HttpURLConnection建立实际的连接,交换数据。
URLEncoder 和 URLDecoder用于完成普通字符串和 application/x-www-form-urlencoded MIME字符串之间的相互转换.
在接收端,这样设置参数:编码:"UTF-8"
String content = "字段名1=" + URLEncoder.encode("字符串值1", "编码")+"&字段名2=" + URLEncoder.encode("字符串值2", "编码");
在接收端,这样获取参数:
String name = request.getParameter("account");
String pswd = request.getParameter("pswd");
System.out.println(new String(name.getBytes("iso-8859-1"),"UTF-8"));
System.out.println(new String(pswd.getBytes("iso-8859-1"),"UTF-8"));
一、 使用GET方式和POST提交HttpURLConnection请求
这里简单创建两个springboot的项目 ,编码使用UTF-8,做测试
1、HttpURLUtil的模板工具类
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import java.util.Map;
public class HttpURLUtil {
/**
* 向指定URL发送GET方法的请求
*
* @param url 发送请求的URL
* @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
* @return URL 所代表远程资源的响应结果
*/
public static String sendGet(String url, String param) {
String result = "";
BufferedReader in = null;
HttpURLConnection connection = null;
try {
URL getUrl = new URL(url + "?" + param);
// 打开和URL之间的连接
connection = (HttpURLConnection) getUrl.openConnection();
// 在connect之前,设置通用的请求属性
connection.setRequestProperty("accept", "*/*");
connection.setRequestProperty("connection", "Keep-Alive");
connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
connection.setRequestProperty("Charsert", "UTF-8");
// 配置本次连接的Content-type,form表单是"application/x-www-form-urlencoded",json是"application/json"等
// 根据需求自己调整Content-type
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
// 设置连接主机服务器的超时时间:15000毫秒
connection.setConnectTimeout(15000);
// 设置读取远程返回的数据时间:60000毫秒
connection.setReadTimeout(60000);
// 设置连接方式:get
connection.setRequestMethod("GET");
// 建立实际的连接,注意connection.getOutputStream会隐含的进行connect。
connection.connect();
// 获取所有响应头字段
Map<String, List<String>> map = connection.getHeaderFields();
// 遍历所有的响应头字段
for (String key : map.keySet()) {
System.out.println(key + "--->" + map.get(key));
}
// 定义BufferedReader输入流来读取URL的响应
if (connection.getResponseCode() == 200) {
in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
}
} catch (Exception e) {
System.out.println("发送GET请求出现异常!" + e);
e.printStackTrace();
}
// 使用finally块来关闭输入流
finally {
try {
if (in != null) {
in.close();
}
if (connection != null) {
//关闭连接
connection.disconnect();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
return result;
}
/**
* 向指定 URL 发送POST方法的请求
*
* @param url 发送请求的 URL
* @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
* @return 所代表远程资源的响应结果
*/
public static String sendPost(String url, String param) {
String result = "";
PrintWriter out = null;
BufferedReader in = null;
HttpURLConnection connection = null;
try {
URL postUrl = new URL(url);
// 打开和URL之间的连接
connection = (HttpURLConnection) postUrl.openConnection();
// 在connect之前,设置通用的请求属性
connection.setRequestProperty("accept", "*/*");
connection.setRequestProperty("connection", "Keep-Alive");
connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
connection.setRequestProperty("Charsert", "UTF-8");
connection.setConnectTimeout(15000);
connection.setReadTimeout(60000);
// 发送POST请求必须设置如下两行,参数要放在http正文内
connection.setDoOutput(true);
connection.setDoInput(true);
// 默认是 GET方式
connection.setRequestMethod("POST");
// Post 请求不使用缓存
connection.setUseCaches(false);
// 配置本次连接的Content-type,form表单是"application/x-www-form-urlencoded",json是"application/json"等
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.connect();
//1.获取URLConnection对象对应的输出流
out = new PrintWriter(connection.getOutputStream());
//2.中文有乱码的需要将PrintWriter改为如下
//out=new OutputStreamWriter(conn.getOutputStream(),"UTF-8")
// 发送请求参数
out.print(param);
// flush输出流的缓冲
out.flush();
// 定义BufferedReader输入流来读取URL的响应
if (connection.getResponseCode() == 200) {
in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
}
} catch (Exception e) {
System.out.println("发送 POST 请求出现异常!" + e);
e.printStackTrace();
} finally {
try {
if (out != null) {
out.close();
}
if (in != null) {
in.close();
}
if (connection != null) {
//关闭连接
connection.disconnect();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
return result;
}
}
2、两个项目中的controller测试:
中文乱码这里也做了数据
@GetMapping("/sendHttpURL")
@ResponseBody
public String sendHttpURL() throws UnsupportedEncodingException {
//发送 GET 请求
String paramGet = "v1=123456"+"&v2=" + URLEncoder.encode("发送 GET 请求", StandardCharsets.UTF_8.name());
String s = HttpURLUtil.sendGet("http://127.0.0.1/sbt_javademo/receiveURLGet", paramGet);
System.out.println(s);
//发送 POST 请求
// String paramPost = "v3=45678"+"&v4=" + URLEncoder.encode("发送 POST 请求", StandardCharsets.UTF_8.name());
String paramPost = "v3=45678"+"&v4=发送 POST 请求";
String sr = HttpURLUtil.sendPost("http://127.0.0.1/sbt_javademo/receiveURLPost", paramPost);
System.out.println(sr);
return s + "\n" + sr;
}
@GetMapping("/receiveURLGet")
@ResponseBody
public ResponseEntity<Map<String,Object>> receiveURLGet(String v1, String v2) {
System.out.println("v1:" + v1 + " == v2:" + v2);
Map<String, Object> map = new HashMap<>();
map.put("code", 20000);
map.put("data", "接受 GET 请求");
return ResponseEntity.ok(map);
}
@PostMapping("/receiveURLPost")
@ResponseBody
public ResponseEntity<Map<String,Object>> receiveURLPost(HttpServletRequest request, String v3, String v4) {
System.out.println("v3:" + v3 + " == v4:" + v4);
Map<String, Object> map = new HashMap<>();
map.put("code", 20000);
map.put("data", "接受 POST 请求");
return ResponseEntity.ok(map);
}
3、结果内容:
这里 Content-Type的类型,都使用的是表单“application/x-www-form-urlencoded”,根据需求自己调整
对于一些知识点进行整理和归纳,这样容易对比加深记忆,总结:
1)URL url= new URL(url);
2)获取connection,并设置相应的请求属性
3)特别注意设置对应的GET/POST请求方式,Content-Type的数据类型,参数的形式
4)建立实际的连接,通过输入输出流的方式交换数据
5)最后,关闭流和关闭连接connection。
二、请求及属性的一些知识点
1、HttpServletRequset和HttpServletResponse的知识点:
Servlet的继承体系与HttpServletRequset和HttpServletResponse
2、Request的相关方法:
getContextPath():这个方法返回的是web应用映射的虚拟目录地址:如ServletDemo应用的虚拟目录是:/ServletDemo
getCookies():这个方法返回的是一个Cookies[],因为用户在请求的时候会携带很多的cookie,关于Cookie的相关知识
getHeader(String name)/getIntHeader(String name)/getDateHeader(String name):
这些方法是获取请求头信息的,只是针对不同的类型的,有字符串类型的,时间类型,数值类型的
getHeaderNames():这个方法是获取所有请求头的字段名称
getHeaders(String name):这个方法是获取一个请求头字段的所有值,因为有时候可能会有相同请求头字段信息,不会覆盖的
getMethod():这个方法是获取客户机的请求方法
getQueryString():这个方法是获取用户请求时的查询参数的,即url后面携带的参数
getRequestSessionId():这个方法是获取客户机在请求的时候携带的sessionid值,有关session的相关知识,后面会详解
getRequestURL():这个方法是获取客户机请求的url
getServletPath():这个方法返回的是请求的Servlet的映射路径,比如:ServletRequest映射的是是/ServletRequest
getServerName()/getServerPort():这两个方法是获取服务器的名称和端口号,比如localhost,8080
getSession()/getSession(boolean mode):这两个方法是获取一个session对象,相关之后在session篇会说到
getAttribute(String name):这个方法是从Request域中获取值
getAttributeNames():这个方法是获取Request域中获取所有的字段名称
getParameter(String name):这个方法是获取用户使用get/post方式携带的参数值
getParameterNames():这个方法是获取用户请求时携带的所有参数名称
getParameterMap():这个方法是获取用户请求时携带的参数名称和参数值,并将其组装成一个Map对象
getParameterValues():这个方法是获取用户请求携带的参数值,因为有时候一个参数名称可能对应多个值
setAttribute(String name,Object value):这个方法是设置Request域中的属性值
removeAttribute(String name):这个方法是删除Request域中的属性值
getInputStream()/getReader():
这个方法是获取用户请求的时候上传的输入流,比如我们在处理用户上传文件的时候。需要用到这个输入流
setCharacterEncoding(String name):这个方法是设置Request容器的编码
getRemoteAddr()/getRemoteHost():获取客户机的IP地址和主机名
getProctocol():获取协议名称
getRequestDispatcher(String path):获取一个转发对象RequestDispatcher,进行转发操作
3、常用的HTTP请求头与响应头(很详细,感谢作者):
ends~
上一篇: 学并发编程,透彻理解这三个核心是关键
下一篇: 学并发编程,透彻理解这三个核心是关键
推荐阅读
-
postman的安装与使用方法(模拟Get和Post请求)
-
Python使用post及get方式提交数据的实例
-
使用PHP Socket 编程模拟Http post和get请求
-
微信小程序授权 获取用户的openid和session_key【后端使用java语言编写】,我写的是get方式,目的是测试能否获取到微信服务器中的数据,后期我会写上post请求方式。
-
ajax的两种提交方式(get/post)和两种版本
-
PHP如何使用cURL实现Get和Post请求
-
iOS开发网络篇—发送GET和POST请求(使用NSURLSession) - 转
-
通过curl模拟post和get方式提交的表单类
-
使用HttpClient发送post和get请求三方接口
-
浅谈HTTP中GET和POST请求方式的区别