zoukankan      html  css  js  c++  java
  • 3.HTTP协议详解

    ### Web核心+HTTP协议
    准备工作:XAMPP+PhpWindd+Aglieone
    HTTP协议简介
    HTTP请求
    最常用请求
    GET请求获取URL所标识的资源
    POST请求在URL所标识的资源后附加新的数据
    请求参数所代表的意义
    content-Length内容大小
    content-Type内容类型
    Server服务器类型
    等等
    不常用请求
    HEAD请求获取由Request-URL所标识的资源的响应消息报头
    OPTIONS请求查询服务器的性能,或查询与资源相关的选项和需求
    PUT请求服务器存储一个资源,并用URL作为其标识
    DELETE请求服务器删除由URL所标识的资源
    TRACE请求服务器回送收到的请求信息,主要用于测试或诊断
    HTTP响应
    HTTP
    网络协议版本
    Server
    服务器版本
    Data
    服务器处理页面的时间,格林威治时间+8小时=北京时间
    content-Type
    告诉服务器传输数据类型
    transfer-encoding
    数据分块传输,响应后需要拼接
    X-UA-compatible
    浏览器的兼容性
    HTTP字段含义较多,不一一总结了
    学习方法
    善于结合工具进行分析
    字段的理解,归纳常用字段信息
    HTTP-Session
    无状态的缺失
    Session ID
    一个回话的ID号,用来唯一标识客户端
    比如进行登录时就需要对session进行保存
    键值对
    保存在服务器端
    清除catch和cooki信息
    cookie的作用域
    HTTP-Cookie
    键值对形式
    保存在客户端
    比如使用cookie保存用户登录时长
    实战:Fiddler协议监控工具使用
    暴力破解
    重编译url
    实战:HTTPWatch协议分析
    实战:RestClient手动发送请求
    实战:论坛自动灌水-Java
    测试类型
    业务
    场景
    技术
    梳理思路
    GET,POST,Session,Cookie
    如何与论坛发帖关联起来
    1.GET,POST请求如何发送
    get请求
    创建一个get请求方法
    1.建立连接
    HttpURLConnection对象
    URL对象
    将URL对象转换为HttpURLConnection对象
    2. 设置请求参数
    urlConnection.setConnectTimeout(5000);
    3. 获取响应内容
    bf = new BuffereReader(new ImputStreamReader(urlConnection.getInputStream(),"UTF-8"))
    String line = bf.readLine();
    4. 在main函数中调用该方法
    post请求
    多了一个给服务器发送的正文
    创建一个写文件的标准对象,获取getOutputStream输出流
    pw = new PrintWriter(urlConnection.getOutputStream());
    传送给服务器的参数,即post的正文
    pw.print(paramValue);
    pw.flush();
    2.JAVA如何维护Session
    想办法获取到变量和值
    在响应的内容进行查找cookie
    将用Java代码获取到的cookie信息发给服务器
    Java的字符串处理操作
     
     
    代码编写请求流程总结
    get请求
    1、导入相关的包或库
    2、创建一个对象来存放信息
    3、建立url连接,发送请求
    4、获取服务器返回的数据
    5、对获取到的数据进行处理:比如验证是否符合预期值
     
    post请求
    1、导入相关的包或库
    2、创建一个对象来存放信息
    3、建立url连接,发送请求,多了头信息和一些必要的参数值比如cookie,用户名或id之类
    4、获取服务器返回的数据
    5、对获取到的数据进行处理:比如验证是否符合预期值
     
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.*; // 跟网络相关的包都在Java.net下
    import java.util.List;
    import java.util.Map;
     
    public class JavaHTTPHandle {
     
    private String globalCookie = "";
     
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    JavaHTTPHandle jhh = new JavaHTTPHandle(); // 实例化类JavaHTTPHandle
    // jhh.sendGet("http://www.baidu.com",""); // 调用自定义的sendGet方法
    jhh.sendPost("https://cloud.ravvar.cn/account/login/username", "username=darseek1&password=123456","");
    jhh.sendPost("https://cloud.ravvar.cn/account/login/username", "username=darseek1&password=123456",jhh.globalCookie);
    }
     
    public void sendGet(String urlAddress,String cookieValue) {// 第一步创建一个get请求
     
    try {
    // 建立连接并发送请求
    HttpURLConnection urlConnection = null; // 实例化对象
    URL url = new URL(urlAddress); // 实例化对象,打开URL地址;用字符串参数的形式进行传递
    // URL与HttpURLConnection的类型不一致,在转换的时候需要强制转换,将URL父对象转换为HttpURLConnection子对象。
    urlConnection = (HttpURLConnection)url.openConnection(); // 建立了链接并且访问了url地址
    // 设置请求里的发送参数
    urlConnection.setConnectTimeout(5000);
    urlConnection.setReadTimeout(5000);
    urlConnection.setUseCaches(false);
    // urlConnection.setRequestProperty("cookie", "x=y"); //设置cookie请求值
    urlConnection.connect(); // 将get请求发送给服务器
     
    // 获取响应内容,可选项;从输入流InputStreamReader里面读取响应内容urlConnection.getInputStream(),读取后放到缓冲区
    BufferedReader bf = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(),"UTF-8"));
     
    // 将缓冲区内容一行行输出出来
    String line = bf.readLine(); // 读取第一行内容
    while (line !=null) { // 循环到一行中没有内容时停止
    System.out.println(line);
    line = bf.readLine(); // 循环一次读一行
    }
     
    } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
     
     
    }
     
    public void sendPost(String urlAddress,String paramValue,String cookieValue) {
    try {
    // 建立连接并发送请求
    HttpURLConnection urlConnection = null; // 实例化对象
    URL url = new URL(urlAddress); // 实例化对象,打开URL地址;用字符串参数的形式进行传递
    // URL与HttpURLConnection的类型不一致,在转换的时候需要强制转换,将URL父对象转换为HttpURLConnection子对象。
    urlConnection = (HttpURLConnection)url.openConnection(); // 建立了链接并且访问了url地址
    // 设置请求里的发送参数
    urlConnection.setConnectTimeout(5000);
    urlConnection.setReadTimeout(5000);
    urlConnection.setDoOutput(true); // 接受输出
    urlConnection.setUseCaches(false);
    urlConnection.setRequestProperty("Cookie", cookieValue);
    urlConnection.connect(); // 将get请求发送给服务器
     
    // 创建一个写文件的标准对象,获取getOutputStream输出流
    PrintWriter pw = new PrintWriter(urlConnection.getOutputStream());
    pw.print(paramValue); // 传送给服务器的参数,即post的正文,比如用户名和密码
    pw.flush();
     
    // 获取响应内容,可选项;从输入流InputStreamReader里面读取响应内容urlConnection.getInputStream(),读取后放到缓冲区
    BufferedReader bf = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(),"UTF-8"));
    // 将缓冲区内容一行行输出出来
    String line = bf.readLine(); // 读取第一行内容
    while (line !=null) { // 循环到一行中没有内容时停止
    System.out.println(line);
    line = bf.readLine(); // 循环一次读一行
    }
     
    // urlConnection.getHeaderField("Set-Cookie") // 获取响应头中Set-Cookie对应的值
    Map<String,List<String>> map = urlConnection.getHeaderFields(); // 获取所有响应头里的信息
    List list = (List)map.get("Set-Cookie"); // 取出Set-Cookie相关的信息
    for (int i=0;i<list.size();i++) { // 取出list中的所有行
    // 从每一行中获取关键字
    String temp = list.get(i).toString(); // 定义一个变量
    String value[] = temp.split(";"); // 定义一个数组,使用分号进行分割
    this.globalCookie += value[0] + ";"; // 定义一个全局变量来存放数组中获取到的第一个字段,并进行拼装
    System.out.println(globalCookie);
     
    }
     
    } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    }
  • 相关阅读:
    【leetcode_easy_greedy】1403. Minimum Subsequence in Non-Increasing Order
    【leetcode_easy_sort】1030. Matrix Cells in Distance Order
    word2010 标题编号
    WORD2013中如何使用多级列表自动编号(转)
    Javaweb权限管理设计思路 (转)
    前后端分离模式下的权限设计方案 (转)
    Axure rp8.1.0.3381 3382 激活码(2019-07-26 亲测可用) 转
    通达OA开发网址
    C# Winform 跨线程更新UI控件常用方法汇总 (转)
    C#中的Invoke
  • 原文地址:https://www.cnblogs.com/TomBombadil/p/10969501.html
Copyright © 2011-2022 走看看