写点什么

HTTP 通信

作者:武师叔
  • 2022 年 8 月 20 日
    辽宁
  • 本文字数:1851 字

    阅读完需:约 6 分钟

HTTP 通信

HTTP 通信

Java 程序执行 HTTP 通信的类定义在 java.net 包内,使用时需进行导入。

基本通信方式:创建连接对象 》设置连接参数和请求属性 》建立连接并发送请求 》读取响应内容 》关闭连接

创建连接对象

  • URL 类:标记定向资源所在位置,如果格式错误则抛出 IOException

  • URLConnection 类:读取和写入 URL 类定向的资源,在 HTTP 协议中常用 HttpURLConnection 子类。

URL myUrl = new URL("https://www.baidu.com");HttpURLConnection myCon = (HttpURLConnection)myUrl.openConnetcion();Copy to clipboardErrorCopied
复制代码

配置连接

设置请求参数

myCon.setRequestMethod("POST");         // 设置连接方法(默认使用GET)
myCon.setDoInput(true); // 允许进行字符流输入: myCon.getInputStream().read();myCon.setDoOutput(true); // 允许进行字符流输出: myCon.getOutputStream().write();
myCon.setRequestMethod(1000); // 设置最长建立连接时间,若超时则抛出 SocketTimeoutExceptionmyCon.setRequestMethod(1000); // 设置最长数据读取时间,若超时则抛出 SocketTimeoutExceptionCopy to clipboardErrorCopied
复制代码

设置请求属性

// 设置版本myCon.setRequestProperty("version", "1.2.3");            // 设置浏览器类型(常用于爬虫伪装)myCon.setRequestProperty("user-agent", "Mozilla/5.0 (compatible;  Windows NT 5.1;SV1)");// 设置发送文本类型myCon.setRequestProperty("Content-Type", "application/json;charset=utf-8");Copy to clipboardErrorCopied
复制代码

连接并发送请求

  • connect 方法:建立连接并发送请求.

  • getOutputStream 方法:关闭输出流时自动建立连接并发送输出流请求.

myCon.connect();
OutputStreamWriter out = new OutputStreamWriter(myCon.getOutputStream());out.write(str); out.close();Copy to clipboardErrorCopied
复制代码

获取响应数据

获取响应头信息

myCon.getResponseCode();        // 获取响应码(200为连接成功,404为未找到)myCon.getHeaderField();         // 获取响应头字段Copy to clipboardErrorCopied
复制代码

获取响应内容

  • getContent 方法:获取响应内容。

  • getInputStream 方法:输入流获取响应内容,响应表明发送了错误则抛出 IOException

myCon.getContent(); 
BufferedReader in = new BufferedReader(new InputStreamReader(myCon.getInputStream()));while ((str = in.readLine()) != null) { System.out.println(str);}in.close();Copy to clipboardErrorCopied
复制代码

关闭连接

myCon.disconnect();Copy to clipboardErrorCopied
复制代码



HTTP 通信用例

// 网络爬虫public class WebCrawler{    public static void getHttpJson(int i) {        try {            //配置URL            URL myUrl = new URL("https://static-data.eol.cn/www/school/"+ i + "/info.json");            //配置连接            HttpURLConnection myCon = (HttpURLConnection) myUrl.openConnection();            myCon.setRequestProperty("user-agent", "Mozilla/5.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");            myCon.setConnectTimeout(10000);            myCon.setReadTimeout(1000);            //建立连接            myCon.connect();            //如果连接成功            if (myCon.getResponseCode() == 200) {                System.out.print("ID" + i + "的数据读取成功,数据内容:");                //读取返回数据                InputStream in = myCon.getInputStream();                int cnt = in.available();                byte[] b = new byte[cnt];                in.read(b);                String str = new String(b);                //输出返回数据                System.out.println(str);            }else{                System.out.println("ID" + i + "的数据读取失败,代码:" + myCon.getResponseCode());            }        } catch (MalformedURLException e) {            System.out.println("URL错误,无法查找到资源。");        } catch(SocketTimeoutException e){            System.out.println("ID" + i + "的数据访问连接超时。");        } catch (IOException e) {            System.out.println("发送的请求存在错误,资源拒绝访问。");        }        return;    }}
复制代码


发布于: 刚刚阅读数: 3
用户头像

武师叔

关注

每天丰富自己,去过自己想要的生活! 2022.04.28 加入

一个喜欢最新技术,研发的人工智能专业的大二学生,用自己的代码做一些有意义的事情! 目前大二结束有去大厂研发岗实习的计划,每天丰富自己的技术,去过自己想要的实习生活。

评论

发布
暂无评论
HTTP 通信_8月月更_武师叔_InfoQ写作社区