HttpURLConnection Demo

HttpUtils

package com.seliote.stockanalyzer.util;

import com.seliote.stockanalyzer.exc.http.HttpException;
import org.springframework.util.Assert;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.List;
import java.util.Map;
import java.util.zip.GZIPInputStream;

/**
 * HTTP 相关工具类
 *
 * @author LiYangDi
 * @since 2020/2/22
 */
public class HttpUtils {

    // HTTP GET 方法常量
    private static final String HTTP_GET = "GET";

    // 连接超时
    private static final int CONNECT_TIMEOUT = 5000;
    // 读取超时
    private static final int READ_TIMEOUT = 5000;
    // HTTP ACCEPT 常量
    private static final String ACCEPT_KEY = "Accept";
    // Accept 信息
    private static final String ACCEPT_VALUE = "text/html,application/xhtml+xml,application/xml;q=0.9," +
            "image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9";
    // HTTP ACCEPT_ENCODING 常量
    private static final String ACCEPT_ENCODING_KEY = "Accept-Encoding";
    // ACCEPT_ENCODING 信息
    private static final String ACCEPT_ENCODING_VALUE = "gzip, deflate, br";
    // HTTP ACCEPT_LANGUAGE 常量
    private static final String ACCEPT_LANGUAGE_KEY = "Accept-Language";
    // ACCEPT_LANGUAGE 信息
    private static final String ACCEPT_LANGUAGE_VALUE = "zh-CN,zh;q=0.9,en;q=0.8";
    // HTTP CONNECTION 常量
    private static final String CONNECTION_KEY = "Connection";
    // CONNECTION 信息
    private static final String CONNECTION_VALUE = "keep-alive";
    // HTTP USER-AGENT 常量
    private static final String USER_AGENT_KEY = "User-Agent";
    // USER-AGENT 信息
    private static final String USER_AGENT_VALUE = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " +
            "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.116 Safari/537.36";

    // 响应中的 content-encoding 键
    private static final String RESP_CONTENT_ENCODING_KEY = "content-encoding";

    /**
     * HTTP GET 方法请求 URL 编码后的响应 byte[]
     *
     * @param url 需要请求的 URL,GET 参数加在链接后
     * @return 请求接口后返回数据的 byte[]
     * @throws HttpException URL 编码、HTTP 请求中产生异常
     */
    public static byte[] getByBytes(String url) throws HttpException {
        HttpURLConnection httpURLConnection = null;
        try {
            // encode URL 并创建连接
            httpURLConnection = (HttpURLConnection) ((new URL(url)).openConnection());
            httpURLConnection.setRequestMethod(HTTP_GET);
            // 配置超时与请求头
            setProperties(httpURLConnection);
            // 设置写入与输出
            httpURLConnection.setDoOutput(true);
            // 开始请求
            httpURLConnection.connect();
            // 处理响应
            if (HttpURLConnection.HTTP_OK == httpURLConnection.getResponseCode()) {
                return readResp(httpURLConnection);
            } else {
                throw new HttpException("HTTP response code exception:" + httpURLConnection.getResponseCode());
            }
        } catch (MalformedURLException exc) {
            throw new HttpException("MalformedURLException: " + url + ", " + exc.getMessage(), exc);
        } catch (IOException exc) {
            throw new HttpException("IOException, URL: " + url + ", " + exc.getMessage(), exc);
        } finally {
            if (null != httpURLConnection) {
                httpURLConnection.disconnect();
            }
        }
    }

    /**
     * HTTP GET 方法请求 URL 编码后的响应 String
     *
     * @param url     需要请求的 URL,GET 参数加在链接后
     * @param charset URL 编码以及解析响应时所用的字符集
     * @return 请求接口后返回数据的 String
     * @throws HttpException URL 编码、HTTP 请求中产生异常
     */
    public static String getByString(String url, Charset charset) throws HttpException {
        return new String(getByBytes(url), charset);
    }

