利用接口请求获取文件

2023-11-20

1、背景

测试阶段文件上传服务器为测试文件服务器,预览时根据id获取的测试服务器文件。

但发到线上后发现文件上传到了测试服务器,读取文件时又是从线上的文件服务器读取的。因此导致了文件显示异常。

2、数据恢复分析

先从测试环境获取到文件(这些文件实际为关键用户所上传的文件)

(1)后端开发连接备份库,查询到所有相关的日报记录对应的文件id;

(2)通过文件id拼接url下载文件,这里有两种思路

  • 通过拼接url,利用浏览器访问接口,浏览器响应为图片文件通过selenium将图片文件保存下来;
  • 通过拼接url,跑接口将接口响应的文件流转成文件保存下来;

          因为第一种形式一致需要占用浏览器,这里采用了第二种形式;

(3)将文件上传到生产环境

(4)更新生产环境对应的文件id

3、脚本编码

(1)依赖框架testNG,httpclient

<dependencies>
    <dependency>
         <groupId>org.testng</groupId>
         <artifactId>testng</artifactId>
         <version>7.0.0</version>
    </dependency>
    <dependency>
         <groupId>org.apache.httpcomponents</groupId>
         <artifactId>httpclient</artifactId>
         <version>4.5.13</version>
    </dependency>
</dependencies>

(2)接口分析

如图所示,在直接请求实际在请求时做了两次重定向

第一次重定向,c3951a59182e2bce26df70ce9dbc480ce5e01f75 是个随机字符串,因此无法得到准确的图片路径 

利用postman请求接口响应为图片

这里其实不用太多的关注请求时重定向了多少次,最终都会获取到最终的响应结果。

(3)编码

第一步,建立config.properties配置文件,用于维护请求域名

host = http://localhost

第二步,写一个Common类,用于管理接口请求

package org.example.common;
 
import com.alibaba.fastjson.JSONObject;
import org.apache.http.*;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
 
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Locale;
import java.util.ResourceBundle;
 
/**
 * @description 管理请求方式
 */
public class Common {
    private static ResourceBundle bundle;
    private static HttpClient httpClient = new DefaultHttpClient();
 
    public static String getHost(){
        bundle = ResourceBundle.getBundle("config", Locale.CHINA);
        return  bundle.getString("host");
    }
 
