如何设计一个好的 API 接口

API接口应该如何设计,应该包含哪些信息,怎样设计才能有更好的扩展,更容易理解,更好的后期维护呢?我们以一个登录接口为例,看应该如何设计接口名才更合适。最简单的,我们可以设计为:/login,这样的设计在系统非常简单时没有任何问题,但是出现多个系统都有登录接口时就有冲突了。例如一个复杂点的系统,通常会涉及到:APP登录,管理后台登录,公众号登录。这些都属于不同的系统,他们都有登录接口。这时候我们可以在接口增加系统类型,把接口设计为:/app/login,/admin/login,/xxx/login,这样一看就知道是什么系统了。如果不用区分系统类型,我们直接写/api/login也行但是随着系统的不断迭代,登录接口需要重写,例如参数变动,或者手机号登录改为了QQ登录等。为了兼容之前的用户,我们不应该直接修改之前的接口,而是重新写一个新的接口,重新写接口时,我们就不能再使用跟原来一样的名字了:/app/login。可能有些人会使用/app/login2、/app/login-new这类命名方案,但是更好的解决方案是在接口中增加版本号,所以更好的接口方案是:/app/v2/login。我们...

接口中的 Content-Type 介绍

接口文档中我们经常见到content-type,这是什么呢?它有哪些值,这篇文章给大家解答。1.Content-Type有什么用接口发送参数、接收响应数据,都需要双方约定好使用什么格式的数据,例如json、xml。只有双方按照约定好的格式去解析数据才能正确的收发数据。而Content-Type就是用来告诉你数据的格式,这样我们才能知道怎么解析参数。如下图,我们可以看到接口的请求头和响应头中都有Content-Type.2.常见的Content-Typeapplication/json:JSON数据格式,现在非常流行的格式application/x-www-form-urlencoded:很常见的一种数据格式,post请求中通常默认是这个multipart/form-data:上传文件时我们需要用到这个格式application/xml:XML数据格式text/html:HTML格式text/plain:纯文本格式image/png:png图片格式3.x-www-form-urlencoded格式案例这个格式会用=号连接参数名和参数值,并且会经过urlencode编码。例如:title=...

php接口签名验证

在做一些api接口设计时候会遇到设置权限问题,比如我这个接口只有指定的用户才能访问。很多时候api接口是属于无状态的,没办法获取session,就不能够用登录的机制去验证,那么大概的思路是在请求包带上我们自己构造好的签名,这个签名必须满足下面几点:a、唯一性,签名是唯一的,可验证目标用户b、可变性,每次携带的签名必须是变化的c、时效性,具有一定的时效,过期作废d、完整性,能够对数据包进行验证,防止篡改//设置一个公钥(key)和私钥(secret),公钥用于区分用户,私钥加密数据,不能公开$key="c4ca4238a0b923820dcc509a6f75849b";$secret="28c8edde3d61a0411511d3b1866f0636";//待发送的数据包$data=array('username'=>'abc@qq.com','sex'=>'1','age'=>'16','addr'=>'guangzhou','key'=>$key,'timestamp'=>time(),);//获取signfunctiongetSign($secr...
开发笔记 开发笔记·2024-07-12

Java实现登录接口在redis中根据key值获取验证