    /**
     * 设置 HttpURLConnection 超时与请求头参数
     *
     * @param httpURLConnection 需要设置的 HttpURLConnection 对象
     */
    private static void setProperties(HttpURLConnection httpURLConnection) {
        // 超时相关
        httpURLConnection.setConnectTimeout(CONNECT_TIMEOUT);
        httpURLConnection.setReadTimeout(READ_TIMEOUT);
        // 请求头相关
        httpURLConnection.setRequestProperty(ACCEPT_KEY, ACCEPT_VALUE);
        httpURLConnection.setRequestProperty(ACCEPT_ENCODING_KEY, ACCEPT_ENCODING_VALUE);
        httpURLConnection.setRequestProperty(ACCEPT_LANGUAGE_KEY, ACCEPT_LANGUAGE_VALUE);
        httpURLConnection.setRequestProperty(CONNECTION_KEY, CONNECTION_VALUE);
        httpURLConnection.setRequestProperty(USER_AGENT_KEY, USER_AGENT_VALUE);
    }

    /**
     * 读取 HTTP 响应
     *
     * @param httpURLConnection 读取响应的 HttpURLConnection 对象
     * @return 读取的 byte[]
     * @throws IOException 读取响应时发生异常
     */
    private static byte[] readResp(HttpURLConnection httpURLConnection) throws IOException {
        // 响应头,用来检测是否有压缩
        Map<String, List<String>> respHeader = httpURLConnection.getHeaderFields();
        String compressMethod = null;
        // 循环 Map 以获得大小写无关的比较
        for (Map.Entry<String, List<String>> entry : respHeader.entrySet()) {
            if (null != entry.getKey() && entry.getKey().equalsIgnoreCase(RESP_CONTENT_ENCODING_KEY)) {
                Assert.isTrue(null != entry.getValue() && 1 == entry.getValue().size(),
                        "HTTP response header 'content-encoding' value is empty or more than one");
                compressMethod = entry.getValue().get(0);
                break;
            }
        }
        return uncompressInputStream(compressMethod, httpURLConnection.getInputStream());
    }

    /**
     * 解压 InputStream
     *
     * @param compressMethod 压缩方法
     * @param inputStream    需要读取的 InputStream
     * @return 解压缩后的 byte[]
     * @throws IOException 读取时发生异常
     */
    private static byte[] uncompressInputStream(String compressMethod, InputStream inputStream) throws IOException {
        if (null == compressMethod) {
            return IOUtils.readInputStream(inputStream);
        } else if ("gzip".equalsIgnoreCase(compressMethod)) {
            GZIPInputStream gzipInputStream = new GZIPInputStream(inputStream);
            return IOUtils.readInputStream(gzipInputStream);
        } else {
            throw new IOException("Response had unknown 'content-encoding': " + compressMethod);
        }
    }
}

IOUtils

package com.seliote.stockanalyzer.util;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * IO 相关工具类
 *
 * @author LiYangDi
 * @since 2020/2/23
 */
public class IOUtils {

    /**
     * 读取 InputStream 中的所有 byte[] 数据,内存中保存,不适合大量数据
     *
     * @param inputStream 输入的流
     * @return 流中的 byte[] 数据
     */
    public static byte[] readInputStream(InputStream inputStream) throws IOException {
        // 缓存
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        int readLength;
        byte[] readBuffer = new byte[1024];
        // 读取数据
        while ((readLength = inputStream.read(readBuffer)) != -1) {
            byteArrayOutputStream.write(readBuffer, 0, readLength);
        }
        return byteArrayOutputStream.toByteArray();
    }
}

原文地址:https://www.cnblogs.com/seliote/p/12353146.html

时间: 2024-10-28 13:54:03

HttpURLConnection Demo的相关文章

Demo(3月28日)

项目包含页面跳转.多线程数据请求:下面就来解剖. 运行图 首先,两个界面的来回跳转.通过"提交""返回"点击即可. Intent intent = new Intent(MainActivity.this, Main2Activity.class); intent.putExtra(key, name); startActivity(intent); 其次,线程.在这里在第二个界面上通过一个按钮对应一个线程,点击按钮查看影片详情(下载图片) 有简洁的方式,这里就是d

HttpURLConnection连接异常

