您的位置:首页 > 理论基础 > 计算机网络

Java的HttpURLConnection使用记录

2017-11-30 11:37 555 查看
最近需要请求第三方的接口,需要熟悉一下HttpURLConnection,一下是我的操作的记录

参考链接:

http://www.blogjava.net/supercrsky/articles/247449.html

URL的请求类型

一般的url请求分为两种,一种是GET,一种是POST

GET请求的参数是放在url后面拼接的,请求大小有限制,具体多少大家可以自行去百度,在这里就不多说了

POST请求参数是放在HTTP请求的正文里的,可传输的内容远大于GET请求,而且理论上来说POST请求是没有大小限制的,所以使用POST请求较多

一般正常的请求,get参数会显示在地址栏上,参数很容易被获取,安全性也较低,所以使用POST请求会比较好

请求响应流程



设置请求头或响应头

HttpURLConnection有两种简单的设置请求头的方法

setRequestProperty(key,value)

addRequestProperty(key,value)

setRequestProperty和addRequestProperty的区别就是,setRequestProperty会覆盖已经存在的key的所有values,有清零重新赋值的作用。而addRequestProperty则是在原来key的基础上继续添加其他value。

URL对象的建立

// 连接的URL
URL url = new URL("http://127.0.0.1:8080/tfmobile/openBook/getCalendarInfo");
URLConnection urlConnection = url.openConnection();// 打开连接
// 这个地方的urlConnectio是根据请求协议(此处是http协议)生成的URLConnection类的子类HttpURLConnection
// 所以将其转化为HttpURLConnection类,以便使用HttpURLConnection更过的API
HttpURLConnection connection = null;
if (urlConnection instanceof HttpURLConnection) {
connection = (HttpURLConnection) urlConnection;
} else {
System.out.println("请输入 URL 地址");
return ;
}


HttpURLConnection参数设置

//POST可以更好的传参
connection.setRequestMethod("POST");// 设置请求方式,默认是GET
// 设置之后可以向服务端写入数据、、可以使用conn.getOutputStream().write()
// 可以传输参数,POST请求数据放在正文内,所以需要开启传参
urlConnection.setDoOutput(true);
// http读取数据
// 默认是true,所以可以一般的请求都可以获取数据
urlConnection.setDoInput(true);
// 是否使用缓存,Post 请求不能使用缓存
urlConnection.setUseCaches(false);

// 设置请求头
urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");

// 建立连接,上面的设置都在connect之前
urlConnection.connect();// 连接


添加请求头的时候如果有中文,就有可能造成中文乱码这时候可以使用这个方法

// 参数进行encode(编码),防止中文乱码
urlConnection.setRequestProperty("test", URLEncoder.encode("一个测试请求头", "UTF-8"));


对某个参数进行URLEncoder.encode,服务端获取参数之后再通过URLDecoder.decode一下就可以获得完整的中文了

HttpURLConnection连接问题

// 输出流,进行传参,所有数据放在这里
OutputStream outputStream = urlConnection.getOutputStream();
StringBuffer parmStringBuffer = new StringBuffer();
// 拼接参数
parmStringBuffer.append("book_type=").append(234).append("&").append("parm=").append("中文测试");
// 写入参数内容
outputStream.write(parmStringBuffer.toString().getBytes("UTF-8"));
// 刷新输出流,把所有的数据流数据都传输过去
outputStream.flush();
// 关闭输出流
outputStream.close();


HttpURLConnection连接

// 获取输入流,这段是正式请求,会把所有的设置和参数以http方式进行请求
InputStream input = urlConnection.getInputStream();
//在这段之后所有的参数添加都没有效果,因为在这之后并不会再重新的去请求服务器了,所以所有的参数添加必须在这之前,如果需要再添加参数,就必须重新再走一遍设置,具体有哪些不需要重新再配置暂时没研究

//打印获取的数据
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(input, "UTF-8"));
StringBuffer bs = new StringBuffer();
String l = null;
while ((l = bufferedReader.readLine()) != null) {
bs.append(l).append("\n");
}
System.out.println(bs.toString());


注意细节

set一些设置的时候必须在connection之前,如果在connection之后这些set都没有效果了

post请求的正文是通过outputStream流写入的,但是在这并没有真正的去发送请求,只是放在了内存缓冲区,只有当getInputStream()调用的时候才真正的去请求

设置超时,防止网络异常的情况下,可能会导致程序僵死而不继续往下执行

//超时设置必须在connection之前
urlConnection.setConnectTimeout(5 * 1000);// 5秒连接超时
urlConnection.setReadTimeout(5 * 1000);// 5秒获取内容超时
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java url