实现一个简单的HTTP

前面我们写过一个简单的HTTP服务器
现在重新写一个版本的服务器,要求如下:
1.对请求和响应做一个封装

  • 可以复用代码
  • 实现代码的解耦
  • 让代码更加的优雅
    2.实现对不同路径的不同响应
  • 如果是/404,则显示没有找到页面
  • 如果是/302,则跳转到指定的页面
  • 如果是/200,则显示正常页面

当创建了一个HTTP服务器之后,可以拿到两个对象:

  • 一个对象是Reader(读取Request的信息)
  • 一个对象是Writer(返回响应的信息)

每一步都有详细的注释

Request
import java.io.BufferedReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * 需求:
 *  1. 如果是/404,则显示没有找到页面
 *  2. 如果是/302,则跳转到指定的页面,如跳转到百度
 *  3. 如果是/200,则显示正常页面
 */
public class myHttpRequest {
   
    //1.首行信息【方法+URL+版本号】,然后对首行信息进行封装
    //方法
    private String method;
    //url
    private String url;
    //版本号
    private String version;
    //2.获取URL里面的参数,因为url里面的参数可能有多个,而且是以key-value的形式,所以使用map
    Map<String,String> parments = new HashMap<>();

    //3.获取header信息
    Map<String,String> requsetHeader = new HashMap<>();

    //4.空行

    //5.body(暂不考虑)

    //初始化内容,想要读取request的信息,就需要借助BufferedReader
    public void init(BufferedReader reader) throws IOException {
   
        //首先读取到首行信息
        String firstLine = reader.readLine();
        //因为首行信息是按照“ ”(空格)进行分隔的,所以我们就按照空格进行分隔
        String[] firstLineArr = firstLine.split(" ");
        //然后对首行信息里面的方法进行初始化
        this.method = firstLineArr[0];
        //初始化URL
        this.url = firstLineArr[1];
        //初始化版本号
        this.version = firstLineArr[2];


        //读取URL里面的参数
        //url如:http://182.254.116.116/d?dn=6ea62b48a6cc721df07b8f9b03956ad7&id=2046&ttl=1
        //我们可以看到从?以后他都是以“&”进行分隔的一个个key=value的对象,也就是/s?key1=val1&key2=val2……
        //创建一个方法去读取URL里面的参数,方法里面的参数是把整个URL传进去
        processURL(this.url);

        //读取请求头
        //因为它的内容不止一条,所以要使用while循环
        //定义一个字符串,来存放每次读取的每一行数据
        String line;
        //因为header的结束是一个空行,所以当读取的数据不为空,并且它的长度大于0,说明数据没有读取完,那么就可以一直读取header的数据
        while ((line = reader.readLine()) != null && line.length() > 0){
   
            //每一个的数据都是key: val(冒号+空格)的形式分隔
            //然后header的每一行数据都是按照“: ”(冒号+空格的方式),那么我们就按照(冒号+空格)的方式分隔读取到的每一行
            String[] lineArr = line.split(": ");
            //然后将获取到的数据存储在我们申请的map中,也就是requestHeader中
            requsetHeader.put(lineArr[0
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值