Java的HTTP通信

Java HTTP通信

1、任务简介

本部分任务属于杜老师《工程训练》中的任务3.1,本博客挑出其中的第一个普通任务和第一个挑战任务进行讲解,主要涉及了Java中HTTP通信的Get方式;

HTTP通信主要有两种方式POST方式和GET方式,前者通过HTTP消息实体发送数据给服务器,安全性高,数据传输大小没有限制,后者通过URL的查询字符串传递给服务器参数,以明文显示在浏览器地址栏,保密性差,最多传输2048个字符。但是GET请求并不是一无是处,因为GET请求大多用于查询(读取资源),效率高,POST请求用于注册、登录等安全性较高且向数据库中写入数据的操作;


2、基本任务和代码

(1)任务1

1)任务内容
编写一个java application应用程序,完成以下功能:此程序可以建立HTTP通信,以GET方式向WEB服务器提交信息,并接收WEB服务器返回的响应。

2)任务代码
在进行程序的编写前我们首先需要学习Java中的URL类,Java的URL类可以让访问网络资源就像是访问你本地的文件夹一样方便快捷,我们可以通过语句URL url=new URL(“网址”);创建一个URL类的实例,之后就可以对这个实例进行操作;

虽然实例已经创建完了,但是在访问这个URL上的资源和内容之前,还需要打开与这些资源和内容的连接,此时可以通过使用openConnection来完成这一操作,连接的语句为URLConnection connection=url.openConnection();使用openConnection并不需要参数,并且在操作成功之后,它会返回URLConnection的实例;

在Java中Stream代表一种数据流,在此程序中需要使用InputStream获取URL内容的字节流,然后使用InputStreamReader将字节流包装为字符串流,此时还需要指定编码格式为utf-8码,这样就可以防止显示结果为乱码,之后还需要使用BufferedReader类创建一个实例来存放转换后的字符;

之后我们还需要使用StringBuilder方法,它比String更加高效,故可在字符串较多时使用,在进行数据流的操作后还需要使用close关闭流,并且秉承“后开先关闭”的原则;

我选择使用Get方法访问优酷的官网https://www.youku.com,我使用Myeclipse编写该程序,类名为Get,程序代码如下:

import java.io.BufferedReader;//导入java.io包下的BufferedReader类
import java.io.IOException;//导入java.io包下的IOException类
import java.io.InputStream;//导入java.io包下的InputStream类
import java.io.InputStreamReader;//导入java.io包下的InputStreamReader类
import java.net.MalformedURLException;//导入java.net包下的MalformedURLException类
import java.net.URL;//导入java.net包下的URL类
import java.net.URLConnection;//导入java.net包下的URLConnection类
public class Get{//类名
    public static void main(String[] args){//程序主函数
        new ReadByGet().start();//调用新建的ReadByGet类
        }
    static class ReadByGet extends Thread{//定义一个静态的ReadByGet类继承于Thread类
        public void run(){//run方法,里面包含需要执行的任务
            try{//try代码块,当发生异常时会转到catch代码块中
                URL url=new URL("https://www.youku.com");//创建一个URL类的实例,并指定网址
                URLConnection connection=url.openConnection();//创建实例连接指定URL上的内容
                InputStream is=connection.getInputStream();//获取内容的字节流
                InputStreamReader isr=new InputStreamReader(is,"utf-8");//将字节流包装为字符串流,并制定编码格式为utf-8
                BufferedReader br=new BufferedReader(isr);//创建一个实例用来存放转换后的字符
                String line;//定义一个字符串类型变量
                StringBuilder builder=new StringBuilder();//创建实例
                while ((line=br.readLine()) !=null){//读取信息,并且当信息不为空时
                    builder.append(line+"\n");//append方法使builder包含line中的所有信息
                    }
                br.close();//关闭流
                isr.close();//关闭流
                is.close();//关闭流
                System.out.println(builder);//输出读取的信息
                }
            catch (MalformedURLException e){//当try代码块有异常时转到catch代码块 
                e.printStackTrace();//打印异常所在位置及原因
                }
            catch (IOException e){//当try代码块有异常时转到catch代码块
                e.printStackTrace();//打印异常所在位置及原因
            }
        }
    }
}

