WebAPI前置知识:HTTP与RestfulAPI

     对HTTP协议的基本了解是能理解并使用RestFul风格API的基础,在了解了这些基础之后,使用各种RestFul的开发框架才能得心应手。我一开始使用WebApi的时候就因为对这些知识缺乏了解,觉得用起来各种不顺手,直到熟悉了这些HTTP的知识后,使用WebApi开发起来才觉得得心应手,我的理解里,RestFul风格的API即是对HTTP协议良好支持,实现HTTP完整语义风格的API。

      在介绍这些知识之前,我需要强调一下很多人存在的一个误区:HTTP的谓词和数据传递方式。绝大多数人接触并使用的HTTP协议都是在网站编写的过程中,在一般的WEB应用中,我们仅使用GET、POST两个谓词,其他谓词并不适用,在这一习惯下很多人有几个奇怪的认知:HTTP协议只适用于网站开发,HTTP仅有两个谓词:GET/POST,HTTP调用数据传递仅使用表单K-V的形式进行;在这种认知下,用这种风格开发的RestApi经常会不伦不类,使用ASP.NET WebAPi也会显得不伦不类,平添麻烦。而我们首先要认识到,网站的数据交互只是HTTP使用的一个场景而已,HTTP可以传递各种形式的数据。

      我们从HTTP的第一行说起:HTTP的第一行包含三个信息:谓词、URL、HTTP协议版本。三个数据使用空格隔开。

       谓词:对于RestFul API来说谓词是非常重要的一个元素,WEB API就是使用谓词作为默认的路由方式,最常用的谓词有:POST\DELETE\PUT\GET,这四个谓词对应了“增、删、改、查”四个动作(POST和PUT谁是增谁是改不同资料总有不同的说法,我其实有略微有点困惑啦……有定义说PUT是幂等操作,而POST不是,那PUT就更偏重于改而POST更偏重于增)。最常用的谓词即为这四个,也有其他谓词拥有不同的语义:

HEAD:仅返回相应头部,不包含Body

TRACE:对数据传输过程进行诊断

OPTIONS:请求 Web 服务器告知其支持的各种功能

还有其他谓词,如果需要可以查询相关文档,但并不常用。

其中,GET,DELETE不包含BODY,PUT,POST可以包含BODY。而如果一个谓词包含了语义之外的操作,例如GET中带BODY,POST用于删除资源这种操作也是被允许的,称之为谓词的重载,虽然HTTP可以支持谓词的重载,但并不建议使用,因为不符合标准语义。 

         URL : URL定义了一个资源,例如www.example.com/person 定义了person为一个资源,结合上面所介绍的谓词,我们提供Person一组操作:

         GET www.example/person/1 即获取ID为1的用户的信息

         POST www.example/person/ (BODY中包含Person的描述) 创建一个Person资源

         PUT www.example/person/1 (BODY中包含Person的描述) 更新一个Person资源

         DELETE www.example/person/1 删除ID为1的Person资源

        

      HTTP版本:

         目前主要使用的是HTTP1.0 和 HTTP1.1协议,HTTP2.0协议正在普及阶段,用的还不是很多。HTTP1.0 和HTTP1.1区别很小,其中的差异对于RestFul来说影响并不是很大。具体的差别大家可以查询相关文档。

        

HTTP的第一行内容就是这些,接下来会有一个\r\n来进行换行,接下来就是HTTP HEAD部分,HTTP HEAD描述了HTTP请求和响应。我认为HTTP HEAD即为HTTP协议中最重要的部分,他包含了编码、BODY长度、内容协商等信息,你也可以包含一些自定义信息。下面我来为大家介绍几个在RestFul API中常用的HEAD:

         User-Agent:用户代理,是什么客户端发出的请求,如IE、Chrome、Fiddler等

         HOST:域名(HOST一般用于服务器的站点绑定,一般和URL的域名相同,但是在一些自定义的DNS使用方式中,可能会出现HOST和URL中的域名不一致)     

         Authorization:验证信息,这个字段可以包含一些用于用户验证的信息,而表示方法为:schema authorinfo,中间使用空格隔开,其中schema代表了验证方法,authorinfo代表了验证信息,常见的schema 如 Base:authorinfo使用用户名+密码,并用Base64进行编码。或者使用Token,类似于Session的方式。

