设为首页 加入收藏

TOP

使用Java内置类HttpUrlConnection实现HTTP请求(一)
2018-03-18 16:21:48 】 浏览:494
Tags:使用 Java 内置 HttpUrlConnection 实现 HTTP 请求

1. 概述


在这篇快速教程中,我们将使用Java内置类HttpUrlConnection来实现一个Http请求。


2. HttpUrlConnection


HttpUrlConnection类允许我们不用添加其他任何类库就能实现基本的Http请求。所有需要的类都包含在 java.net包内。缺点是,相比于其他http类库,该方法有点笨重,而且也没有提供一些高级特性的API,比如添加请求头,添加认证等。不过这些都不要紧。你完全可以将这个实现封装一下,添加一些高级特性也不是很复杂。


如果你只是想快速地进行些Http请求而不想添加一些类库的话,本文的这些代码就足够了。


另外,如果你对java的http请求基本实现不很了解,本文给出的代码也会有些帮助。


3. 创建请求


HttpUrlConnection类的创建是通过URL 类的openConnection()方法。这个方法只是创建一个连接对象,并不建立连接。


通过设置requestMethod属性,HttpUrlConnection类可以创建各种请求类型——包括GET, POST, HEAD, OPTIONS, PUT, DELETE, TRACE。


比如创建一个GET请求:


4. 添加请求参数


如果我们想要添加请求参数,我们需要设置doOutput 为true,然后将请求参数拼接成字符串,格式param1=value&param2=value,以流的形式写入到HttpUrlConnection 实例的OutputStream中。示例代码如下:


Map<String, String> parameters = new HashMap<>();
parameters.put("param1", "val");
 
con.setDoOutput(true);
DataOutputStream out = new DataOutputStream(con.getOutputStream());
out.writeBytes(ParameterStringBuilder.getParamsString(parameters));
out.flush();
out.close();


为方便转换字符串参数,我写了个工具类ParameterStringBuilder。类中包含一个静态方法getParamsString()将Map转换成对应格式的字符串:


public class ParameterStringBuilder {
    public static String getParamsString(Map<String, String> params)
      throws UnsupportedEncodingException{
        StringBuilder result = new StringBuilder();
 
        for (Map.Entry<String, String> entry : params.entrySet()) {
          result.append(URLEncoder.encode(entry.getKey(), "UTF-8"));
          result.append("=");
          result.append(URLEncoder.encode(entry.getValue(), "UTF-8"));
          result.append("&");
        }
 
        String resultString = result.toString();
        return resultString.length() > 0
          ? resultString.substring(0, resultString.length() - 1)
          : resultString;
    }
}


5. 添加请求头


通过setRequestProperty() 方法可以添加请求头:


 con.setRequestProperty("Content-Type", "application/json");


 通过getHeaderField()方法可以读取响应头:


 String contentType = con.getHeaderField("Content-Type");


6. 配置超时时间


类允许我们设置连接超时时间和读取超时时间。这些值决定了连接建立的最大等待时间间隔或读取到达数据的最大等待时间间隔。


设置超时时间,我们可以调用方法setConnectTimeout() 和方法setReadTimeout():


 con.setConnectTimeout(5000);
 con.setReadTimeout(5000);


 这个例子中我们将超时时间设为5秒。


7.  处理Cookies


java.net 包包含的类CookieManager,HttpCookie等能很便捷地处理Cookies.


首先,从响应中读取cookies,我们先获取相应头里的Set-Cookie值,然后解析成HttpCookie对象的List.


 String cookiesHeader = con.getHeaderField("Set-Cookie");
 List<HttpCookie> cookies = HttpCookie.parse(cookiesHeader);


 接下来,我们将cookies存储起来:


 cookies.forEach(cookie -> cookieManager.getCookieStore().add(null, cookie));


 我们检查cookies中是否包含一个username属性,如果不包含,我们把一个叫zhangsan的username添加进去:


 Optional<HttpCookie> usernameCookie = cookies.stream()
  .findAny().filter(cookie -> cookie.getName().equals("username"));
 if (usernameCookie == null) {
    cookieMa

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Spring对JDBC的模板支持:JdbcTem.. 下一篇给HttpClient添加Socks代理

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目