精华内容
下载资源
问答
  • 文章目录Step 1: 定义axios方法的响应格式Step 2: 定义axios的请求方法类型Step 3: 创建axios实例Step 4: 使用方式:强类型限制data返回值类型 Step 1: 定义axios方法的响应格式 新建一个文件,如:shims-custom.d....

    Step 1: 定义axios方法的响应格式

    新建一个文件,如:shims-custom.d.ts,任意的*.d.ts都可以。重新声明axios模块:

    import * as axios from 'axios';
    
    declare module 'axios' {
        // 定制业务相关的网络请求响应格式, T 是具体的接口返回类型数据
        export interface CustomSuccessData<T> {
            code: number;
            msg?: string;
            message?: string;
            data?: T;
            [keys: string]: any;
        }
    }
    

    Step 2: 定义axios的请求方法类型

    新建一个type.ts,以get的方法为例,定义一个方法的接口泛型:
    –关于泛型接口,链接: 泛型接口

    import {AxiosResponse, AxiosRequestConfig, CustomSuccessData} from 'axios';
    
    // 泛型接口 
    export interface Get {
        <T>(url: string, params?: object, config?: AxiosRequestConfig): Promise<CustomSuccessData<T>>;
    }
    

    –引入的CustomSuccessData为上文Step 1中的重新声明axios时定制的接口。

    Step 3: 创建axios实例

    这部分直接写下 局部的get方法,其他同理:

    import axios, {AxiosResponse, AxiosRequestConfig} from 'axios';
    // Step 2 中的接口泛型
    import {Get} from './types';
    
    // 创建axios的实例
    const service = axios.create({
        timeout: 10000 // 超时时间
    });
    // 封装 get 方法,类型为Get
    const get: Get = async (url, params, config) => {
        const response = await service.get(url, {params, ...config});
        return response.data;
    };
    
    // 使用 request 统一调用,包括封装的get、post、put、delete等方法
    const request = {get};
    
    // 导出至外层utils文件夹的index.ts,方便统一使用utils
    export {request};
    

    Step 4: 使用方式:强类型限制data返回值类型

    eg: 使用get方法请求数据,限制返回的data的类型为string:

    // 引入utils
    import {request} from '@/utils';
    
    async handelFecthData() {
    	const {data, code} = await request.get<string>('/mock/test.json');
        // console.log(data);  // => test,我是字符串格式的。
        // console.log(code);  // => 0
    }
    

    模拟一组get请求的test.json数据:

    {
        "code": 0,
        "message": "success",
        "data": "test,我是字符串格式的。"
    }
    

    Note That:
    本文在step 4中使用的 async & await。当然也可以使用axios中回调Promise的.then().then()…的语法。
    推荐使用 async & await,至于和promise的区别,请参考这篇文章:
    promise与async和await的区别

    展开全文
  • 文章目录报文结构HTTP 请求报文的请求行请求方法GET/HEADPOST/PUT其他方法URIURI 的格式URI 的编码HTTP 响应报文的状态行状态码HTTP 请求、响应头部字段 HTTP 协议再规范文档里详细定义了报文的格式,规定了组成部分...


    HTTP 协议再规范文档里详细定义了报文的格式,规定了组成部分,解析规则,还有处理策略,所以可以在 TCP/IP 层之上实现丰富灵活的功能,例如连接控制、缓存管理、数据编码、内容协商

    报文结构

    HTTP 协议是一个”纯文本“的协议,在实际传输的数据前要附加一些头数据,不过头数据都是ASCII码的文本,可以很容易地用肉眼阅读,不用借助程序解析也能够看懂

    HTTP协议的请求报文和响应报文的结构基本相同,由三大部分组成:

    • 起始行(start line)描述请求或响应的基本信息
    • 头部字段集合(header)使用 key-value 形式更详细说明报文
    • 消息正文(entity)实际传输的数据,不一定是纯文本,可以是图片、视频等二进制数据

    其中前两部分起始行和头部字段经常合称为”请求头“或”响应头“,消息正文又称为”实体“,但与”header“对应,很多时候就直接称为”body“

    HTTP协议规定报文必须有header,但可以没有body,而且在header之后必须要有一个“空行”,也就是“CRLF”,十六机制的“0D0A”

    所以,一个完整的HTTP报文就像下图的这样,注意在header和body之间有一个“空行”
    在这里插入图片描述
    接下来看上一篇提到的获取的 GET 请求报文信息
    在这里插入图片描述
    在这个浏览器发出的请求报文里,第一行“GET / HTTP/1.1”就是请求行,而后面的“Host”“Connection”等等都属于header,报文的最后是一个空白行结束,没有body

    其实浏览器发送GET请求的时HTTP报文经常是只有header而没body。,虽然HTTP协议对header的大小没有做限制,但各个Web服务器都不允许过大的请求头,因为头部太大可能会占用大量的服务器资源,影响运行效率

    HTTP 请求报文的请求行

    请求报文里的起始行也就是请求行(request line),简要描述了客户端想要如何操作服务器端的资源

    请求行由三部分构成:

    • 请求方法:是一个动词,如GET/POST,表示对资源的操作
    • 请求目标:通常是一个URI,标记了请求方法要操作的资源
    • 版本号:表示报文使用的HTTP协议版本

    这三个部分通常使用空格(space)来分隔,最后要用CRLF换行表示结束
    在这里插入图片描述
    还是用Wireshark抓包的数据来举例:

    GET / HTTP/1.1
    

    在这个请求行里,“GET”是请求方法,“/”是请求标,“HTTP/1.1”是版本号,把这三部分连起来,意思就是“服务器你好,我想获取网站根目录下的默认文件,我用的协议版本号是1.1

    请求方法

    蒂姆·伯纳斯-李最初设想的是要用HTTP协议构建一个超链接文档系统,使用URI来定位这些文档,也就是资源。那么,该怎么在协议里操作这些资源呢?

    所以,就出现了“请求方法”。实际含义就是客户端发出了一个“动作指令”,要求服务器端对URI定位的资源执行这个动作

    HTTP/1.1规定了八种方法,单词都必须是大写的形式:

    • GET:获取资源,可理解为读取或下载数据
    • HEAD:获取资源的元信息
    • POST:向资源提交数据,相当于写入或上传数据
    • PUT:类似 POST
    • DELETE:删除资源
    • CONNECT:建立特殊的连接隧道
    • OPTIONS:列出可对资源实行的方法
    • TRACE:追踪请求-响应的传输路径

    在这里插入图片描述
    有点像对文件或数据库的“增删改查”操作,只不过这些动作操作的目标不是本地资源,而是远程服务器上的资源,所以只能由客户端“请求”或者“指示”服务器来完成

    既然请求方法是一个“指示”,那么客户端自然就没有决定权,服务器掌控着所有资源,也就有绝对的决策权力。它收到HTTP请求报文后,看到里面的请求方法,可以执行也可以拒绝,或者改变动作的含义,毕竟HTTP是一个“协议”,两边都要“商量着来”

    比如,发起了一个GET请求,想获取“/orders”这个文件,但这个文件保密级别比较高,不是谁都能看的,服务器就可以有如下的几种响应方式:

    • 假装这个文件不存在,直接返回一个404 Not found报文
    • 稍微友好一点,明确告诉你有这个文件,但不允许访问,返回一个403 Forbidden
    • 再宽松一些,返回405 Method Not Allowed,然后用Allow头告诉你可以用HEAD方法获取文件的元信息

    举几个个比较常用的方法说明:

    GET/HEAD

    请求从服务器获取资源,这个资源既可以是静态的文本、页面、图片、视频,也可以是由PHP、Java动态生成的页面或者其他格式的数据

    GET方法虽然基本动作比较简单,但搭配URI和其他头字段就能实现对资源更精细操作,例如,在URI后使用“#”,可以在获取页面后直接定位到某个标签所在的位置;使用If-Modified-Since字段就变成了“有条件的请求”,仅当资源被修改时才会执行获取动作;使用Range字段就是“范围请求”,只获取资源的一部分数据

    HEAD方法与GET方法类似,也是请求从服务器获取资源,服务器的处理机制也是一样的,但服务器不会返回请求的实体数据,只传回响应头,就是资源的“元信息”。可以看做是GET方法的一个“简化版”或者“轻量版”。因为它的响应头与GET完全相同,所以可以用在很多并不真正需要资源的场合,避免传输body数据的浪费

    比如,想要检查一个文件是否存在,只要发个HEAD请求就可以了,没有必要用GET把整个文件都取下来。

    再比如,要检查文件是否有最新版本,同样也应该用HEAD,服务器会在响应头里把文件的修改时间传回来

    POST/PUT

    GET和HEAD方法是从服务器获取数据,而POST和PUT方法则是相反操作,向URI指定的资源提交数据,数据就放在报文的body里

    比如,上论坛灌水,敲了一堆字后点击“发帖”按钮,浏览器就执行了一次POST请求,把你的文字放进报文的body里,然后拼好POST请求头,通过TCP协议发给服务器。

    又比如,上购物网站,看到了一件心仪的商品,点击“加入购物车”,这时也会有POST请求,浏览器会把商品ID发给服务器,服务器再把ID写入你的购物车相关的数据库记录

    PUT的作用与POST类似,也可以向服务器提交数据,但与POST存在微妙的不同,通常POST表示的是“新建”“create”的含义,而PUT则是“修改”“update”的含义

    在实际应用中,PUT用到的比较少。而且,因为它与POST的语义、功能太过近似,有的服务器甚至就直接禁止使用PUT方法,只用POST方法上传数据

    其他方法

    DELETE方法指示服务器删除资源,因为这个动作危险性太大,所以通常服务器不会执行真正的删除操作,而是对资源做一个删除标记。当然,更多的时候服务器就直接不处理DELETE请求

    CONNECT是一个比较特殊的方法,要求服务器为客户端和另一台远程服务器建立一条特殊的连接隧道,这时Web服务器在中间充当了代理的角色

    OPTIONS方法要求服务器列出可对资源实行的操作方法,在响应头的Allow字段里返回。它的功能很有限,用处也不大,有的服务器(例如Nginx)干脆就没有实现对它的支持

    TRACE方法多用于对HTTP链路的测试或诊断,可以显示出请求-响应的传输路径。它的本意是好的,但存在漏洞,会泄漏网站的信息,所以Web服务器通常也是禁止使用

    URI

    URI,也就是统一资源标识符(Uniform Resource Identifier)包含有URL和URN两个部分,在HTTP世界里用的网址实际上是URL,即统一资源定位符(Uniform Resource Locator)。但因为URL实在是太普及了,所以常常把这两者简单地视为相等

    URI 的格式

    URI本质上是一个字符串,这个字符串的作用是唯一地标记资源的位置或者名字,它不仅能够标记万维网的资源,也可以标记其他的,如邮件系统、本地文件系统等任意资源。而“资源”既可以是存在磁盘上的静态文本、页面数据,也可以是由Java、PHP提供的动态服务

    下面的这张图显示了URI最常用的形式,由scheme、host:port、path和query四个部分组成,但有的部分可以视情况省略
    在这里插入图片描述

    • scheme:“协议名”,表示资源应该使用哪种协议访问,浏览器通过你的应用程序看到URI里的scheme,就知道下一步该怎么走了,会调用相应的HTTP或者HTTPS下层API。在scheme之后,必须是三个特定的字符 : / / ,把scheme和后面的部分分开
    • host:port,即主机名加端口号,表示资源所在主机,主机名可以是IP地址或者域名的形式,必须要有,否则浏览器就会找不到服务器。但端口号有时可以省略,浏览器等客户端会依据scheme使用默认的端口号,例如HTTP的默认端口号是80,HTTPS的默认端口号是443
    • Path,有了协议名和主机地址、端口号,再加上后面标记资源所在目录,浏览器就可以连接服务器访问资源。URI里path采用了类似文件系统“目录”“路径”的表示方式,因为早期互联网上的计算机多是UNIX系统,所以采用了UNIX的“/”风格。URI的path部分必须以“/”开始
    http://nginx.org
    协议名 http
    主机名 nginx.org
    端口号省略,对于 http 协议默认 80
    路径部分也被省略,默认就是一个“/”,表示根目录
    	
    http://www.chrono.com:8080/11-1
    主机名 www.chrono.com 
    端口号 8080
    路径是 /11-1
    
    HTTP协议标准文档RFC7230的URI
    https://tools.ietf.org/html/rfc7230
    主机名 tools.ietf.org
    路径是 /html/rfc7230
    
    file:///D:/http_study/www/
    协议名 file,表示这是本地文件
    三个斜杠里的前两个属于URI特殊分隔符 ://
    主机名被省略,file类型URI的“特例”,它允许省略主机名,默认是本机localhost
    路径是 /D:/http_study/www/
    
    但对于HTTP或HTTPS这样的网络通信协议
    主机名是绝对不能省略的,会导致浏览器无法找到服务器
    
    • 查询参数:URI后面还有一个“query”部分,它在path之后,用一个“?”开始,但不包含“?”,表示对资源附加的额外要求。

      查询参数query有一套自己的格式,是多个“key=value”的字符串,这些KV值用字 符“&”连接,浏览器和客户端都可以按照这个格式把长串的查询参数解析成可理解的字典或关联数组形式

      例如:获取商品图片,但想要一个32×32的缩略图版本;获取商品列表,但要按某种规则做分页和排序;跳转页面,但想要标记跳转前的原始页面

    URI的完整格式
    在这里插入图片描述
    第一个多出的部分是协议名之后、主机名之前的身份信息“user:passwd@”,表示登录主机时的用户名和密码,但现在已经不推荐使用这种形式了(RFC7230),因为它把敏感信息以明文形式暴露出来,存在严重的安全隐患

    第二个多出的部分是查询参数后的片段标识符“#fragment”,它是URI所定位的资源内部的一个“锚点”或者说是“标签”,浏览器可以在获取资源后直接跳转到它指示的位置。

    但片段标识符仅能由浏览器这样的客户端使用,服务器是看不到的。也就是说,浏览器永远不会把带“#fragment”的URI发送给服务器,服务器也永远不会用这种方式去处理资源的片段

    URI 的编码

    在URI里只能使用ASCII码。对于ASCII码以外的字符集和特殊字符做一个特殊的操作,把它们转换成与URI语义不冲突的形式。这在RFC规范里称为“escape”和“unescape”,俗称“转义”

    HTTP 响应报文的状态行

    看完了请求行,我们再看响应报文里的起始行,在这里它不叫“响应行”,而是叫“状态行”(status line),意思是服务器响应的状态

    比起请求行来说,状态行要简单一些,同样也是由三部分构成:

    • 版本号:表示报文使用的HTTP协议版本
    • 状态码:三个数字,表示处理的结果,比如200是成功,500是服务器错误
    • 原因:对状态码的一个解释说明

    在这里插入图片描述
    看一下之前 Wireshark 抓包里的响应报文,状态行是:

    HTTP/1.1 200 OK
    

    意思就是:“浏览器你好,我已经处理完了你的请求,这个报文使用的协议版本号是1.1,状态码是200,一切OK。”

    另一个“GET /favicon.ico HTTP/1.1”的响应报文状态行是:

    HTTP/1.1 404 Not Found
    

    意思是:抱歉啊浏览器,刚才你的请求收到了,但我没找到你要的资源,错误代码是404

    状态码

    它是一个十进制数字,表示服务器对请求的处理结果。客户端可以依据代码适时转换处理状态,例如继续发送请求、切换协议,重定向跳转等,有那么点TCP状态转换的意思

    目前RFC标准里规定的状态码是三位数,所以取值范围就是从000到999。RFC标准把状态码分成了五类,用数字的第一位表示分类,而0-99不用,由000-999变成了100~599

    这五类具体含义:

    • 1××:提示信息,表示目前是协议处理的中间状态,还需要后续的操作
    • 2××:成功,报文已经收到并被正确处理
    • 3××:重定向,资源位置发生变动,需要客户端重新发送请求
    • 4××:客户端错误,请求报文有误,服务器无法处理
    • 5××:服务器错误,服务器在处理请求时内部发生了错误

    接下来逐个解释:

    • 1××类状态码属于提示信息,是协议处理的中间状态,实际能够用到的时候少。“101 Switching Protocols”。它的意思是客户端使用Upgrade头字段,要求在HTTP协议的基础上改成其他的协议继续通信,比如WebSocket。而如果服务器也同意变更协议,就会发送状态码101,但这之后的数据传输就不会再使用HTTP了

    • 2××类状态码表示服务器收到并成功处理了客户端的请求,这也是客户端最愿意看到的状态码

      200 OK 是最常见的成功状态码,表示一切正常,服务器如客户端所期望的那样返回了处理结果,如果是非HEAD请求,通常在响应头后都会有body数据

      204 No Content 是另一个很常见的成功状态码,它的含义与“200 OK”基本相同,但响应头后没有body数据。所以对于Web服务器来说

      206 Partial Content 是HTTP分块下载或断点续传的基础,在客户端发送“范围请求”、要求获取资源的部分数据时出现,它与200一样,也是服务器成功处理了请求,但body里的数据不是资源的全部,而是其中的一部分。他还会伴随着头字段“Content-Range”,表示响应报文里body数据的具体范围,供客户端确认,例如“Content-Range: bytes 0-99/2000”,意思是此次获取的是总计2000个字节的前100个字节

    • 3××类状态码表示客户端请求的资源发生了变动,客户端必须用新的URI重新发送请求获取资源,也就是通常所说的“重定向”

      301 Moved Permanently俗称“永久重定向,含义是此次请求的资源已经不存在了,需要改用改用新的URI再次访问

      302 Found “临时重定向,意思是请求的资源还在,但需要暂时用另一个URI来访问

      比如,你的网站升级到了HTTPS,原来的HTTP不打算用了,这就是“永久”的,所以要配置301跳转,把所有的HTTP流量都切换到HTTPS

      再比如,今天夜里网站后台要系统维护,服务暂时不可用,这就属于“临时”的,可以配置成302跳转,把流量临时切换到一个静态通知页面,浏览器看到这个302就知道这只是暂时的情况,不会做缓存优化,第二天还会访问原来的地址

      304 Not Modified 表示资源未修改,用于缓存控制。它不具有通常的跳转含义,但可以理解成“重定向已到缓存的文件”(即“缓存重定向)

      关于 HTTP 重定向和跳转

    • 4××类状态码表示客户端发送的请求报文有误,服务器无法处理

      400 Bad Request 是一个通用的错误码,表示请求报文有错误,但具体是数据格式错误、缺少请求头还是URI超长它没有明确说,只是一个笼统的错误,客户端看到400只会是“一头雾水”“不知所措”。所以,在开发Web应用时应当尽量避免给客户端返回400,而是要用其他更有明确含义的状态码。

      403 Forbidden 实际上不是客户端的请求出错,而是表示服务器禁止访问资源。原因可能多种多样,例如信息敏感、法律禁止等,如果服务器友好一点,可以在body里详细说明拒绝请求的原因,不过现实中通常都是直接给一个“闭门羹”。

      404 Not Found 可能是我们最常看见也是最不愿意看到的一个状态码,它的原意是资源在本服务器上未找到,所以无法提供给客户端。但现在已经被“用滥了”,只要服务器“不高兴”就可以给出个404,而我们也无从得知后面到底是真的未找到,还是有什么别的原因,某种程度上它比403还要令人讨厌。

    • 5××类状态码表示客户端请求报文正确,但服务器在处理时内部发生了错误,无法返回应有的响应数据,是服务器端的“错误码”

      500 Internal Server Error 与400类似,也是一个通用的错误码,服务器究竟发生了什么错误我们是不知道的。不过对于服务器来说这应该算是好事,通常不应该把服务器内部的详细信息,例如出错的函数调用栈告诉外界。虽然不利于调试,但能够防止黑客的窥探或者分析

      501 Not Implemented 表示客户端请求的功能还不支持,这个错误码比500要“温和”一些,和“即将开业,敬请期待”的意思差不多,不过具体什么时候“开业”就不好说

      502 Bad Gateway 通常是服务器作为网关或者代理时返回的错误码,表示服务器自身工作正常,访问后端服务器时发生了错误,但具体的错误原因也是不知道的

      503 Service Unavailable 表示服务器当前很忙,暂时无法响应服务,我们上网时有时候遇到的“网络服务正忙,请稍后重试”的提示信息就是状态码503。是一个“临时”的状态,很可能过几秒钟后服务器就不那么忙了,可以继续提供服务,所以503响应报文里通常还会有一个“Retry-After”字段,指示客户端可以在多久以后再次尝试发送请求

    HTTP 请求、响应头部字段

    请求头和响应头的结构是基本一样的,唯一的区别是起始行

    请求行或状态行再加上头部字段集合就构成了HTTP报文里完整的请求头或响应头,对比两个示意图:

    在这里插入图片描述

    在这里插入图片描述

    头部字段是key-value的形式,key和value之间用 :分隔,最后用CRLF换行表示字段结束。比如在“Host:127.0.0.1”这一行里key就是“Host”,value就是“127.0.0.1”

    HTTP头字段非常灵活,不仅可以使用标准里的Host、Connection等已有头,也可以任意添加自定义头,这就给HTTP协议带来了无限的扩展可能。不过使用头字段需要注意下面几点:

    • 字段名不区分大小写,例如 Host 也可以写成 host ,但首字母大写的可读性更好
    • 字段名里不允许出现空格,可以使用连字符 - ,但不能使用下划线 _ 。例如,test-name是合法的字段名,而 test name 和 test_name是不正确的
    • 字段名后面必须紧接着:不能有空格,而:后的字段值前可以有多个空格
    • 字段的顺序是没有意义的,可以任意排列不影响语义
    • 字段原则上不能重复,除非这个字段本身的语义允许,例如Set-Cookie

    常用头字段

    HTTP协议规定了非常多的头部字段,实现各种各样的功能,但基本上可以分为四大类:

    • 通用字段:在请求头和响应头里都可以出现
    • 请求字段:仅能出现在请求头里,进一步说明请求信息或者额外的附加条件
    • 响应字段:仅能出现在响应头里,补充说明响应报文的信息
    • 实体字段:它实际上属于通用字段,但专门描述body的额外信息

    几个最基本的头字段:

    • Date 通用字段,通常出现在响应头里,表示HTTP报文创建的时间,客户端可以使用这个时间再搭配其他字段决定缓存策略

    • Cache-Control 用于指定缓存指令,缓存指令是单向的(响应中出现的缓存指令在请求中未必会出现),且是独立的(一个消息的缓存指令不会影响另一个消息处理的缓存机制)

    • Host 请求字段 告诉服务器这个请求应该由哪个主机来处理,当一台计算机上托管了多个虚拟主机的时候,服务器端就需要用Host字段来选择,有点像是一个简单的“路由重定向”

      例如在127.0.0.1上有三个虚拟机:www.chrono.com、www.metroid.net 和 origin.io 那么当使用域名的方式访问时,就必须要用Host字段来区分这三个IP相同但域名不同的网站,否则服务器就会找不到合适的虚拟主机,无法处理

    • User-Agent 请求字段,发送请求的浏览器类型、操作系统等信息

    • Accept 请求字段,客户端可识别内容类型列表,用于指定客户端接收哪些类型信息

    • Server 响应字段,只能出现在响应头里。它告诉客户端当前正在提供Web服务的软件名称和版本号,例如“Server: openresty/1.15.8.1”,即使用的是OpenResty 1.15.8.1

      Server字段也不是必须要出现的,因为这会把服务器的一部分信息暴露给外界,如果这个版本恰好存在 bug,那么黑客就有可能利用bug攻陷服务器。所以,有的网站响应头里要么没有这个字段,要么就给出一个完全无关的描述信息

      比如GitHub,它的Server字段里就看不出是使用了Apache还是Nginx,只是显示为“GitHub.com”
      在这里插入图片描述

    • 实体字段 Content-Length,它表示报文里body的长度,也就是请求头或响应头空行后面数据的长度。服务器看到这个字段,就知道了后续有多少数据,可以直接接收。如果没有这个字段,那么body就是不定长的,需要使用chunked方式分段传输

    • 实体字段 Content-Type发送给接收者实体正文媒体类型HTTP COntent-Type 对照表

    • Expires ,实体报头给出响应过期的日期和时间

    展开全文
  • 统一响应json数据格式 现在了很多项目,都是前后端分离的项目,所以了前后端都会约定传输的数据格式,以及响应提醒。 响应json格式 现在应该都是使用的json交互了,应该没有使用xml的吧? 一般了响应json格式是由...

    统一响应json数据格式

    本系列博客是配合Vue开发一套后台管理系统,对应的Vue教程见个人博客

    https://www.charmcode.cn/

    现在了很多项目,都是前后端分离的项目,所以了前后端都会约定传输的数据格式,以及响应提醒。

    响应json格式

    现在应该都是使用的json交互了,应该没有使用xml的吧?
    一般了响应json格式是由以下三个字段组成。

    {
     "code": 200,   // 统一成功状态码 前后端约定 有的是0 有的是20000
     "data": xxx,   // 可以是任意类型数据 有接口文档对接
     "message": "success"  // 消息提示,是状态码的简要补充说明
    }
    

    前端一般都会做个响应拦截处理,如果状态码不是约定成功的状态码就拦截,然后提示message里面的消息,是的话就返回data里面的数据。

    封装响应格式

    我在utils/response_code.py 工具文件夹下,创建了一个response_code.py文件
    专门存放封装的响应数据格式。

    from fastapi import status
    from fastapi.responses import JSONResponse, Response  # , ORJSONResponse
    from typing import Union
    
    # 注意有个 * 号 不是笔误, 意思是调用的时候要指定参数 e.g.resp_200(data=xxxx)
    def resp_200(*, data: Union[list, dict, str]) -> Response:
        return JSONResponse(
            status_code=status.HTTP_200_OK,
            content={
                'code': 200,
                'message': "Success",
                'data': data,
            }
        )
        
    def resp_400(*, data: str = None, message: str="BAD REQUEST") -> Response:
        return JSONResponse(
            status_code=status.HTTP_400_BAD_REQUEST,
            content={
                'code': 400,
                'message': message,
                'data': data,
            }
        )
    
    # 所有响应状态都封装在这里
    xxxx
    
    

    调用

    调用就很简单了, 导入调用就行了。

    from api.utils import response_code
    
    @router.get("/table/list")
    async def get_table_list():
        return response_code.resp_200(data={
        "items":  ["xx", "xx"]
        })
    

    一些补充

    我上面用的序列化的工具方法JSONResponse 是框架自带的,作者还在文档里面补充说明了, 如何调用其他的序列化方法,更快的去序列化json数据。
    ORJSONResponse UJSONResponse 等方法
    这些是要在额外安装依赖库的

    可以参见文档
    https://fastapi.tiangolo.com/advanced/custom-response/#ujsonresponse

    本文GitHub地址

    见个人博客: https://www.charmcode.cn/article/2020-07-16_fastapi_response_json

    展开全文
  • springMVC以附件形式下载PDF文件(解决了下载后文件格式出错无法打开的问题) 公司的上网行为管理系统项目有一个功能模块是统计报表,今天在完成这个功能的过程中碰到一个需求:将服务器上的PDF文件以附件的形式...

    springMVC以附件形式下载PDF文件(解决了下载后文件格式出错无法打开的问题)
    公司的上网行为管理系统项目有一个功能模块是统计报表,今天在完成这个功能的过程中碰到一个需求:将服务器上的PDF文件以附件的形式下载到本地。
    马上想起springMVC提供了文件下载的功能,非常开心。然而,不碰上点bug不足以写博客啊!
    先贴完整代码:

        public ResponseEntity<byte[]> download(String fileName)throws Exception{
            String filePath= ContextLoader.getCurrentWebApplicationContext().getServletContext().getRealPath("/static/images/");
            File file=new File(filePath +File.separator+ fileName);
            org.springframework.http.HttpHeaders headers=new org.springframework.http.HttpHeaders();
            //解决中文乱码
            String downloadFileName=new String(fileName.getBytes("UTF-8"),"ISO-8859-1");
            //文件名设置UTF-8编码,并以附件形式下载
            headers.setContentDispositionFormData("attachment", downloadFileName);
            //以PDF文件格式下载
            headers.setContentType((MediaType.parseMediaType("application/pdf")));
            return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers,HttpStatus.CREATED);
        }

    照着书上的示例编写了一段代码,却发现下载下来的文件格式出错,无法打开??瞬间懵逼

    马上分析代码可能出错的地方,首先是headers.setContentType((MediaType.parseMediaType(“application/pdf”)));这一句,刚开始找着书上写的是headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);,查了api文档和博客后发现这是二进制流数据,而我的应该是PDF格式才对,马上改正。
    参考:Http请求中Content-Type讲解以及在Spring MVC中的应用

    然而就这样却还是没解决问题,依旧很无奈,只得上网找找博客。很幸运,找到了类似的,试了试成功了。
    关键就在于springMVC的配置文件里没有对ByteArray的消息转换器,加上后就成功解决问题了,开心。
    上我的配置文件里面的相应代码:

        <!-- 默认的注解映射的支持,org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping -->
        <mvc:annotation-driven content-negotiation-manager="contentNegotiationManager">
    
                <!-- 关键就是加上这一句代码;pdf文件下载必须把这一句放在其他String和JSon转换器的前面,否则文件下载后格式错误,无法打开 -->
                <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
    
                <!-- 将StringHttpMessageConverter的默认编码设为UTF-8 -->
                <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                    <constructor-arg value="UTF-8" />
                </bean>
    
    
                <!-- 将Jackson2HttpMessageConverter的默认格式化输出为false -->
                <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                    <property name="supportedMediaTypes">
                        <list><value>application/json;charset=UTF-8</value></list>
                    </property>
                    <property name="prettyPrint" value="false"/>
                    <property name="objectMapper">  
                        <bean class="com._21cn.access.common.mapper.JsonMapper"></bean>  
                    </property> 
                </bean>
                <!-- 使用XML格式输出数据 -->
                <bean class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
                    <constructor-arg>
                        <bean class="org.springframework.oxm.xstream.XStreamMarshaller">
                            <property name="streamDriver">
                                <bean class="com.thoughtworks.xstream.io.xml.StaxDriver"/>
                            </property>
                            <property name="annotatedClasses">
                                <list>
                                    <value>com._21cn.access.common.persistence.BaseEntity</value>
                                    <value>com._21cn.access.common.supcan.treelist.TreeList</value>
                                    <value>com._21cn.access.common.supcan.treelist.cols.Col</value>
                                    <value>com._21cn.access.common.supcan.treelist.cols.Group</value>
                                </list>
                            </property>
                        </bean>
                    </constructor-arg>
                    <property name="supportedMediaTypes" value="application/xml"></property>
                </bean>
            </mvc:message-converters>
        </mvc:annotation-driven>

    参考:Spring MVC 文件下载最佳实践
    SpringMVC中controller中方法返回类型为ResponseEntity乱码的问题

    展开全文
  • ELF文件格式   在Linux下,可执行文件/动态库文件/目标文件(可重定向文件)都是同一种文件格式,我们把它称之为ELF文件格式。   虽然它们三个都是ELF文件格式但都各有不同:   可执行文件没有section ...
  • UDS请求和响应的数据帧格式

    千次阅读 2019-02-20 10:13:48
    1. 简单的通信机制 ...但是,诊断协议有自己的特色,它规定了在request和response的格式,在收到request的时候要做格式的检查。同时由于寻址方式的不同,有无sub-function的支持等,也会影响request和...
  • HTTP POST请求报文格式分析与Java实现文件上传

    万次阅读 多人点赞 2014-12-11 12:41:43
    而我们在使用HTTP请求时中遇到的比较麻烦的事情就是构造文件上传的HTTP报文格式,这个格式虽说也比较简单,但也比较容易出错。今天我们就一起来学习HTTP POST的报文格式以及通过Java来模拟文件上传的请求。
  • 参考链接1:Apache服务器httpd.conf配置详解参考链接2: APACHE安装配置说明 备份参考1:1、配置文件概述 1>Apache的配置文件是包含若干指令的纯文本文件。主配置文件通常叫httpd.conf ,其位置是编译时确定的,但...
  • HTTP处理响应

    千次阅读 2020-10-24 09:32:59
    简介 ...服务器返回的原始数据就是所谓的响应。本章我们会分析 HTTP 响应里的各种组成部分。...你遇到的最常见的响应状态码应该是 200,意思是请求被正确处理.让我们来看看其他有用的状态码: 状态码 状态文本 含义
  • 三、RCFile文件格式 概述历史 RCFile使用 基于行存储的优点和缺点 基于列存储的优点和缺点 源码分析 1. Writer 2. append RCFile的索引机制 flushRecords的具体逻辑 RCFile的Sync机制 RCFileclose过程 ....
  • 一、HTTP协议基础 ... 1.协议特点: 简单快速,请求方式get post head等8中请求方式 无连接(一次请求就断开)无状态(没有记忆功能,不会记录任何信息) 2.支持的模式:B/S、C/S...1.请求包格式:requ...
  • 事实证明,日志文件真的是很重要很重要的。能够帮助我们快速的定位问题,并且知道用户访问的状态,浏览器,Ip,接口地址等,简直可怕。...(2)access.log具体每项代表的意思 参数 说明 示例 $remote_addr 客户端地址
  • Response响应对象详解

    千次阅读 2018-10-11 20:11:03
    Response响应 01_HTTP_响应消息_概述 请求消息:客户端发送给服务器端的数据 数据格式: ...响应消息:服务器端发送给客户端的数据...响应字符串格式 HTTP/1.1 200 OK Content-Type: text/html;charset=UTF-...
  • MySQL文件目录格式及存放位置

    千次阅读 2015-09-10 09:00:50
    了解MYSQL的都知道,在MYSQL中建立任何一张数据表,在其数据目录对应的数据库目录下都有对应表的.frm文件,.frm文件是用来保存每个数据表的元数据(meta)信息,包括表结构的定义等,.frm文件跟数据库存储引擎无关,也...
  • Postman响应大小设置

    千次阅读 2020-12-01 17:17:39
    Postman响应大小设置 背景 使用Postman请求接口下载文件时,文件太大导致请求失败: 解决方法 在Postman配置页面设置Max response size in MB为0,即无限制。
  • #查看linux文件的MIME编码格式以及字符集 ##MIME编码格式和字符集 在软件的编码和实现中,我们可能会碰到个 一个比较头疼的问题--编码,尤其是在做网关的时候,会遇到各种各样的编码或编码组合以及字符集。 常见的...
  • 页面和服务器交互最常见的方式就是ajax,ajax简单来说是浏览器发送请求到服务端,然后服务端返回数据,常见的请求头和响应头如下图所示。    先看通用信息,通用信息有三个字段: 请求url, 请求方法, 状态码,...
  • MATLAB的M文件、MEX文件、MAT文件什么 .M文件是保存一段代码的文件,类似于C语言中的一个函数体; 这也是MATLAB中最常见的文件保存格式之一 .MEX文件是一种“可在matlab环境中调用的C(或fortran...
  • 什么响应式Web设计?怎样进行?

    千次阅读 2016-07-26 12:27:40
    开 始第一篇。老规矩,先无聊的谈论天气一类的话题。十一长假,天气也终于开始有些秋天的味道,坐在屋里甚至觉得...准备在近期的几篇里集中翻译学习一下“响应式Web设计”的相关话题,包括概念、实践方式、案例及...
  • html中嵌入flv格式文件的代码

    千次阅读 2013-01-03 21:40:08
    一些代理协议允许代理服务器改变客户端的原始请求、目标服务器的原始响应,以满足代理协议的需要。 主要讲一下http代理:  代理服务器大多被用来连接INTERNET(国际互联网)和INTRANET(局域网)。在国内,...
  • 终于可以将我这几天的努力写在亲爱的博客上了。将前后研究的一起总结一下,现在可以使用三种方式进行预览控制,第一种与第二种都是使用QLPreviewController,第二种...利用QLPreviewControllerDataSource进行文件预览。
  • HTTP响应状态码

    千次阅读 2019-12-04 23:02:00
    HTTP 响应状态码 ???? 状态码 ...表示目前为止一切正常, ...一般和 Link header(首部)一起使用,来允许用户在服务器还在准备响应数据的时候预加载一些资源。 200 表明请求已经成功. 默认情况下状态码为200的响...
  • http请求与响应全过程

    万次阅读 多人点赞 2016-05-24 00:15:10
    5、服务器的永久重定向响应: 6、浏览器跟踪重定向地址: 7、服务器“处理”请求: 8、服务器发回一个HTML响应 9、释放 TCP 连接 10、客户端浏览器解析HTML内容 11、浏览器获取嵌入在HTML中的对象
  • 之前做数据库相关题目的时候,被一道有关转储文件的题给难住了,这转储文件到底是什么啊!不行,我得把它弄懂!愣着干嘛!这种求知若渴的精神不值得点赞吗? 文章目录一、概念二、转储文件的作用三、抓取转储文件 一...
  • HTTP响应码大全

    千次阅读 2018-05-25 00:10:59
    状态码由服务器响应客户端对服务器的请求而发出。它包括来自IETF 征求意见(RFC)的代码,其他规范以及用于超文本传输​​协议(HTTP)的一些常见应用程序的一些附加代码。状态代码的第一个数字指定了五个标准类别...
  • [Python爬虫] 一、爬虫原理之HTTP和HTTPS的请求与响应

    万次阅读 多人点赞 2019-06-27 01:32:48
    本文主要介绍了爬虫原理之HTTP和HTTPS的请求与响应
  • CDN存储和加速静态文件什么回事(整理)(CDN是什么) 一、总结 一句话总结: 内容分发网络:Content Delivery Network:依靠网络中的各个节点,就近发放静态资源。 CDN的全称是Content Delivery Network,即...
  • ICMP timestamp 请求响应漏洞

    万次阅读 2018-08-08 13:45:00
    ICMP timestamp请求响应漏洞 解决方案: * 在您的防火墙上过滤外来的ICMP timestamp(类型13)报文以及外出的ICMP timestamp回复报文。 google之,于是动手解决: 具体解决方式就是禁用ICMP timestamp-request,...
  • 文加图, 理解Http请求与响应

    千次阅读 2016-08-01 17:05:33
    , 这说明在响应头结束后, 会有一个gb2312编码的json. 我们看下这个json的内容: 看到我们的请求返回的内容就是 ok , 代表有这个用户名和密码正确. 4. 结语 希望通过这一节, 让大家对http协议有个整体...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 84,564
精华内容 33,825
关键字:

响应文件格式什么意思