JAVA1年前0629在自动化测试中,登录接口验证码的处理有两种常见的方案,第一种是通过ocr识别,这种方式不能保证百分百正确,通常用在UI自动化测试中。第二种是去数据库中直接查询验证码,这种方式可以保证验证码百分百正确,一般验证码都是保存在redis中,通常用在接口自动化测试中。这里我们给出第二种方案。目录结构 │.gitignore│RedisCode.iml│├─.idea││.gitignore││misc.xml││modules.xml││uiDesigner.xml││workspace.xml├─out│└─production│└─RedisCode│└─com│└─chenguoxin│RedisCode.class│└─src└─com└─chenguoxinRedisCode.java具体代码RedisCode.java packagecom.chenguoxin;importredis.clients.jedis.Jedis;importjava.util.HashMap;importjava.util.Map;/***@authorch...

php开发微信APP支付接口

1:用户在商户APP中选择商品,提交订单,选择微信支付。2:商户后台收到用户支付单,调用微信支付统一下单接口。参见【统一下单API】。3:统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appid,partnerid,prepayid,noncestr,timestamp,package。注意:package的值格式为Sign=WXPay4:商户APP调起微信支付。api参见本章节【app端开发步骤说明】5:商户后台接收支付通知。api参见【支付结果通知API】6:商户后台查询支付结果。,api参见【查询订单API】首先呢我们需要拿到三个参数(appid,mch_id,key),这三个参数分别对应的是在微信开发平台中创建的移动应用appid,微信支付商户号,商户支付秘钥,详情看参考【支付结果通知API】然后我们先把统一下单所需要的参数列出来 $request_data=array('appid'=>C('WX_APPID'),#应用APPID'mch_id'=&g...

java的接口和api

Java中的接口和API是两个非常重要的概念。一个接口是一组定义的方法和常量,用来完成某一个特定的任务。API代表应用程序编程接口,是一组预定义的类和方法,用来完成特定的任务,可以帮助开发人员快速实现程序功能。接口在Java中是一种特殊的类,只有方法的定义,没有方法的实现。它们通常是用来定义某一个作用域内需要实现的方法和常量。publicinterfaceMyInterface{publicvoidmyMethod();//定义一个抽象方法publicintmyVal=10;//定义一个常量}在Java中,一个类只能继承一个类,但一个类可以实现多个接口。这意味着您可以将多个接口组合在一起,并使您的类能够实现它们所定义的所有方法。publicclassMyClassimplementsMyInterface{publicvoidmyMethod(){System.out.println("MyMethodiscalled.");}}API是一组定义了许多类和方法的标准库,提供了许多常见任务和功能。Java的标准库是JavaAPI。使用这些API,您可以快速打开文件,创建网络连接,发送电子...
开发笔记 开发笔记·2023-08-29

Spring Security权限管理实现接口动态权限控制

下面就是关于“SpringSecurity权限管理实现接口动态权限控制”的完整攻略:在SpringSecurity中,我们可以使用基于注解的安全性,以控制方法响应、请求类型等。但是,如果我们需要跟具体的业务数据绑定的话,我们就需要根据规则来控制具体的访问权限。在这种情况下,就需要使用SpringSecurity提供的“动态授权”功能了。本文将介绍如何使用动态授权功能来精细管理用户权限。SpringSecurity中的动态授权,是通过实现权限控制的接口来达到的。主要通过实现AccessDecisionManager接口和AccessDecisionVoter接口来实现。AccessDecisionManager接口提供了访问决策,它用于限定某个Subject允许访问哪种资源。AccessDecisionVoter接口是AccessDecisionManager的一个具体实现。它可以进行“投票”,来判断是否允许访问某个资源。下面是具体的实现步骤:3.1.定义自定义权限管理器首先,在项目中定义一个自定义的权限管理器,在这...

SQLServer 错误 8601 内部查询处理器错误:查询处理器未能获得对所需接口的访问权限

Attribute值产品名称SQLServer事件ID8601事件源MSSQLSERVER组件SQLEngine符号名称INVALID_INTERFACE_ERR消息正文内部查询处理器错误:查询处理器未能获得对所需接口的访问权限。内部处理错误;无法获得对所需接口的访问权限。请与主要的服务提供商联系,并向其提供该错误消息中的所有信息。...

SQLServer 错误 7308 因为 OLE DB 访问接口“%ls”配置为在单线程单元模式下运行,所以该访问接口无法用于分布式查询

Attribute值产品名称SQLServer事件ID7308事件源MSSQLSERVER组件SQLEngine符号名称RMT_STA_DISABLED消息正文因为OLEDB访问接口“%ls”配置为在单线程单元模式下运行,所以该访问接口无法用于分布式查询。您使用了配置为在单线程单元(STA)模式下运行的OLEDB访问接口。在单线程单元(STA)模式下运行的OLEDB访问接口无法用于分布式查询。若要解决此错误,请将该访问接口配置为在多线程单元(MTA)模式下运行。如果该提供程序不支持MTA,且无法升级到支持MTA的版本,请考虑将该提供程序配置为在进程外运行。该提供程序的供应商应能够告知你该提供程序是支持MTA还是在进程外运行。...

C# 与 Java 接口的事项-hmac_sha1

C#与Java接口的事项-过期时间C#与Java接口的事项-JSON、urlsafe_base64C#与Java接口的事项-hmac_sha1hmac_sha1也没有什么特别的,只是有些接口提供商在讲解他们的签名原理时,没有说清楚,导致最终在编码成Base64时,出现不一致的结论。using (HMACSHA1 hmac = new HMACSHA1()){hmac.Key = Encoding.UTF8.GetBytes(privateKey);byte[] resultBuffer = hmac.ComputeHash(Encoding.UTF8.GetBytes(text));return resultBuffer;}注意如上我们直接返回的是byte[],而不是 Encoding.UTF8.GetString(byte[]),因为HMACSHA1结果在GetString后是乱码,所以不要GetString,而是直接返回byte[],外面再做Base64处理。C#...

C# 与 Java 接口事项-JSON、urlsafe_base64

C#与Java接口事项-过期时间C#与Java接口事项-JSON、urlsafe_base64C#与Java接口事项-hmac_sha1类转换成JSON没有什么特别的参考:C#中处理JSON-使用DataContractJsonSerializerC#中处理JSON-使用JavaScriptSerializer更简单只是要注意,有些接口设计者,对属性进行了排序,如果这个JSON要参与签名的话,那么我们要按照他们的属性来。C#中处理JSON-生成的JSON属性顺序是怎样的?urlsafe_base64string base64String = Convert.ToBase64String(Encoding.UTF8.GetBytes(s));return base64.Replace("+", "-").Replace("/", "_");为避免Base64中的字符与URL中的含义字符冲突,通常是作如上替换。也就是替换+和/,当然有的还会将=去...

C# 与 Java 接口事项-过期时间

C#与Java接口事项-过期时间C#与Java接口事项-JSON、urlsafe_base64C#与Java接口事项-hmac_sha1一些接口提供商,它提供Java版本的SDK,提供PHP版本的SDK,提供Python版本的SDK,就不提供C#版本的,所以本系列文章谈谈,用C#实现这些SDK时遇到的一些常见注意事项。在Java、Linux的体系中,在需要时间相关的地方,比如过期时间,接口设计人都不愿意使用具体的时间格式,经常使用的是:1970-1-1以来经历的秒数。但是要注意,有些使用了UTC,可能会相差8个小时,所以我们的C#代码可能是:(new DateTime(2022, 4, 23) - new DateTime(1970, 1, 1)).TotalSeconds或者(new DateTime(2022, 4, 23).ToUniversalTime() - new DateTime(1970, 1, 1)).T...

C# 接口属性中,如何设置 protected 的 set 或 get

C#的接口中,是可以设置属性的,比如:publicinterfaceIOperator{intUserId{get;set;}}但是,我希望类中的set是protected的,怎么办呢?publicinterfaceIOperator{//intUserId{get;protectedset;}//错误的做法,不允许指定protectedintUserId{get;}//正确的做法}正确的做法是,不要写set,这样在类中,你爱怎么写就怎么写。...

C# 接口可以包含属性吗?

C#接口可以包含属性吗?可以的,示例如下:publicinterfaceI1{intSize{get;set;}}publicclassC1:I1{publicintSize{get;set;}}但是接口并不能包含字段。所以这样不行:intSize=0;。接口中的属性,不论是get,还是set,都必须是public的,同样在实例化之时,也必须是public的。...
代码星球 代码星球·2023-04-16

实现的两个接口中有相同的方法,会不会冲突?

不会。publicinterfaceI1{voidDo();}publicinterfaceI2{voidDo();}publicclassC:I1,I2{publicvoidDo(){}}如上,没问题。...
首页上一页12345...下一页尾页