Accept:接受何种序列化方式返回的数据,用MIME表示,用于对响应数据的内容协商,可以包含多个MIME,按优先顺序排列,如application/json,application/xml,text/html;具体服务器可以返回什么类型的数据需要由服务器支持情况而定,有一些标准MIME,可以查到;有时我们也需要一些自定义的MIME,例如bson、protocolbuffer等,我们可以自定义MIME,在服务端开发自己的实现,而这些特的扩展在ASP.NET WebApi中都有相应的扩展点。

         Content-Type:使用一个MIME表示,表示所发送请求的Body的序列化方式,常见的如application/json,还有WEB交互最常使用的application/x-www-form-urlencoded,都表示了你的body部分的序列化方式,在请求、响应中都会出现

 

         HTTP HEAD部分我认为是HTTP协议中最核心的部分,其中可配置、使用的地方实在太多太多,而且有太多的细节,以上为我列出的在我的工作中最常用的部分,介绍这些内容的资料全部列出来足够完成一本书了,大家有兴趣可以查找相关资料,在Rest API中,内容协商经常让一开始学习使用Rest的人很迷惑,一定要记住Accept,Content-Type两个头的作用和区别,Accept表示希望接受什么样的数据,Content-Type表示当前请求中Body的编码方式。在ASP.NET WEBAPI中,如果请求中有Content-Type,而没有ACCEPT,则默认使用Content-Type中的内容作为响应的内容协商。

        

         响应部分也分为头部和Body,响应头部和请求头部最大的不同在于响应首行存在一个HTTP Code,HTTP Code作为API的调用状态的展示,也很重要,在REST API中最常用的状态码一般为2XX,4XX,5XX三个段,而1XX表示工作还要继续,3XX一般表示重定向,在REST API中使用的并不多。而在最常用的三个Status 段中,2XX表示执行成功,4XX表示客户端数据错误(例如参数校验不通过),5XX表示服务器端处理错误,例如有未处理的异常(如数据库连接错误),根据这些状态码可以初步判断API调用的执行状态。

        

         在首部之后有一个空行(\r\n)接下来就是Content,这里有具体的业务数据,根据不同的Content-Type使用不同的序列化方式表示,例如JSON,XML,甚至HTML。各位在学习HTTP API时可以认为网页应用也是HTTP 的一种应用,只是交互方式一般使用application/x-www-form-urlencoded 作为请求、 text/html作为响应的方式进行交互。而RestAPI可以使用其他很多种编码方式进行交互,支持的更广,网页应用只是使用HTTP传输的一种应用场景,RestAPI和网页是可以不分开的。我觉得这一点Nancy比ASP.NET做得更好,Nancy并没有把RestAPI和网页割裂开来,而ASP.NET用MVC和WEBAPI将两者割裂了;请求一个数据,我可以要求Accept为application/json时返回Json数据,而使用text/html时返回一个网页;当然,将这两种应用方式切割或合并起来都各有优劣。

         我所写的这些对于HTTP协议而言实在太少太少,大家有兴趣的可以自行查找相关资料,我只是写出了WEB API中常用的部分,下面我们来用一张图为大家展示一下这些知识:

相关文章: 

  • Dion Hinchcliffe谈Web API的过去与未来

  • Web API应用支持HTTPS的经验总结

  • ASP.NET Web API 安全筛选器

  • Web API 基于ASP.NET Identity的Basic Authentication

  • REST API 安全 设计指南

  • ASP.NET Web Api使用CacheCow和ETag缓存资源

  • 使用 West Wind WebSurge 对 ASP.NET Web API 服务进行压力测试

  • ASP.NET Linux部署(2) - MS Owin + WebApi + Mono + Jexus

原文地址:http://www.cnblogs.com/UliiAn/p/5353475.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329727.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java三种代理模式-静态代理,动态代理和cglib代理

【README】 本文阐述了3种代理模式的定义,并编写了代码测试案例; 代理其实是一种设计模式,可以在访问目标对象的方法上下文添加处理逻辑(扩展目标对象的功能),是 切面编程的基石; 【举个例子】…

python遗传算法工具箱的使用_遗传算法的python实现,非常值得看的一篇文章

遗传算法是一种智能优化算法,通常用于求解复杂的数学问题。相比于传统方法,遗传算法摒弃了盲目的穷举或完全随机的求解策略,借鉴了自然界优胜劣汰、自然进化的思想,快速逼近最优解。上文对遗传算法的基本内容进行了介绍&#xff0…

JAVA面试常考系列十一

转载自 JAVA面试常考系列十一 题目一 什么是JSP? JSP(Java Server Page)是一个文本文档,是一种将静态内容和动态生成内容混合在一起的技术。 JSP包含两种类型的文本:静态数据和JSP元素。静态数据可以用任何基于文本的格式表示,如H…

.NET跨平台实践:用C#开发Linux守护进程

Linux守护进程(Daemon)是Linux的后台服务进程,它脱离了与控制终端的关联,直接由Linux init进程管理其生命周期,即使你关闭了控制台,daemon也能在后台正常工作。 一句话,为Linux开发与控制台无关…

ThreadLocalRandom与Random区别

转自: 一文秒懂 Java ThreadLocalRandom - Java 一文秒懂 - 简单教程,简单编程随机数生成是一个非常常见的操作,而且 Java 也提供了 java.util.Random 类用于生成随机数,而且呢,这个类也是线程安全的,就是…

python自动配置文件_【python接口自动化】- ConfigParser配置文件的使用

前言:目前我们使用的绝大多数计算机程序,无论是办公软件,浏览器,甚至游戏、视频都是通过菜单界面系统配置的,它几乎成了我们使用机器的默认方式。而在python中,也有这样的一个配置模块可以把代码可配置化。…

