第一单元 HTTP基本使用方法

  • 1.1. HTTP传输协议
    1.1.1什么是HTTP协议(概念)
    1.1.2HTTP协议的主要的特点
    1.1.3HTTP协议的会话方式
    1.1.4HTTP 1.0和HTTP1.1的区别
  • 1.2. GET与POST请求
    1.2.1 7种请求方式,其中最常用的是GET和POST
    1.2.2 请求头
    1.2.3 请求体
    1.2.4 响应码
  • 1.3. 文件上传
    1.3.1 图片上传
  • 1.4. 文件下载
    1.4.1 apk下载以及断点续传

1. 什么是Http?

超文本传送协议(http-Hypertext transfer protocol),定义了浏览器与服务器的通信。应用层的协议。

2. http特点

(1) 支持客户/服务器模式
(2) 灵活:支持任意类型的数据对象
(3) 无连接:无连接,服务器处理完端的请求后,断开连接。这种方式可以节省传输时间
(4) 无状态:对于事物处理没有记忆能力

3. 7种请求方式:

1、OPTIONS
返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务器发送‘*’的请求来测试服务器的功能性
2、HEAD
向服务器索与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应小消息头中的元信息。
3、GET
向特定的资源发出请求。它本质就是发送一个请求来取得服务器上的某一资源。资源通过一组HTTP头和呈现数据(如HTML文本,或者图片或者视频等)返回给客户端。
4、POST
向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。
5、PUT
向指定资源位置上传其最新内容
6、DELETE
请求服务器删除Request-URL所标识的资源
7、TRACE
回显服务器收到的请求,主要用于测试或诊断
8、CONNECT
HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。

4. http1.0和http1.1区别

http1.0是非持续连接
Http1.1是长久持续连接

5. Get和Post请求区别

get请求直接将请求参数暴露在url,不安全+一般用于向服务器请求数据
post请求将请求参数放在请求体里面,安全的+一般用于向服务器提交数据

6. http请求协议

(1) 请求首行:
GET /jsp/get.jsp?name=yaotianxue&pass=123456 HTTP/1.1
POST /jsp/post.jsp HTTP/1.1
(2) 请求头信息:客户端告诉服务器我这边的信息
(3) 空行
(4) 请求体:get请求是没有请求体的,post有请求体

7. http响应协议

(1)响应首行:HTTP/1.1 200 OK
(2)响应头信息:Content-Length 服务器返回数据的总大小
(3)空行
(4)响应体:服务器返回的数据

8. 响应码

1xx
响应中——表示请求已经接受,继续处理
消息:一般是告诉客户端请求已经收到了,正在处理,别急
2xx
成功——表示请求已经被成功接收、理解、接受。
处理成功:一般表示请求收悉、我明白你要的、请求已受理、已经处理完成等信息
3xx
重定向——要完成请求必须进行更进一步的操作
重定向到其它地方:它让客户端再发起一个请求以完成整个处理。
4xx
客户端错误——请求有语法错误或请求无法实现
处理发生错误,责任在客户端:如客户端的请求一个不存在的资源,客户端未被授权,禁止访问等。
5xx
服务器端错误——服务器未能实现合法的请求。
处理发生错误,责任在服务端:如服务端抛出异常,路由出错,HTTP版本不支持等
200
OK //客户端请求成功,即处理成功,这是我们最希望看到的结果

303 Other //我把你redirect到其它的页面,目标的URL通过响应报文头的Location告诉你。
304 Not Modified //告诉客户端,你请求的这个资源至你上次取得后,并没有更改,你直接用你本地的缓存吧,
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的URL,找不到页面/页面已经被网站删除了
500 Internal Server Error //服务器发生不可预期的错误,此时应该查查服务端的日志了,肯定抛出了一堆异常
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常

1.文件上传

package com.example.http;

