【java细节】Java用HttpURLConnection实现Http、restful请求

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

你可能感兴趣的:(javaweb)