JAVA面试常考系列十

转载自 JAVA面试常考系列十 题目一 Servlet是什么? Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,是用Java编写的服务器端程序,主要的作用是处理客户端请求并生成动态Web内容。…

DotNet 资源大全

Awesome DotNet,这又是一个 Awesome XXX 系列的资源整理,由 quozd 发起和维护。内容包括:编译器、压缩、应用框架、应用模板、加密、数据库、反编译、IDE、日志、风格指南等。 伯乐在线已在 GitHub 上发起「DotNet 资源大全中文版」的整理。欢…

javabean与json转换(fastjson与jackson两个版本)

【README】 本文演示了 javabean与json转换的开发方式&#xff1b; 要想 javabean的属性名 与 json的字段名不一致&#xff0c;也是可以转换的&#xff1b; 之前需要引入 ali.fastjson <dependency><groupId>com.alibaba</groupId><artifactId>fas…

mysql数据库新建一个递增的_分享一个mysql实验—基于数据库事务隔离级别RR及RC的测试...

概述今天主要分享一个最近做的实验&#xff0c;主要是测试mysql数据库在RR和RC不同事务隔离级别下的表现。MySQL使用可重复读来作为默认隔离级别的主要原因是语句级的Binlog。RR能提供SQL语句的写可串行化&#xff0c;保证了绝大部分情况(不安全语句除外)的DB/DR一致。下面以my…

直面Java第45期

转载自 直面Java第45期

ABP框架搭建项目系列教程基础版

我现在要着手一个新的项目&#xff0c;也打算用这个框架&#xff0c;所以想要将我一步一步用这个框架的做项目的步骤和想法跟大家分享出来。 经过前面十二篇的基础教程&#xff0c;现在终于该做个总结了。 第一篇&#xff0c;我们建议新手朋友们先通过ABP官网的启动模板生成解决…

字节数组转jsonobject(如读取HttpServletRequest.inputstream到jsonobject)

【README】 本文po出了 如何读取 字节数组到jsonobject&#xff1b; 字节数组如何获取&#xff0c;本文不再赘述&#xff1b; 【1】代码 /*** Description 字节数组转json演示* author xiao tang* version 1.0.0* createTime 2022年02月11日*/ public class ByteArr2JsonDem…

sql server 2008安装_性能不够?基于时序数据库的Zabbix 5.2安装指南

我们往往在谈论zabbix的优缺点的时候&#xff0c;提到最多的依然还是数据库(默认采用关系型数据库)&#xff0c;由于关系型数据库所有的读写都是采用sql语句解析&#xff0c;一但并发过大或者数据量过大&#xff0c;处理能力就显得捉襟见肘&#xff0c;这也是Zabbix让人诟病的地…

对象并不一定都是在堆上分配内存的

转载自 对象并不一定都是在堆上分配内存的 JVM内存分配策略 关于JVM的内存结构及内存分配方式&#xff0c;不是本文的重点&#xff0c;这里只做简单回顾。以下是我们知道的一些常识&#xff1a; 1、根据Java虚拟机规范&#xff0c;Java虚拟机所管理的内存包括方法区、虚拟机栈、…

Bash on Windows 抢鲜测试 -- 介绍及安装

前言 微软在上周的Windows BUILD大会上宣布&#xff0c;WIN10将引入原生Bash&#xff0c;并将很快在技术预览版中推出。 如此一来&#xff0c;windows的命令行工具就不再只有cmd和powershell了&#xff0c;我们可以还可以使用bash。 今天&#xff08;2016/4/8&#xff09;收到了…

jvm的client与server工作模式

【README】 JVM Server模式与client模式启动&#xff0c;最主要的差别在于&#xff1a; -Server模式启动时&#xff0c;速度较慢&#xff0c;但是一旦运行起来后&#xff0c;性能将会有很大的提升. 原因是:当虚拟机运行在-client模式的时候,使用的是一个代号为C1的轻量级编译…

python重定向到socket_python套接字流重定向实例汇总

#!/usr/bin/env python3"""测试socket-stream 重定向模式"""import sys,os,timefrom multiprocessing import Processfrom socket import *def initListenerSocket(port50008,host):"""初始化在服务器模式下调用者用于监听连接的…

Spring Boot的自动化配置原理

转载自 Spring Boot的自动化配置原理 随着Ruby、Groovy等动态语言的流行&#xff0c;相比较之下Java的开发显得格外笨重。繁多的配置、低下的开发效率、复杂的部署流程以及第三方技术集成难度大等问题一直被人们所诟病。随着Spring家族中的新星Spring Boot的诞生&#xff0c;这…

复盘Build 2016:不要错过微软给.NET开发者的这些福利

本文作者陈计节&#xff0c;ThoughtWorks 高级咨询师。多年的跨平台 .NET 开发者&#xff0c;全栈工程师&#xff0c;技术布道师。擅长互联网应用程序的设计、开发和运维等工作。 近年来&#xff0c;微软坚持为社区提供更多灵活性&#xff0c;并以更开放的思路重构其已有平台&a…