模拟HTTP请求

本文深入解析HTTP协议的基础知识,包括数据传输方式(GET和POST)、安全性考量、输入输出流原理,并通过Java实例演示如何利用HttpURLConnection和HttpClient实现HTTP请求,以获取服务上的图片资源并保存至本地。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、HTTP协议的基础知识

       服务器端返回数据的三种主要方式:HTML, XML, JSON,

二、方式:Get和Post.

三、特点:

1、Get : (1)将键值对放在URL后面传递(URL?key=value&key=value的形式)

       (2)服务器端直接读取,效率高,用Request.QueryString获取变量的值

       (3)缺乏安全性

       (4)长度有限制

       (5)是中文数据,且不敏感,可以采用Get

2、Post:(1)可以将数据转化成二进制打包,放在Http的报头中【HTML Header】

       (2)不受URL长度限制,可以传输大量数据

       (3)不显示在浏览器地址栏中,安全性较好,服务器端用Request.Form获取

       (4)效率相比较低

              (5)非中文数据,或敏感,采用Post

三、输入流和输出流

【记住以程序为中心,服务器数据流进程序是输入流,程序将文件保存到本地是输出流】

输入流(InputStream):程序通过输入流从数据源(如服务器)读取数据

输出流(OutputStream):程序通过输出流向目的地写数据

四、使用:

JAVA中HTTP编程的两种方式:

1、  标准JAVA接口

2、  标准Apache接口

Android中HTTP编程的两种方式:

1、以HttpURLConnection模拟请求【传统JAVA使用的方法】

2、HttpClient【推荐使用,代码少,效率高】

 

五、【JAVA】以HttpURLConnection模拟Get请求获得服务上的一张图片

public class HttpUtils {

private static String URL_PATH = "http://192.168.0.102:8080/myhttp/pro1.png";

    public HttpUtils()

{   // TODO Auto-generated constructor stub}

   

//将图片输出到本地磁盘上

    public static void saveImageToDisk() {

       InputStream inputStream = getInputStream();

       byte[] data = new byte[1024];

       int len = 0;

       //定义输出流,让文件输出至磁盘

       FileOutputStream fileOutputStream = null;

       try {

           //输出流的内容为输出到C盘下的test.png

           fileOutputStream = new FileOutputStream("C:\\test.png");

    //读取文件的字节流(输入流),其返回值不为-1(读完了)时,将其写入输出流

           while ((len = inputStream.read(data)) != -1) {

/*data是要写入的字节数组;0是读入数组的初始位置,以后每次加1

*len是读取长度,大于读取长度时读1024byte,小于时读剩下的所有byte,没有时值为-1

*写入输出流

*/

           fileOutputStream.write(data, 0, len);

           }

           } catch (IOException e){

           e.printStackTrace();

           } finally {

           /*如果输入流不是对象(在初始化时就出错了),或者已经没有内容了

*关闭输入流就会出现空指针异常

            *所以需要判断一下再关闭

            */

           if (inputStream != null) {

              try {

                  inputStream.close();

              } catch (IOException e) {

                  // TODO Auto-generatedcatch block

                  e.printStackTrace();

              }

           }

           //注释同上

           if (fileOutputStream != null) {

              try {

                  fileOutputStream.close();

              } catch (IOException e) {

                  // TODO Auto-generatedcatch block

                  e.printStackTrace();

              }

           }

       }

    }

 

    /**

    * 获得服务器端的数据,InputStream形式返回,URL中已经包括了该图片的位置信*

     * @return

     */

    public static InputStream getInputStream() {

       InputStream inputStream = null;

       HttpURLConnection httpURLConnection = null;

       try {

           URL url = new URL(URL_PATH);

           if (url != null) {

httpURLConnection = (HttpURLConnection) url.openConnection();

              // 设置连接网络的超时时间

              httpURLConnection.setConnectTimeout(3000);

              httpURLConnection.setDoInput(true);

              // 表示设置本次http请求使用GET方式请求

              httpURLConnection.setRequestMethod("GET");

              int responseCode = httpURLConnection.getResponseCode();

              if (responseCode == 200) {

                  // 从服务器获得一个输入流

                  inputStream = httpURLConnection.getInputStream();

              }

           }

       } catch (MalformedURLException e) {

           // TODO Auto-generatedcatch block

           e.printStackTrace();

       } catch (IOException e) {

           // TODO Auto-generatedcatch block

           e.printStackTrace();

       }

       return inputStream;

    }

    public static void main(String[] args) {

       // 从服务器获得图片保存到本地

       saveImageToDisk();

    }

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值