使用上面画红线的方式获取连接报了 java.lang.ClassCastException: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream cannot be cast to java.net.HttpURLConnection    at demo.FramDemo.fram(FramDemo.java:27)    at demo.FramDemo.main(FramDemo.java:60) 改为如下即可 此异常可能

android源码大放送(实战开发必备),免费安卓demo源码,例子大全文件详细列表

免费安卓demo源码,例子大全文件详细列表 本列表源码永久免费下载地址:http://www.jiandaima.com/blog/android-demo 卷 yunpan 的文件夹 PATH 列表 卷序列号为 0000-73EC E:. │ jiandaima.com文件列表生成.bat │ 例子大全说明.txt │ 本例子永久更新地址~.url │ 目录列表2016.03.10更新.txt │ ├─前台界面 │ ├─3D标签云卡片热门 │ │ Android TagCloudView云标签

Android中使用HttpURLConnection实现GET POST JSON数据与下载图片

Android6.0中把Apache HTTP Client所有的包与类都标记为deprecated不再建议使用 所有跟HTTP相关的数据请求与提交操作都通过HttpURLConnection类实现,现实是 很多Android开发者一直都Apache HTTP Client来做andoird客户端与后台HTTP接口数 据交互,本人刚刚用HttpURLConnection做了一个android的APP,不小心踩到了几个 坑,总结下最常用的就通过HttpURLConnection来POST提交JSO

Android网络之HttpUrlConnection和Socket关系解析

多年以前Android的网络请求只有Apache开源的HttpClient和JDK的HttpUrlConnection,近几年随着OkHttp的流行Android在高版本的SDK中加入了OkHttp.但在Android官方文档中推荐使用HttpUrlConnection并且其会一直被维护,所以在学习Android网络相关的知识时我们队HttpUrlConnection要有足够的了解.... 前几天因为时间的关系只画了图 HttpUrlConnection和Socket的关系图 ,本来说好的第二天

使用HttpURLConnection实现在android客户端和服务器之间传递对象

一般情况下,客户端和服务端的数据交互都是使用json和XML,相比于XML,json更加轻量级,并且省流量,但是,无论我们用json还是用xml,都需要我们先将数据封装成json字符串或者是一个xml字符串然后传输,那么有没有可能我们直接在android客户端上传递一个Object给服务器端呢?答案是肯定的. 我们看一个简单的App注册页面,如下图: 当我们点击注册按钮的时候,将用户的注册信息通过一个Object对象传递到服务器,好,下来我们看看怎么样来传递对象: 首先我们要把用户的注册信息封装

Android中HttpURLConnection使用详解

认识Http协议 Android中发送http网络请求是很常见的,要有GET请求和POST请求.一个完整的http请求需要经历两个过程:客户端发送请求到服务器,然后服务器将结果返回给客户端,如下图所示: 客户端->服务器 客户端向服务器发送请求主要包含以下信息:请求的Url地址.请求头以及可选的请求体,打开百度首页,客户端向服务器发送的信息如下所示: 请求URL(Request URL) 上图中的Request URL就是请求的Url地址,即https://www.baidu.com,该Url没

Android端通过HttpURLConnection上传文件到服务器

一:实现原理 最近在做Android客户端的应用开发,涉及到要把图片上传到后台服务器中,自己选择了做Spring3 MVC HTTP API作为后台上传接口,android客户端我选择用HttpURLConnection来通过form提交文件数据实现上传功能,本来想网上搜搜拷贝一下改改代码就好啦,发现根本没有现成的例子,多数的例子都是基于HttpClient的或者是基于Base64编码以后作为字符串来传输图像数据,于是我不得不自己动手,参考了网上一些资料,最终实现基于HttpURLConnect

Android使用HttpURLConnection下载图片

讲到http就必需要了解URI和URL URI (uniform resource identifier)统一资源标志符: URL(uniform resource location )统一资源定位符(或统一资源定位器): 可以理解成URL是URI的子集,URI是一抽象的标识符,URL可以理解成具体的标识符:只要是网络上的资源就能找到唯一的URL. 目录结构 效果图 关键代码 HttpUtils.java类 package com.dzt.downloadimage.utils; import