版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
比如下面的接口 界面,这是WebAPI和普通ASP.NetMVC的区别。WebAPIMVC的路由、ModelBinder、Filter等知识,但是只是模仿,类名、命名空间等一般都不一样,用法也有一些差别。比如ASP.netMVC的IAuthorizationFilter如下:usingSystem.Web.Mvc;{publicclassAFilter:{{}}}usingusingSystem.Net.Http;usingSystem.Threading.Tasks;usingSystem.Web.Http.Filters;{publicclassAuthorFilter:{publicboolAllowMultiple=>publicTask<HttpResponseMessage>ExecuteAuthorizationFil actionContext,CancellationTokencancellationToken,Func<Task<HttpResponseMessage>>continuation){return}}}值直接返回对象,专注于数据;2)webapiRestful3)IIS部署先讲使用.NetFramework的WebAPI,最后也演示一下.netcore中的WebAPI。删除:发Post请求 登录:发Post请求htt /User/Login,报文体里带用户名、,返回和上新增用户:发Post请求htt 查询用户信息:发Get请求htt Http设计之初是有“谓词语义”的,除了Get、Post之外,Http还有Put、Delete等请回状态码表示服务器端的处理结果,比如htt /User/3找不到就返回404, /User/Delete/3如果没有执行权限就返回401。把所有操作都抽象成对有利于系统优化,浏览器可以自动缓存Get代,接口都是普通语言调用了,因此“Http谓词语义”又得到重用。标准。-ful:***的。grace:态度,graceful温柔ASP.NetWebAPI设计之初就是一个restful风格的技术,基于这种RestfulWebAPI不容易掌握,大公司的API都很少有满足Restful规范的。因此参考,尽可能遵守,但是别追求。 WebAPIFramework不建议用WebAPI这个模板,因为他会强制使用MVC2、Controller下新建一个 ApiControllpublicIEnumerable<string>Get()//用 {returnnewstring[]{"value1","value2"}publicstringGet(intid)//用 /3或者 ?id=3{return}{return}publicstringGetByPhoneNum(stringphoneNum)这个可以用/api/?=110。不能用/api//GetByPhoneNum?phoneNum=110,其实这个方法叫什Get(stringname)Get(stringphoneNum) 等发Http请求这几个接口方法,看一下返回。WebAPIControllerApiController3)默认,WebAPI的路径不是/Controller/Action的方式{Httphc=newHttpstringresp=awaithc.GetStringAsync("htt returnnewstring[]{resp.Length.ToString(),resp.Substring(0,10)};}借助Fiddler、PostMan等工具来帮我们提交Http请求。这里介绍使用PostMan。PostMan官网地址:https://w //POST{}//PUT{}publicstringDelete(intid){}由于项目的默认路由是routeTemte:"api/{controller}/{id}",因此Action的名字是不起作用他重载方法也不认,这是初学WebAPI常遇到的难题。Url区分方法,而是根据请求方式和参数来对应方法。这种玩意实用价值不大,还容易把WebAPI1Get方法的参数。2、Post方法的参数,如果提交的请求体需要是name=rupeng&age=5这样的格式。如果用stringWebApi接口参数不再困惑:传参详解》),所以不要用。都用模型对象,publicstringAddNew2(LoginModelmodel),也可以参数标注[FromBody]:publicstring、如果4、通过自定义路由规则来捕获参数, /en-us/aspnet/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2也可以自定义限制规则,还支持可选参数个参数,参数前标注[FromBody],参数少的话麻烦;如果使用Get请求,那么参数比较自由,普通参数、类参数都可以,但是需要注意防范缓存(使用ajax的话加上一个当前时间或者随机数的参数,使用Http 果用PostContentType=”application/x-www-form-urlencoded”提交表单,也可以用ContentType=”application/json”提交。3、Action的返回值可以为IHttpActionResult类型,可以调用ApiController中的Ok()、 4HttpResponseMessage可以做更精细化的返回内容控制,比如返回二进制文件、设置返{ }API的多版本问题?AndroidApp存在着多版本客户端共存的问题:App早期没有内置升级机制、用户不会升级、用户升级等原因,造成这些旧版本App也在App的时候,要给接口增加新的功能或者修改以前接口的规范,会造成 2、在url、报文头等中带不同的版本信息,用Nginx等做反向服务器,然后将 /api/v1/User/1和htt /api/v2/User/1转到不同的服3Controller[RoutePrefix]或者publicclassController:{{"}}publicclassV2Controller:{{}}1)WebApiConfig中的路由改成如下:routeTemte:"api/v1/{controller}/{id}",defaults:new{id=RouteParameter.Optional}ame:"DefaultApiv2",routeTemte:"api/v2/{controller}/{id}",defaults:new{id=RouteParameter.Optional}{publicclassController:{{}}}{publicclassController:{{"}}}usingSystem.Linq;usingusingSystem.Web.Http;usingSystem.Web.Http.Dispatcher;{{{_config=}{foreach(varasmin{varcontrollerTypes=asm.GetTypes().Where(t=>!t.Is {varmatch=Regex.Match(ctrlType.Namespace,{stringctrlName=stringkey=ctrlName+"v"+verNum;//v2为dict[key]=new}}}} SelectController(HttpRequestMessagerequest){varrouteData=stringverNum=stringkey=controllerName+"v"+verNum;//获取 {}{}}}}
returnreturnnew1)WebApiConfig中的路由改成原始的样子如下name:routeTemte:"api/{controller}/{id}",defaults:new{id=RouteParameter.Optional}usingSystem.Collections.Generic;usingSystem.Linq;usingusingSystem.Web.Http;usingSystem.Web.Http.Dispatcher;{{{_config=}{foreach(varasmin{varcontrollerTypes=asm.GetTypes().Where(t=>!t.Is {varmatch=Regex.Match(ctrlType.Namespace,{stringctrlName= stringkey=ctrlName+"v"+verNum;//v2位dict[key]=new}}}} SelectController(HttpRequestMessagerequest){varrouteData==stringkey=controllerName+"v"+verNum;//获取 {}{}}}}
returnreturnnew1publicclassMyAuthorFilter:IAuthorizationFilter//如果项目也添加了对MVC程序集的,一定要用System.Web.Http.Filters下的IAuthorizationFilter{publicboolAllowMultiple=> Task<HttpResponseMessage>ExecuteAuthorizationFilsync(HttpActionContextactionContext, {IEnumerable<string>values;{if(userName!="admin"){ }}{}
returnnewreturnawait}}ExecuteAuthorizationFilsync内的方法returnawaitcontinuation();就是继续向下Jsonpublicclass{publicintCode{get;set;}publicstringMessage{get;set;}publicTValue{get;set;}}自定义类实现IExceptionFilterpublicclassExceptionFilter:{publicboolAllowMultiple=> actionExecutedContext,CancellationTokencancellationToken){{await }}}看AppId,AppKey就是供“如鹏版”这个App用的,的用户也可以用同样的用户看登录“如鹏版”这个App发、看,和版本的是互通的。哪一天新浪发现“如鹏版”的开发者用接口干坏事了,比如在用户的每一条发后面都自动加上了如鹏网的,那么就可以“如鹏版”的AppKey,这样大家都不能使用“如鹏版”了,但是可以换版本继续使用。户无论用“如鹏版”app还是“版本”app就都不能发了。所以说通俗一点:AppKey是控制“如鹏版”这个客户端能不能调用接口的,AppKeyAppKey调用的次数,避免接口被,或者按照调用次数等。是给App等由客户设备发送请求的终端时,做认证就是特别有必要了,这样即使抓包了,那么只要封堵这个AppKey就可以了。“每次请求,直接把“用户名/AppKey、/AppSecret”通过表单、“首次先使用“用户名/AppKey/AppSecretAccess_Token(相redis、memcached等地方Access_Token,Access_Token存在有效期,过时后要重新获取Access_Token。缺点是用打开还要能直接用。需要有一个类似于Session的中心回话服务器。WebAPI也可以使用的Session,但是不建议使用。/AppKeySession的过期问题,可以一直能用;缺点是一旦加密算法,会带来安全性问题。JWT 部分约等于是明文的,因此不能在Payload中保存不能让别人看到的信息。虽然说PayloadPayloadSignature部分是根据header+payload+secretKeyPayloadSignatureInstall-PackageJWT varpayload=newDictionary<string,object>{{"UserId",123{"UserName","admin"IJwtAlgorithmalgorithm=newHMACSHA256Algorithm();IJsonSerializerserializer=newJsonNetSerializer(); 2) {IJsonSerializerserializer=newJsonNetSerializer();IDateTimeProviderprovider=newUtcDateTimeProvider();IBase64UrlEncoderurlEncoder=new }catch{ }catch{ }payload中增加一个名字为exp1970/1/100:00:00doubleexp= 篡改请求,比如用户应该只能查看/user?id=5id从而能够查valueAppSerect计算散列值作为sign,传过去,服务器端再校验一遍。请求重放,重复的请求。每次请求的时候都带着当前时间(时间戳,服务器端比要操作要验证等。 Service接口 publicclass{publiclongId{get;set;}publicstringName{get;set;}publicstringAppKey{get;set;}publicstringAppSecret{get;set;}publicboolIsEnabled{get;set;}}publicclass{publiclongId{get;set;publicstringPhoneNum{get;set;}publicstringNickName{get;set;}publicclass{publiclongId{get;set;}publicstringName{get;set;}}{}{Task<UserGroupDTO[]>GetGroupsAsync(longuserId);Task<UserDTO[]>GetGroupUsersAsync(longuserGroupId);}{Task<bool>UserExistsAsync(stringphoneNum);Task<UserDTO>GetByIdAsync(longid);}五、项目目前只有v1Selector、v1什么都配置好了六、UserCenter.OpenAPI基本实现1、{varbuilder=newContainerBuilder();//RegisterAPIcontrollersusingassemblyscanning. &&varcontainer=//SettheWebApidependencyconfiguration.DependencyResolver=resolver;}算Md5值(nuget包: mon)作为Sign。 usingusingSystem.Linq;usingSystem.Net.Http;usingSystem.Threading.Tasks;usingSystem.Web.Http.Filters;usingUserCenter.IServices;{{publicIAppInfoServiceappInfoService{get;set;}publicboolAllowMultiple=>publicasyncTask<HttpResponseMessage>ExecuteAuthorizationFil actionContext,CancellationTokencancellationToken,Func<Task<HttpResponseMessage>>continuation){IEnumerable<string>appKeys;{returnnew{}{}stringsign=signs.First();{=}{returnnewHttpResponseMessage(System.Net.HttpStatusCode.Forbidden)ContentnewStringContent("AppKey已经被封禁")};}
varsegments=orderedQS.Select(kvkv.Keykv.Value);//拼接key=value的数组stringqs=string.Join("&",segments);//用&符号拼接起来 + {}{
returnawait}}}}并且需要不是config.Filters.Add(newUCAuthorizationFilter());UCAuthorizationFilterauthorFilter=表示新增用户的Id判断一个号是否存在,请求:User/UserExists?phoneNum= usingusingSystem.Linq;usingSystem.Text;using{class{privatestringappKey;privatestringappSecret;{this.appKey=appKey;this.appSecret=appSecret;}////////////{//varorderedQS=queryStringData.OrderBy(kv=>{}.Select(kv=>kv.Key+"="+kv.Value);varqueryString=string.Join("&",qsItems); using hc=newHttp{hc.DefaultRequestHeaders.Add("Sign",sign);varresp=awaithc.GetAsync(serverRoot+url+"?"+queryString);SDKResultsdkResult=newSDKResult();sdkResult.StatusCode=resp.StatusCode;return}}}}publicclass{publicstringResult{get;set;publicHttpStatusCodeStatusCode{get;set;}九、编写控制台程序测试SDK.netcore1、ler继承自和MVC一样的Controller;路由配置是,在ontroller上标注[Rout("api/[controller]")],在方法上标注[t]、[HttpPost]等,也可以使用[HttpGet("{id}")]这样的格式。可以使用[HttpPost(“Test”)]这样的方式标注在方法上。。。3
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年北师大版九年级生物上册阶段测试试卷
- 2025年人教版(2024)九年级地理下册月考试卷含答案
- 2025年教科新版高一地理上册阶段测试试卷含答案
- 2025年粤人版九年级地理下册阶段测试试卷含答案
- 2025年中图版八年级历史上册月考试卷
- 2025年苏人新版九年级历史下册月考试卷
- 2025年人教版(2024)九年级历史下册阶段测试试卷
- 2025年粤教新版选择性必修3历史下册阶段测试试卷含答案
- 2025年人教A新版九年级历史上册阶段测试试卷含答案
- 2025版牛舍智能化温控系统安装工程承包合同4篇
- 2025年上半年江苏连云港灌云县招聘“乡村振兴专干”16人易考易错模拟试题(共500题)试卷后附参考答案
- DB3301T 0382-2022 公共资源交易开评标数字见证服务规范
- 人教版2024-2025学年八年级上学期数学期末压轴题练习
- 江苏省无锡市2023-2024学年八年级上学期期末数学试题(原卷版)
- 俄语版:中国文化概论之中国的传统节日
- 2022年湖南省公务员录用考试《申论》真题(县乡卷)及答案解析
- 妇科一病一品护理汇报
- 哪吒之魔童降世
- 2022年上海市各区中考一模语文试卷及答案
- 2024年全国统一高考数学试卷(新高考Ⅱ)含答案
- 我国无菌包装行业消费量已超千亿包-下游需求仍存扩容潜力
评论
0/150
提交评论