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()而是阻塞在获取流。所以在获取流之前应该设置好所有的参数。