HttpUrlConnection--小白实训笔记

本文是HttpUrlConnection的实训笔记,介绍了Http请求的基本概念,详细讲解了HttpUrlConnection的使用,包括发送GET请求、加载网络图片和下载网络资源的实例代码。

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

HttpUrlConnection

1.什么是Http请求?

  • HTTP请求是客户端和服务器端之间,发送请求和返回应答的标准(TCP)。
  • 客户端发出—个HTTP请求后,就与服务器建立起了TcP连接服务端接收到请求并进行处理后返回给客户端响应数据。

2.什么是HttpUrlConnection?

  • URLConnection是个抽象类,它有两个直接子类分别是HttpURLConnection和JarURLConnection。另外一个重要的类是URL,通常URL可以通过传给构造器一个String类型的参数来生成一个指向特定地址的URL实例。
  • 每个 HttpURLConnection 实例都可用于生成单个请求,但是其他实例可以透明地共享连接到 HTTP 服务器的基础网络。请求后在 HttpURLConnection 的 InputStream 或 OutputStream 上调用 close() 方法可以释放与此实例关联的网络资源,但对共享的持久连接没有任何影响。如果在调用 disconnect() 时持久连接空闲,则可能关闭基础套接字。

3.ruhe使用HttpUrlConnection?

使用HttpUrlConnection发送GET请求的步骤:
1.创建URL对象
2.通过URL对象调用 open Connection方法获得 Httpurlconnection对象
3 Httpurlconnectiont对象设置其他连接属性
4. Httpurlconnection对象调用 getinputstream(方法向服务器发送htt请求
并获取到服务器返回的输入流
5.读取输入流,转换成Srng字符串

4.使用HttpUrlConnection获取Http请求(以访问csdn网站为例,附代码)

java代码:


import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class MainActivity extends AppCompatActivity {

    private Button getwebBtn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        bindID();

        getwebBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        getWebInfo();
                    }
                }).start();
            }
        });
    }



    public void getWebInfo() {

     try{
         //1.找水源--创建URL
         URL url=new URL("https://www.youkuaiyun.com/");
         //2.开水闸--openConnection
         HttpURLConnection httpURLConnectin=(HttpURLConnection) url.openConnection();
         //3.建管道--InputStream
         InputStream inputStream=httpURLConnectin.getInputStream();
         //4.建蓄水池蓄水--InputStreamReader
         InputStreamReader reader =new InputStreamReader(inputStream,"UTF-8");
         //5.水桶盛水--BufferedReader
         BufferedReader bufferedReader =new BufferedReader(reader);

         StringBuffer stringBuffer =new StringBuffer();
         String temp = null;

         while ((temp=bufferedReader.readLine())!=null){
             stringBuffer.append(temp);
         }

         bufferedReader.close();
         reader.close();
         inputStream.close();

         Log.e("MAIN",stringBuffer.toString());

     } catch (MalformedURLException e) {
         e.printStackTrace();
     } catch (IOException e) {
         e.printStackTrace();
       }
    }
    private void bindID() {
        getwebBtn=findViewById(R.id.getweb_btn);
    }
}

5.使用HttpURLConnection加载网络图片(附代码)

java代码:

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

import java.io.BufferedReader;

 public class Main2Activity extends AppCompatActivity {

    private Button loadBtn;
    private ImageView loadImg;
    private String picUcl="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1520920876648&di=0865e9d5a544e1ae1669530dba3e7455&imgtype=0&src=http%3A%2F%2Fimgsrc.baidu.com%2Fimgad%2Fpic%2Fitem%2F9f510fb30f2442a7bd5eb281db43ad4bd1130245.jpg";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);


        bindID();

        loadBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                DownloadTask task=new DownloadTask(Main2Activity.this);
                task.execute(picUcl,"frarri.jpg" );
              //  ImgLoadTask task = new ImgLoadTask(loadImg);
           //     task.execute("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1520920876648&di=0865e9d5a544e1ae1669530dba3e7455&imgtype=0&src=http%3A%2F%2Fimgsrc.baidu.com%2Fimgad%2Fpic%2Fitem%2F9f510fb30f2442a7bd5eb281db43ad4bd1130245.jpg");
            }
        });

    }

     private void bindID() {
        loadBtn=findViewById(R.id.loadpic_btn);
        loadImg=findViewById(R.id.loadpic_img);
     }
 }

