【java细节】Java用HttpURLConnection实现Http、restful请求
2016-06-20 17:52
609 查看
Restful请求
RESTful的关键是定义可表示流程元素/资源的对象。在REST中,每一个对象都是通过URL来表示的,对象用户负责将状态信息打包进每一条消息内,以便对象的处理总是无状态的。除去restful的状态特性,即将资源以名称来显示,而非用一串无意义的数来显示。非rest:http://geek.csdn.net/news/detail/82314
Rest:https://api.example.com/v1/animals
HttpURLConnection使用
如前文所示的TCP局域网传送东西,除了对传输层的TCP/UDP支持良好外,Java对HTTP(超文本传输协议)也提供了很好的支持,这里包括两种接口:1、标准Java接口(java.net) —-HttpURLConnection,可以实现简单的基于URL请求、响应功能;
2、Apache接口(org.appache.http)—-HttpClient,使用起来更方面更强大。一般来说,用这种接口。不过本文还是把第一种接口过一下。
任何一种接口,无外乎四个基本功能:访问网页、下载图片或文件、上传文件.
HttpURLConnection继承自URLConnection类,用它可以发送和接口任何类型和长度的数据,且预先不用知道数据流的长度,可以设置请求方式get或post、超时时间。
添加请求头参数
利用setRequestProperty设置请求头参数,请求头参数以键值对形式传入,如果需要编码,则传入编码好的字符串即可。conn.setRequestProperty("Authorization", "Basic YWRtaW46YWRtaW4="); conn.setRequestProperty("Content-Type", "application/json"); conn.setRequestProperty("departmentName","dGVzdA==");
添加body参数
conn.setDoOutput(true);// 是否输入参数 StringBuffer params = new StringBuffer(); // 表单参数与get形式一样 params.append("f292139625cd4d59fcff42360ce11fc"); byte[] bypes = params.toString().getBytes(); conn.getOutputStream().write(bypes);// 输入参数
解决输出乱码
package Restful; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; public class Restful { public static void main(String[] args) throws IOException { URL url = new URL("http://localhost:8080/NbOrg/api/getPersonInfo/6d1e8b89eefb37a0b3f222533f82ca59"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // 提交模式 conn.setRequestMethod("GET");// POST GET PUT DELETE conn.setRequestProperty("Authorization", "Basic YWRtaW46YWRtaW4=");//YWRtaW46YWRtaW4="); // 设置访问提交模式,表单提交 conn.setRequestProperty("Content-Type", "application/json"); conn.setConnectTimeout(15000);// 连接超时 单位毫秒 conn.setReadTimeout(15000);// 读取超时 单位毫秒 //读取请求返回值 // conn.setDoOutput(true);// 是否输入参数 // // StringBuffer params = new StringBuffer(); // // 表单参数与get形式一样 // params.append("f292139625cd4d59fcff42360ce11fc"); // byte[] bypes = params.toString().getBytes(); // conn.getOutputStream().write(bypes);// 输入参数 byte bytes[]=new byte[1024]; InputStream inStream=conn.getInputStream(); inStream.read(bytes, 0, inStream.available()); System.out.println(new String(bytes, "utf-8")); } }
第二种获取返回值的代码
BufferedReader br = new BufferedReader(new InputStreamReader( myURLConnection.getInputStream())); String line; StringBuilder response = new StringBuilder(); while ((line = br.readLine()) != null) { response.append(line); response.append('\r'); System.out.println(line); } br.close();
不过容易出现乱码,注意设置编码格式。
总结
使用HttpURLConnection的步骤是先实例化一个URL对象,通过URL的openConnection实例化HttpURLConnection对象。然后设置参数,注意此时并没有发生连接。真正发生连接是在获得流时即conn.getInputStream这一句时,这点跟TCP Socket是一样的。并非阻塞在ServerSocket.accept()而是阻塞在获取流。所以在获取流之前应该设置好所有的参数。相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- RPC failed; result=22, HTTP code = 411
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序