import android.os.Build;
import android.os.Environment;
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.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class MainActivity extends AppCompatActivity {
    private Button upLoad;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        upLoad = findViewById(R.id.upLoad);
    }
    public void click(View view) {
        new Thread(){
            @Override
            public void run() {
                super.run();
                if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){
                    myLoad();
                }
            }
        }.start();
    }
    private void myLoad() {
        String start="--";//起始
        String bound="****"+ System.currentTimeMillis();//分割
        String end="\r\n";//结束
        //在根目录  mnt/shell/sdcard
        String filename= Environment.getExternalStorageDirectory()+"/http.txt";
        Log.i("TAG", "myLoad: "+filename);
        try {
            URL url=new URL("http://192.168.43.79/service/");
            HttpURLConnection connection= (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("POST");
            connection.setDoOutput(true);
            connection.setDoInput(true);

            //设置请求头
            connection.setRequestProperty("Connection","keep-alive");//保持长连接
            connection.setRequestProperty("Content-Type","multipart/form-data:boundary="+bound);
            DataOutputStream outputStream=new DataOutputStream(connection.getOutputStream());
//        outputStream outputStream1=connection.getOutputStream();

            //设置请求体
            StringBuffer stringBuffer=new StringBuffer();
            stringBuffer.append(start+bound+end);//第一行
            stringBuffer.append("Context-Disposition:form-data:name=\"file\":filename=\""+filename+"\""+end);//文件地址
            stringBuffer.append("Content-Type:multipart/form-data"+end);
            stringBuffer.append(end);//空行

            outputStream.write(stringBuffer.toString().getBytes());
            //写内容
            FileInputStream fileInputStream=new FileInputStream(new File(filename));//指定对象来读哪文件
            getAssets();
            int len=0;
            byte[] bytes=new byte[1024];
            while ((len=fileInputStream.read(bytes))!=-1){
               outputStream.write(new String(bytes,0,len).getBytes());
            }
            outputStream.write(end.getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

2. 断点下载

package com.example.duandian;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.Toast;
import com.example.duandian.R;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
public class MainActivity extends AppCompatActivity {

    private ProgressBar pro;
    private Button start;
    private Button pause;
    private int endNum=2061223;

    private static final String TAG = "哒哒哒";
    private Handler handler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (msg.what==100) {
                Toast.makeText(MainActivity.this, "下载成功", Toast.LENGTH_SHORT).show();
            }else if(msg.what==101){
                pro.setMax(msg.arg1);
            }else if(msg.what==102){
                pro.setProgress(msg.arg1);
            }
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        pro = (ProgressBar) findViewById(R.id.progress);
        start = (Button) findViewById(R.id.start);
        pause = (Button) findViewById(R.id.pause);

        start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getMp4("http://uvideo.spriteapp.cn/video/2019/0512/56488d0a-7465-11e9-b91b-1866daeb0df1_wpd.mp4");
            }
        });

    }
    public void getMp4(final String pathUrl){
        new Thread(){
            @Override
            public void run() {
                super.run();
//                Log.i(TAG, "run: 1111111111111111111111111");
//                getLength(pathUrl);
                Log.i(TAG, "run: 222222222222222222");
                downLoad(pathUrl);
            }
        }.start();
    }
    public void getLength(String url){
        URL url1=null;
        try {
            url1=new URL(url);
            HttpURLConnection connection = (HttpURLConnection) url1.openConnection();
            if (connection.getResponseCode()==200) {
                endNum=connection.getContentLength();
                Log.i(TAG, "getLength: "+endNum);
                Message message = new Message();
                message.what=101;
                message.arg1=endNum;
                handler.sendMessage(message);
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public void downLoad(String url){
        int start=0;//开始
        int sum=0;//累积长度
        try {
            URL url1 = new URL(url);
            HttpURLConnection connection = (HttpURLConnection) url1.openConnection();
            connection.setRequestMethod("GET");
            connection.setRequestProperty("Range","bytes="+start+"-"+endNum);//0-1024   下载的范围
            if (connection.getResponseCode()==206) {//断点下载的OK响应码   普通的下载是200
                InputStream inputStream = connection.getInputStream();
                int len=0;
                byte[] bytes = new byte[10];
                String filePath= Environment.getExternalStorageDirectory()+"/a1705.mp4";
                RandomAccessFile file = new RandomAccessFile(filePath,"rw");
                file.seek(start);//0
                while ((len = inputStream.read(bytes)) != -1) {
                    file.write(bytes,0,len);
                    sum+=len;
                    Thread.sleep(1000);
                    Message message = new Message();
                    message.what=102;
                    message.arg1=sum;
                    handler.sendMessage(message);
                    if (sum==endNum) {
                        handler.sendEmptyMessage(100);
                    }
                }
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值