6.使用HttpURLConnection下载网络资源(附代码)

java代码:

public class DownLoadTask extends AppCompatActivity {

    private Button downBtn;
    private ImageView downImage;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_download_task);

        bindID();

        downBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                DownLoadPicTask task = new DownLoadPicTask(DownLoadTask.this,downImage);
                task.execute("http://img31.mtime.cn/mg/2012/10/30/201631.37192876.jpg","fra1.jpg");
            }
        });

    }

    private void bindID() {
        downBtn = findViewById(R.id.down_btn);
        downImage = findViewById(R.id.pic_image);
    }
}
这里需要注意的有一点,就是构造方法的定义与传值,根据外部类的需要进行传值
                DownLoadPicTask task = new DownLoadPicTask(DownLoadTask.this,downImage);
                task.execute("http://img31.mtime.cn/mg/2012/10/30/201631.37192876.jpg","fra1.jpg");
这里还可以写成

new DownLoadTask(DownLoadTask.this,downImage).execute("http://img31.mtime.cn/mg/2012/10/30/201631.37192876.jpg","fra1.jpg");
然后创建外部类DownLoadPicTask.java继承AsyncTask()方法,实现doInBackground()与onPostExecute()方法;

先附上完整外部类代码

public class DownLoadPicTask extends AsyncTask<String,Integer,Integer>{

    private Context context;
    private ImageView downImage;
    private String dirPath;
    private String filePath;


    public DownLoadPicTask(Context context,ImageView image) {
        this.context = context;
        this.downImage = image;
    }


