Java的HttpURLConnection使用记录

最近需要请求第三方的接口,需要熟悉一下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());

注意细节

  1. set一些设置的时候必须在connection之前,如果在connection之后这些set都没有效果了
  2. post请求的正文是通过outputStream流写入的,但是在这并没有真正的去发送请求,只是放在了内存缓冲区,只有当getInputStream()调用的时候才真正的去请求
  3. 设置超时,防止网络异常的情况下,可能会导致程序僵死而不继续往下执行
//超时设置必须在connection之前
urlConnection.setConnectTimeout(5 * 1000);// 5秒连接超时
urlConnection.setReadTimeout(5 * 1000);// 5秒获取内容超时
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值