3)运行结果
点击运行后可以得到优酷主页www.youku.com网页的源代码,但是我们需要将控制台显示行数调到最高,在Myeclipse中点击Windows→Preferences→Run/Debug→Console→Console buffer size设置为1000000才能显示该代码,此时控制台的输出如下:
Java的HTTP通信_第1张图片

(2)任务2

1)任务简介
把本程序改造为一个可以通过HTTP请求来下载图片或其他文件的程序,下载结果要按下载到的文件类型进行存盘。

2)任务代码
我选择将普通任务步骤1中获得的优酷首页www.youku.com的网页源代码存到一个txt文本文件中,该部分就需要使用到工程训练任务2.1文件操作中的内容,关于文件写入操作在前期训练任务5.22-5.29中也有涉及,所以在进行该部分操作的同时还可以对以前学过的知识进行温习;

首先需要在Myeclipse创建一个新的Java Project,然后在里面创建一个类,类名为GetPlus,然后将普通任务步骤1中Get的代码复制过来,此时只需要在这些代码的基础上稍加改动即可实现文件的写入,在控制台输出信息语句下面加入以下语句:
FileWriter fw=new FileWriter(“Test1.txt”);
通过该语句可以在代码存储的workplace中创建一个文本文档名为Test1.txt,然后再使用语句fw.write(builder.toString());就可以将builder中的信息存入新建的文本文档中,其中toString()可以将builder中信息转为字符串形式便于写入文档之中;
首先查看代码存储路径下是否有文本文档,如下图:
Java的HTTP通信_第2张图片
代码如下:

import java.io.BufferedReader;//导入java.io包下的BufferedReader类
import java.io.FileWriter;//导入java.io包下的FileWriter类
import java.io.IOException;//导入java.io包下的IOException类
import java.io.InputStream;//导入java.io包下的InputStream类
import java.io.InputStreamReader;//导入java.io包下的InputStreamReader类
import java.net.MalformedURLException;//导入java.net包下的MalformedURLException类
import java.net.URL;//导入java.net包下的URL类
import java.net.URLConnection;//导入java.net包下的URLConnection类
public class GetPlus{//类名
    public static void main(String[] args){//程序主函数
        new ReadByGet().start();//调用新建的ReadByGet类
        }
    static class ReadByGet extends Thread{//定义一个静态的ReadByGet类继承于Thread类
        public void run(){//run方法,里面包含需要执行的任务
            try{//try代码块,当发生异常时会转到catch代码块中
                URL url=new URL("https://www.youku.com");//创建一个URL类的实例,并指定网址
                URLConnection connection=url.openConnection();//创建实例连接指定URL上的内容
                InputStream is=connection.getInputStream();//获取内容的字节流
                InputStreamReader isr=new InputStreamReader(is,"utf-8");//将字节流包装为字符串流,并制定编码格式为utf-8
                BufferedReader br=new BufferedReader(isr);//创建一个实例用来存放转换后的字符
                String line;//定义一个字符串类型变量
                StringBuilder builder=new StringBuilder();//创建实例
                while ((line=br.readLine()) !=null){//读取信息,并且当信息不为空时
                    builder.append(line+"\n");//append方法使builder包含line中的所有信息
                    }
                br.close();//关闭流
                isr.close();//关闭流
                is.close();//关闭流
                System.out.println(builder);//输出读取的信息
                FileWriter fw=new FileWriter("Test1.txt");//创建FileWiter类对象
                fw.write(builder.toString());//将读取的信息存入文档中
                }
            catch (MalformedURLException e){//当try代码块有异常时转到catch代码块 
                e.printStackTrace();//打印异常所在位置及原因
                }
            catch (IOException e){//当try代码块有异常时转到catch代码块
                e.printStackTrace();//打印异常所在位置及原因
            }
        }
    }
}

3)运行结果
打开该文本文档后部分信息如下图:
Java的HTTP通信_第3张图片
控制台部分信息为下图:
Java的HTTP通信_第4张图片
对比后可以发现文本文档中已经存入了优酷主页的网页源代码,由于该操作是实时的,而优酷主页包含的内容一直在更新,所以不同时间段操作的结果都会有略微的不同,但是html文档的框架格式是基本不变的;


3、总结

本博客主要是基于Get方式对Java的HTTP通信进行讲解,Post方式可通过其他方式进行学习,也可在下方留言获取。

你可能感兴趣的:(Java)