    @Override
    protected Integer doInBackground(String... strings) {
        dirPath = Environment.getExternalStorageDirectory()+"/download_pics/";

        File dir = new File(dirPath);//目录
        if (!dir.exists()){
            dir.mkdir();
        }

        filePath = dirPath+strings[1];
        File file = new File(filePath);
        if (file.exists()){
            return -1;
        }else {
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        InputStream inputStream= null;
        OutputStream outputStream = null;

        try {
            URL url = new URL(strings[0]);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            if (connection.getResponseCode()==200){
                inputStream = connection.getInputStream();
            }else {
                return -2;
            }
            outputStream = new FileOutputStream(file);

            int length = 0;
            byte[] buffer = new byte[4*1024];
            while ((length=inputStream.read(buffer))!=-1){
                outputStream.write(buffer,0,length);
            }

            inputStream.close();
            outputStream.close();

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return 1;
    }

    @Override
    protected void onPostExecute(Integer integer) {
        super.onPostExecute(integer);
        switch (integer){
            case 1:
                Toast.makeText(context,"下载完成",Toast.LENGTH_SHORT).show();
                Bitmap bm = BitmapFactory.decodeFile(filePath);
                downImage.setImageBitmap(bm);
                break;
            case -1:
                Toast.makeText(context,"文件已存在",Toast.LENGTH_SHORT).show();
                break;
            case -2:
                Toast.makeText(context,"网络异常",Toast.LENGTH_SHORT).show();
                break;
        }
    }
}
首先需要判定文件夹是否存在,所以定义两个目录和文件对象

    private String dirPath;
    private String filePath;
然后判断目录是否存在,若不存在,则创建目录
dirPath = Environment.getExternalStorageDirectory()+"/download_pics/";
创建目录
File dir = new File(dirPath);//目录
        if (!dir.exists()){
            dir.mkdir();
        }

再判断文件是否存在,若不存在,则创建文件

        filePath = dirPath+strings[1];//文件位置就是目录位置+传值过来的文件名
        File file = new File(filePath);
        if (file.exists()){
            return -1;
        }else {
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
return的-1传值给onPostExecute()方法进行switch判定

if (file.exists()){
            return -1;
        }
下面对输入流与输出流进行设置

        InputStream inputStream= null;
        OutputStream outputStream = null;
照例进行URL的初步设置

        URL url = new URL(strings[0]);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
然后需要对返回码进行一个判定,判断是否连接成功

    if (connection.getResponseCode()==200){
                inputStream = connection.getInputStream();
            }else {
                return -2;
            }
            outputStream = new FileOutputStream(file);
如果返回码不是200,连接不成功,return的-2传值给onPostExecute()方法进行switch判定





    else {
                return -2;
            }
如果返回码等于200,连接成功后,调用getInputStream()方法赋值给inputStream对象

if (connection.getResponseCode()==200){
                inputStream = connection.getInputStream();
            }
接着对输出流进行设置

outputStream = new FileOutputStream(file);
对输出流进行读取

int length = 0;
            byte[] buffer = new byte[4*1024];
            while ((length=inputStream.read(buffer))!=-1){
                outputStream.write(buffer,0,length);
            }
结束之后要对于输入流和输出流进行关闭

    inputStream.close();
    outputStream.close();
最后在onPostExecute()方法中,对传过来的值进行情况判定与输出

@Override
    protected void onPostExecute(Integer integer) {
        super.onPostExecute(integer);
        switch (integer){
            case 1:
                Toast.makeText(context,"下载完成",Toast.LENGTH_SHORT).show();
                Bitmap bm = BitmapFactory.decodeFile(filePath);
                downImage.setImageBitmap(bm);
                break;
            case -1:
                Toast.makeText(context,"文件已存在",Toast.LENGTH_SHORT).show();
                break;
            case -2:
                Toast.makeText(context,"网络异常",Toast.LENGTH_SHORT).show();
                break;
        }
    }
这里用到了context与downImage对象,需要从构造方法中传值

Toast.makeText(context,"下载完成",Toast.LENGTH_SHORT).show();
downImage.setImageBitmap(bm);
这是写在外部类里面的构造方法

 public DownLoadPicTask(Context context,ImageView image) {
        this.context = context;
        this.downImage = image;
    }
这一句调用了BitmapFactory.decodeFile()方法来解码图片

Bitmap bm = BitmapFactory.decodeFile(filePath);

电动汽车数据集:2025年3K+记录 真实电动汽车数据:特斯拉、宝马、日产车型,含2025年电池规格和销售数据 关于数据集 电动汽车数据集 这个合成数据集包含许多品牌和年份的电动汽车和插电式车型的记录,捕捉技术规格、性能、定价、制造来源、销售和安全相关属性。每一行代表由vehicle_ID标识的唯一车辆列表。 关键特性 覆盖范围:全球制造商和车型组合,包括纯电动汽车和插电式混合动力汽车。 范围:电池化学成分、容量、续航里程、充电标准和速度、价格、产地、自主水平、排放、安全等级、销售和保修。 时间跨度:模型跨度多年(包括传统和即将推出的)。 数据质量说明: 某些行可能缺少某些字段(空白)。 几个分类字段包含不同的、特定于供应商的值(例如,Charging_Type、Battery_Type)。 各列中的单位混合在一起;注意kWh、km、hr、USD、g/km和额定值。 列 列类型描述示例 Vehicle_ID整数每个车辆记录的唯一标识符。1 制造商分类汽车品牌或OEM。特斯拉 型号类别特定型号名称/变体。型号Y 与记录关联的年份整数模型。2024 电池_类型分类使用的电池化学/技术。磷酸铁锂 Battery_Capacity_kWh浮充电池标称容量,单位为千瓦时。75.0 Range_km整数表示充满电后的行驶里程(公里)。505 充电类型主要充电接口或功能。CCS、NACS、CHAdeMO、DCFC、V2G、V2H、V2L Charge_Time_hr浮动充电的大致时间(小时),上下文因充电方法而异。7.5 价格_USD浮动参考车辆价格(美元).85000.00 颜色类别主要外观颜色或饰面。午夜黑 制造国_制造类别车辆制造/组装的国家。美国 Autonomous_Level浮点自动化能力级别(例如0-5),可能包括子级别的小
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值