    /**
     * @description Post请求调用
     * @param uri
     * @param param
     * @return
     */
    public static String doPost(String uri,String param){
        HttpPost post = new HttpPost(uri);
        JSONObject jsonObject = JSONObject.parseObject(param);
        StringEntity entity = new StringEntity(jsonObject.toString(), "utf-8");
        entity.setContentEncoding("UTF-8");
        entity.setContentType("application/json");
        post.setEntity(entity);
        try {
            HttpResponse response = httpClient.execute(post);
            String result = EntityUtils.toString(response.getEntity(), "UTF-8");
            System.out.println(result);
            return result;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    } 
 
    /**
     * @return 下载文件
     */
    public static String doGet(String uri,String path){
        HttpGet get = new HttpGet(uri);
        String filename = null;
        try {
            HttpResponse response = httpClient.execute(get);
            // 获取文件名称
            Header[] allHeaders = response.getAllHeaders();
            for(Header header: allHeaders){
                if (header.getValue().toString().contains("filename")){
                    String[] split = header.getValue().split("\"");
                    filename = split[1];
                }
            }
            // 将文件流转成文件并保存
            HttpEntity entity = response.getEntity();
            InputStream in = entity.getContent();
            File file = new File(path + filename);
            FileOutputStream fout = new FileOutputStream(file);
            int l = -1;
            byte[] tmp = new byte[1024];
            while ((l = in.read(tmp)) != -1) {
                fout.write(tmp, 0, l);
            }
            fout.flush();
            fout.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

第三步,写一个类当传GET就调用get请求,传POST就调用post请求

package org.example.utils;
 
import org.example.common.Common;
import java.lang.reflect.Method;
 
public class RequestMethod {
    /**
     * @param request
     * @return
     * @description 根据输入的请求方式选择调用的是get还是post方法
     */
    public static Method getRequest(String request) {
        Class clazz = Common.class;
        Method[] methods = clazz.getDeclaredMethods();
        for(Method method : methods){
            if (method.getName().contains(request)){
                return method;
            }
        }
        return null;
    }
}

第四步,调用方法

package org.example.test;
 
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
import org.example.common.Common;
import org.example.utils.RequestMethod;
import org.testng.Assert;
import org.testng.annotations.Test;
import java.io.*;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
 
public class Picture {
 
    String host = Common.getHost();
    String uri = null;
    String param = null;
 
    /**
     * @description 读取文件中所需要的数据,如上图中的文件id
     */
    public static List readExcel(){
        String path = "C:\\Users\\Administrator\\Downloads\\dates.xls";
        List<String> list = new ArrayList();
        InputStream inputStream = null;
        try {
            inputStream = new FileInputStream(path);
            Workbook workbook = Workbook.getWorkbook(inputStream);
            Sheet sheet = workbook.getSheet(0);
            Cell[] column = sheet.getColumn(6);
            for (Cell cell:column){
                list.add(cell.getContents().toString());
            }
            return list;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (BiffException e) {
            e.printStackTrace();
        }
        return null;
    }
 
    @Test
    public void login() {
        try {
            uri = host + "/login";
            param = "{'username':'username','password':'password'}";
            Method post = RequestMethod.getRequest("Post");
            String result = (String) post.invoke(Common.class, uri, param);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        Assert.assertNotEquals("code","200");
    }
 
    /**
     * 这里需要登录后才能请求
     */
    @Test(dependsOnMethods = {"login"})
    public void getPicture(){
        try {
            // 原url
            String url = host+"/file/preview?fileId=";
            // 文件路径
            String path = "C:\\Users\\Administrator\\Desktop\\download2\\";
            // 获取所有id
            List<String> list = readExcel();
            for (String file_id: list){
                String current_url = url + file_id;
                // 下载文件
                Method get = RequestMethod.getRequest("Get");
                // 利用文件id+原文件名重新对文件命名
                get.invoke(Common.class, current_url, path+file_id+"_");
                Thread.sleep(3000);
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

利用接口请求获取文件 的相关文章

随机推荐

  • Wireshark抓包及DNS报文分析

    Wireshark抓包及DNS报文分析 来来来 点我进行5分钟视频学习 冲冲冲 一 抓包整体描述 第一行 帧Frame 2 指的是要发送的数据块 其中 所抓帧的序号为2 捕获字节数等于传送字节数 696字节 第二行 以太网 有线局域网技术
  • java正则表达式的语法详解及常用方法

    一 实例 今天在实现一个功能时遇到了这样一个问题 及接口传过来一个字符串 我需要判断它是一个区间还是一段文字并对其做分别处理 这里面的问题就在于我怎么去判断区间 按照数学规律区间可分为以下几种情况 M M N N N M N M N N N
  • 计算机网络重点知识(期末考研复习)

    点个关注 更多精彩持续更新为考研和期末助力 一起加油 计算机网络 第一章 思维导图 概述 计算机网络的主要性能指标 计算机网络的体系结构 OSI RM模型 TCP IP 两种模型对比 第二章 思维导图 数据通信主要指标与信道极限容量 多路通
  • java8新特性学习笔记

    使用lambda表达式排序 Collections sort temp String a String b gt return b compareTo a Collections sort temp String a String b gt
  • Camera2拍照时部分机型非常暗

    一 问题描述 1 部分手机在弱光环境下不管什么分辨率 预览和拍出来的照片都非常的暗 2 部分手机在弱光环境下 预览分辨率1920x1080 输出图片分辨率1920x1080时 预览和拍出来的照片亮度比较亮 但是在预览分辨率1920x1080
  • 重现U盘文件

    U盘中毒了 查毒后发现U盘空间还在 但是就是无法查看里面的文件 在 工具 gt 文件夹选项 中设置成 显示系统文件夹中的内容 去掉 隐藏受保护的操作系统文件 推荐 以及设置成 显示所有文件和文件夹 也不能正常显示 最近遇到很多优盘中的文件夹
  • 图像特征提取技术

    目 录 前 言 基于颜色的特征提取 1 颜色空间 2 直方图以及特征提取 基于纹理的特征提取 1 灰度共生矩阵 2 tamura纹理 基于深度神经网络的图像处理 前 言 图像特征提取属于图像分析的范畴 是数字图像处理的高级阶段 本文将从理论
  • SeleniumLibrary4.5.0 关键字详解(三)

    SeleniumLibrary4 5 0 关键字详解 三 库版本 4 5 0 库范围 全局 命名参数 受支持 简介 SeleniumLibrary是Robot Framework的Web测试库 本文档说明了如何使用SeleniumLibra
  • 获取对象Object的长度

    获取对象的长度 obj id 1 id2 1 id3 1 id4 1 id5 1 id6 1 id7 1 id8 1 id9 1 id10 1 let i Object keys this obj length console log i
  • 嵌入式linux 搭建L2TP+IPSEC客户端

    搭建L2TP IPSEC客户端需要对应的源码 xl2tpd 1 3 10和openswan 还需要一些依赖的库 gmp libpcap 一 安装openswan 安装依赖库gmp 6 1 2 1 下载 https gmplib org DO
  • C#操作SqlServer数据库,以及其常用的对象

    C 操作SQL Server数据库 1 概述 ado net提供了丰富的数据库操作 这些操作可以分为三个步骤 第一 使用SqlConnection对象连接数据库 第二 建立SqlCommand对象 负责SQL语句的执行和存储过程的调用 第三
  • 服务器备案问题解决思考?

    大家和我一样有没有在项目上线之后遇到服务器需要备案的问题呢 遇到这个问题的原因 域名没有备案 可是我发现我域名本案后还是无法通过域名直接解析到服务器80端口 所以我百度后发现 服务器竟然也要备案 而且备案步骤 手续与域名备案相比是真的麻烦
  • Docker搭建mysql主从

    目录 1 安装配置master 1 1 运行mysql容器 1 2 更新基础软件和安装vim 1 3 编辑配置文件 1 4 创建用户并授权 用于再主从库之间同步数据 2 slave数据库安装配置 2 1 运行容器 2 2 进入容器内部 2
  • JavaWeb的高级、Listener监听器--Servlet事件

    一 学习目标 1 Listener监听器 2 Listener监听器作用 3 Listener监听器的创建与销毁 二 重点知识 1 Listener监听器 Filter和Listener是Servlet规范中的两个高级特性 不同于Servl
  • vue项目打包后如何本都部署访问

    npm run build生成dist项目后 在windows部署访问 方式一 1 新建一个文件夹 进入目录后打开cmd 输入npm init y 2 输入 npm i express s 是用于在 Node js 项目中安装 Expres
  • 小程序实现微信登录Java后端(一)--前端实现

    目录 一 概述 二 登录流程 三 前端代码 四 解读前端代码 1 登录部分 2 检查当前用户是否已登录 3 小程序启动时校验登录 五 阶段性小结 一 概述 最近终于有时间去搞一下准备参加比赛的小程序 小程序一开始设计的是使用邮箱登录 老师建
  • 剑指offer——输出数组中k个最小值(快速,冒泡,选择,插入)

    找k个最小值 基本思路是对数组排序 输出前k个或者后k个 我们回顾一下之前的学习过的集中排序方法 快速排序 class Solution def GetLeastNumbers Solution self tinput k def quic
  • rust房屋建造蓝图_妄想山海房子建造攻略

    妄想山海这个游戏的一大特色就是玩家可以在游戏里建造属于自己的房屋 而且这个房屋可不是几个图或是简单的3d模型 而是一个完整的房屋呦 玩家可以创作或是收集来的房屋设计图 真实打造 所以在妄想山海里房子的建造还是要花点功夫的 下面讯喵喵就为大家
  • Redis 分布式缓存

    分布式缓存 单点 Redis 的问题及解决 数据丢失 实现Redis数据持久化 并发能力 搭建主从集群 实现读写分离 存储能力 搭建分片集群 利用插槽机制实现动态扩容 故障恢复能力 利用哨兵机制 实现健康检测和自动恢复 RDB RDB全称R
  • 利用接口请求获取文件

    1 背景 测试阶段文件上传服务器为测试文件服务器 预览时根据id获取的测试服务器文件 但发到线上后发现文件上传到了测试服务器 读取文件时又是从线上的文件服务器读取的 因此导致了文件显示异常 2 数据恢复分析 先从测试环境获取到文件 这些文件