精华内容
下载资源
问答
  • 我们打开下载Activiti5.18.0.zip包,在...我们把activiti-rest.war也部署到一个单独tomcat中,修改WEB-INF/classes/log4j.properties文件,向其中加入以下内容,并将log4j.rootLogger=INFO, CA 后面添加一个“,D ”
  • python接口功能类似功能介绍其中包括迭代访问、切片方式、如果你python接口功能想有所了解话,你可以浏览以下文章,会你有所帮助。在正常情况下, OpenCVpython接口和C语言接口基本一致. 但是, 对于...

    python接口功能的类似功能的介绍其中包括迭代访问、切片方式、如果你对python接口功能想有所了解的话,你可以浏览以下文章,会对你有所帮助。

    在正常情况下, OpenCV的python接口和C语言接口基本一致. 但是, 对于python接口实现比较困难的地方, 一些函数和结构体可能会有不同. 下面的描述就是有关此内容的详细介绍。希望会对你有所帮助。

    函数接口也尽量保持和C语言一致. 最大的差异是在函数通过参数来返回值的时候. 由于python中有些基本的参数都不可改变的, 因此代替的方法是一次返回多个值. 同样, 大部分的结构和C语言中也有相似的功能, 但是语法可能有些不同.

    下面描述比较重要的差异, 具体的细节可以参考python接口的代码.

    没有IplImage

    最大的差异是python接口中没有IplImage! 这主要是为了避免SWIG 在处理IplImage中隐含共享的不足. 以下是具体的替代方法:

    原来返回IplImage的函数, 现在返回CvMat 原来读IplImage改为读CvMat ,CvMat中没有的IplImage属性被添加以支持IplImage, 例如height, width, depth, imageDataSize等. ROI和COI相关函数被禁止使用. 不过用户可以用cvGetSubRect/cvSplit/cvMerge来实现类似的功能.

    迭代访问

    CvMat扩展了python中的2个基本方法__iter__ 和 __getitem__, 来支持元素的简单访问.

    通过行的方式迭代

    x = cvCreateMat(m, n, type) for row in x:

    # row is same as that returned by cvGetRowpython>

    通过列的方式迭代

    for col in x.colrange():

    # col is same as that returned by cvGetColpython>

    切片方式

    获取一行

    row = x[i]python>

    获取一列

    col = x[:, i]python>

    获取一个区域

    slice = x[0:10, 0:10]python>

    获取一个元素

    elem = x[i, j]

    or

    elem = x[i][j]

    or if x is a vector

    elem = x[i]python>

    同样的方法可以用来修改元素

    # x and y are CvMat's x[0:10, 0:5] = y[10:20, 1:6] x[i, j]

    = 1; x[:, :] = 1; x[:, :] = cvScalar(1); x[0:10, i]

    = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]python>

    CvMatND

    暂时还不支持. 如果您有兴趣自己实现的话, 请联系RomanStanchak.

    CvSeq

    python中访问CvSeq的代码:

    num_contours, contours = cv.cvFindContours(...)

    hrange iterates through h_next element

    for contour in contours.hrange():

    # contour is a CvSeq of points

    for pt in contour:

    print pt

    # alternately

    for pt in contour.vrange():

    print pt

    # alternately

    for i in range(contour.total):

    print contour[i]python>

    交互命令行编程

    python的最大优点是可以在交互命令行中开发程序. 交互shell编程和Matlab类似. 以下在命令行中显示一副图像的代码:

    from opencv.cv import *

    from opencv.highgui import *

    cvStartWindowThread()

    cvNamedWindow("win")

    im= cvLoadImage("pics/airplane.jpg")

    cvShowImage("win", im)python>

    需要注意的是cvStartWindowThread函数, 它目前只支持linux系统. cvStartWindowThread 函数的目的是代替cvWaitKey()来实现窗口的自动刷新. 去掉cvWaitKey()函数之后, 程序的输入将不受cvWaitKey阻塞, 更便于shell交互.

    Matlab语法

    熟悉Matlab或SciPy的朋友, 可以更关注matlab_syntax模块. 该模块采用了和 Matlab/SciPy 类似的方法来创建数组. 很多情况下, 这比用OpenCV的标准函数更加便捷. 切换行号显示:

    from opencv.cv import *

    from opencv.highgui import *

    from opencv.matlab_syntax import *

    cvStartWindowThread()

    im = imread("pics/airplane.jpg")

    imshow(im)

    python>

    展开全文
  • 抽象类与接口的区别

    2018-12-03 17:11:00
    抽象类和接口都包含可以有子类继承实现的成员,但抽象类是根源的抽象,而接口是动作的抽象。 抽象类的功能要远超过接口,那为什么还要接口呢? 这主要是由于定义抽象类的...抽象类与接口的区别主要有以下几点...

    抽象类接口都包含可以有子类继承实现的成员,但抽象类是对根源的抽象,而接口是对动作的抽象

    抽象类的功能要远超过接口,那为什么还要接口呢?

    这主要是由于定义抽象类的代价高。因为每个类智能继承一个类,在这个类中,必须继承或编写出其中子类的所有共性,因此,虽然接口在功能上会弱化许多,但他只是针对一个动作的描述,而且可以在一个类中同时实现多个接口,这样会降低设计的难度。

    抽象类与接口的区别主要有以下几点:

    1. 子类只能继承一个抽象类,但可以实现任意多个接口;
    2. 一个类要实现一个借口必须实现接口中的所有方法,而抽象类则不必。
    3. 抽象类中的成员变量可以是各种类型,而接口中的成员变量只能是 public static void 型的。
    4. 接口中只能定义抽象方法,而抽象类中可以定义非抽象方法。
    5. 抽象类中可以有静态方法和静态代码块等,接口中不可以。
    6. 接口不能被实例化,没有构造方法,但抽象类可以有构造方法。

    注:抽象类中,构造方法不能被定义成抽象方法

    综上所述可以得下表

    比较项 抽象类 接口
    方法 可以有非抽象方法 所有方法都是抽象方法
    属性 属性中可以有非静态常量 所有属性都是静态常量
    构造方法 有构造方法 无构造方法
    继承 一个类只能继承一个父类 一个类可以同时实现多个接口
    被继承 一个类只能继承一个父类 一个接口可以同时继承多个接口
    展开全文
  • 以下接口文档中参数描述 参数 类型 参数描述 是否为空 备注 transactionId String 保存文件目录名 否 该值为tranactionId(支持中英文)符合java中标识符都支持 MultipartFile File 上传文件 否 ...
  • 在上一节课中,针对接口鉴权功能开发,我们讲了如何进行面向对象分析(OOA),也就是需求分析。实际上,需求定义清楚之后,这个问题就已经解决了一大半,这也是为什么我花了那么多篇幅来讲解需求分析。今天,我们...

    在上一节课中,针对接口鉴权功能的开发,我们讲了如何进行面向对象分析(OOA),也就是需求分析。实际上,需求定义清楚之后,这个问题就已经解决了一大半,这也是为什么我花了那么多篇幅来讲解需求分析。今天,我们再来看一下,针对面向对象分析产出的需求,如何来进行面向对象设计(OOD)和面向对象编程(OOP)。

    如何进行面向对象设计?

    我们知道,面向对象分析的产出是详细的需求描述,那面向对象设计的产出就是类。在面向对象设计环节,我们将需求描述转化为具体的类的设计。我们把这一设计环节拆解细化一下,主要包含以下几个部分:

    ● 划分职责进而识别出有哪些类;

    ● 定义类及其属性和方法;

    ● 定义类与类之间的交互关系;

    ● 将类组装起来并提供执行入口。

    实话讲,不管是面向对象分析还是面向对象设计,理论的东西都不多,所以我们还是结合鉴权这个例子,在实战中体会如何做面向对象设计。1. 划分职责进而识别出有哪些类

    1. 划分职责进而识别出有哪些类

    在面向对象有关书籍中经常讲到,类是现实世界中事物的一个建模。但是,并不是每个需求都能映射到现实世界,也并不是每个类都与现实世界中的事物一一对应。对于一些抽象的概念,我们是无法通过映射现实世界中的事物的方式来定义类的。

    所以,大多数讲面向对象的书籍中,还会讲到另外一种识别类的方法,那就是把需求描述中的名词罗列出来,作为可能的候选类,然后再进行筛选。对于没有经验的初学者来说,这个方法比较简单、明确,可以直接照着做。

    不过,我个人更喜欢另外一种方法,那就是根据需求描述,把其中涉及的功能点,一个一个罗列出来,然后再去看哪些功能点职责相近,操作同样的属性,是否应该归为同一个类。我们来看一下,针对鉴权这个例子,具体该如何来做。

    在上一节课中,我们已经给出了详细的需求描述,为了方便你查看,我把它重新贴在了下面。

    ● 调用方进行接口请求的时候,将 URL、AppID、密码、时间戳拼接在一起,通过加密算法生成 token,并且将 token、AppID、时间戳拼接在 URL 中,一并发送到微服务端。

    ● 微服务端在接收到调用方的接口请求之后,从请求中拆解出 token、AppID、时间戳。

    ● 微服务端首先检查传递过来的时间戳跟当前时间,是否在 token 失效时间窗口内。如果已经超过失效时间,那就算接口调用鉴权失败,拒绝接口调用请求。

    ● 如果 token 验证没有过期失效,微服务端再从自己的存储中,取出 AppID 对应的密码,通过同样的 token 生成算法,生成另外一个 token,与调用方传递过来的 token 进行匹配。如果一致,则鉴权成功,允许接口调用;否则就拒绝接口调用。

    首先,我们要做的是逐句阅读上面的需求描述,拆解成小的功能点,一条一条罗列下来。注意,拆解出来的每个功能点要尽可能的小。每个功能点只负责做一件很小的事情(专业叫法是“单一职责”,后面章节中我们会讲到)。下面是我逐句拆解上述需求描述之后,得到的功能点列表:

    1. 把 URL、AppID、密码、时间戳拼接为一个字符串;

    2. 对字符串通过加密算法加密生成 token;

    3. 将 token、AppID、时间戳拼接到 URL 中,形成新的 URL;

    4. 解析 URL,得到 token、AppID、时间戳等信息;

    5. 从存储中取出 AppID 和对应的密码;

    6. 根据时间戳判断 token 是否过期失效;

    7. 验证两个 token 是否匹配;

    从上面的功能列表中,我们发现,1、2、6、7 都是跟 token 有关,负责 token 的生成、验证;3、4 都是在处理 URL,负责 URL 的拼接、解析;5 是操作 AppID 和密码,负责从存储中读取 AppID 和密码。所以,我们可以粗略地得到三个核心的类:AuthToken、Url、CredentialStorage。AuthToken 负责实现 1、2、6、7 这四个操作;Url 负责 3、4 两个操作;CredentialStorage 负责 5 这个操作。

    当然,这是一个初步的类的划分,其他一些不重要的、边边角角的类,我们可能暂时没法一下子想全,但这也没关系,面向对象分析、设计、编程本来就是一个循环迭代、不断优化的过程。根据需求,我们先给出一个粗糙版本的设计方案,然后基于这样一个基础,再去迭代优化,会更加容易一些,思路也会更加清晰一些。

    不过,我还要再强调一点,接口调用鉴权这个开发需求比较简单,所以,需求对应的面向对象设计并不复杂,识别出来的类也并不多。但如果我们面对的是更加大型的软件开发、更加复杂的需求开发,涉及的功能点可能会很多,对应的类也会比较多,像刚刚那样根据需求逐句罗列功能点的方法,最后会得到一个长长的列表,就会有点凌乱、没有规律。针对这种复杂的需求开发,我们首先要做的是进行模块划分,将需求先简单划分成几个小的、独立的功能模块,然后再在模块内部,应用我们刚刚讲的方法,进行面向对象设计。而模块的划分和识别,跟类的划分和识别,是类似的套路。

    2. 定义类及其属性和方法

    刚刚我们通过分析需求描述,识别出了三个核心的类,它们分别是 AuthToken、Url 和 CredentialStorage。现在我们来看下,每个类都有哪些属性和方法。我们还是从功能点列表中挖掘。

    AuthToken 类相关的功能点有四个:

    ● 把 URL、AppID、密码、时间戳拼接为一个字符串;

    ● 对字符串通过加密算法加密生成 token;

    ● 根据时间戳判断 token 是否过期失效;验证两个 token 是否匹配。

    对于方法的识别,很多面向对象相关的书籍,一般都是这么讲的,识别出需求描述中的动词,作为候选的方法,再进一步过滤筛选。类比一下方法的识别,我们可以把功能点中涉及的名词,作为候选属性,然后同样进行过滤筛选。

    我们可以借用这个思路,根据功能点描述,识别出来 AuthToken 类的属性和方法,如下所示:
    在这里插入图片描述
    从上面的类图中,我们可以发现这样三个小细节。

    ● 第一个细节:并不是所有出现的名词都被定义为类的属性,比如 URL、AppID、密码、时间戳这几个名词,我们把它作为了方法的参数。

    ● 第二个细节:我们还需要挖掘一些没有出现在功能点描述中属性,比如 createTime,expireTimeInterval,它们用在 isExpired() 函数中,用来判定 token 是否过期。

    ● 第三个细节:我们还给 AuthToken 类添加了一个功能点描述中没有提到的方法 getToken()。

    第一个细节告诉我们,从业务模型上来说,不应该属于这个类的属性和方法,不应该被放到这个类里。比如 URL、AppID 这些信息,从业务模型上来说,不应该属于 AuthToken,所以我们不应该放到这个类中。

    第二、第三个细节告诉我们,在设计类具有哪些属性和方法的时候,不能单纯地依赖当下的需求,还要分析这个类从业务模型上来讲,理应具有哪些属性和方法。这样可以一方面保证类定义的完整性,另一方面不仅为当下的需求还为未来的需求做些准备。

    Url 类相关的功能点有两个:

    ● 将 token、AppID、时间戳拼接到 URL 中,形成新的 URL;

    ● 解析 URL,得到 token、AppID、时间戳等信息。

    虽然需求描述中,我们都是以 URL 来代指接口请求,但是,接口请求并不一定是以 URL 的形式来表达,还有可能是 Dubbo、RPC 等其他形式。为了让这个类更加通用,命名更加贴切,我们接下来把它命名为 ApiRequest。下面是我根据功能点描述设计的 ApiRequest 类。

    在这里插入图片描述

    CredentialStorage 类相关的功能点有一个:

    ● 从存储中取出 AppID 和对应的密码。

    CredentialStorage 类非常简单,类图如下所示。为了做到抽象封装具体的存储方式,我们将 CredentialStorage 设计成了接口,基于接口而非具体的实现编程。

    在这里插入图片描述

    3. 定义类与类之间的交互关系

    类与类之间都有哪些交互关系呢?UML 统一建模语言中定义了六种类之间的关系。它们分别是:泛化、实现、关联、聚合、组合、依赖。关系比较多,而且有些还比较相近,比如聚合和组合,接下来我就逐一讲解一下。

    泛化(Generalization)可以简单理解为继承关系。具体到 Java 代码就是下面这样:

    
    public class A { ... }
    public class B extends A { ... }
    

    实现(Realization)一般是指接口和实现类之间的关系。具体到 Java 代码就是下面这样:

    
    public interface A {...}
    public class B implements A { ... }
    

    聚合(Aggregation)是一种包含关系,A 类对象包含 B 类对象,B 类对象的生命周期可以不依赖 A 类对象的生命周期,也就是说可以单独销毁 A 类对象而不影响 B 对象,比如课程与学生之间的关系。具体到 Java 代码就是下面这样:

    
    public class A {
      private B b;
      public A(B b) {
        this.b = b;
      }
    }
    

    组合(Composition)也是一种包含关系。A 类对象包含 B 类对象,B 类对象的生命周期依赖 A 类对象的生命周期,B 类对象不可单独存在,比如鸟与翅膀之间的关系。具体到 Java 代码就是下面这样:

    
    public class A {
      private B b;
      public A() {
        this.b = new B();
      }
    }
    

    关联(Association)是一种非常弱的关系,包含聚合、组合两种关系。具体到代码层面,如果 B 类对象是 A 类的成员变量,那 B 类和 A 类就是关联关系。具体到 Java 代码就是下面这样:

    
    public class A {
      private B b;
      public A(B b) {
        this.b = b;
      }
    }
    或者
    public class A {
      private B b;
      public A() {
        this.b = new B();
      }
    }
    

    依赖(Dependency)是一种比关联关系更加弱的关系,包含关联关系。不管是 B 类对象是 A 类对象的成员变量,还是 A 类的方法使用 B 类对象作为参数或者返回值、局部变量,只要 B 类对象和 A 类对象有任何使用关系,我们都称它们有依赖关系。具体到 Java 代码就是下面这样:

    
    public class A {
      private B b;
      public A(B b) {
        this.b = b;
      }
    }
    或者
    public class A {
      private B b;
      public A() {
        this.b = new B();
      }
    }
    或者
    public class A {
      public void func(B b) { ... }
    }
    

    看完了 UML 六种类关系的详细介绍,不知道你有何感受?我个人觉得这样拆分有点太细,增加了学习成本,对于指导编程开发没有太大意义。所以,我从更加贴近编程的角度,对类与类之间的关系做了调整,只保留了四个关系:泛化、实现、组合、依赖,这样你掌握起来会更加容易。

    其中,泛化、实现、依赖的定义不变,组合关系替代 UML 中组合、聚合、关联三个概念,也就相当于重新命名关联关系为组合关系,并且不再区分 UML 中的组合和聚合两个概念。之所以这样重新命名,是为了跟我们前面讲的“多用组合少用继承”设计原则中的“组合”统一含义。只要 B 类对象是 A 类对象的成员变量,那我们就称,A 类跟 B 类是组合关系。

    理论的东西讲完了,让我们来看一下,刚刚我们定义的类之间都有哪些关系呢?因为目前只有三个核心的类,所以只用到了实现关系,也即 CredentialStorage 和 MysqlCredentialStorage 之间的关系。接下来讲到组装类的时候,我们还会用到依赖关系、组合关系,但是泛化关系暂时没有用到。

    4. 将类组装起来并提供执行入口

    类定义好了,类之间必要的交互关系也设计好了,接下来我们要将所有的类组装在一起,提供一个执行入口。这个入口可能是一个 main() 函数,也可能是一组给外部用的 API 接口。通过这个入口,我们能触发整个代码跑起来。

    接口鉴权并不是一个独立运行的系统,而是一个集成在系统上运行的组件,所以,我们封装所有的实现细节,设计了一个最顶层的 ApiAuthenticator 接口类,暴露一组给外部调用者使用的 API 接口,作为触发执行鉴权逻辑的入口。具体的类的设计如下所示:

    在这里插入图片描述

    如何进行面向对象编程?

    面向对象设计完成之后,我们已经定义清晰了类、属性、方法、类之间的交互,并且将所有的类组装起来,提供了统一的执行入口。接下来,面向对象编程的工作,就是将这些设计思路翻译成代码实现。有了前面的类图,这部分工作相对来说就比较简单了。所以,这里我只给出比较复杂的 ApiAuthenticator 的实现。

    对于 AuthToken、ApiRequest、CredentialStorage 这三个类,在这里我就不给出具体的代码实现了。给你留一个课后作业,你可以试着把整个鉴权框架自己去实现一遍。

    
    public interface ApiAuthenticator {
      void auth(String url);
      void auth(ApiRequest apiRequest);
    }
    
    public class DefaultApiAuthenticatorImpl implements ApiAuthenticator {
      private CredentialStorage credentialStorage;
      
      public DefaultApiAuthenticatorImpl() {
        this.credentialStorage = new MysqlCredentialStorage();
      }
      
      public DefaultApiAuthenticatorImpl(CredentialStorage credentialStorage) {
        this.credentialStorage = credentialStorage;
      }
    
      @Override
      public void auth(String url) {
        ApiRequest apiRequest = ApiRequest.buildFromUrl(url);
        auth(apiRequest);
      }
    
      @Override
      public void auth(ApiRequest apiRequest) {
        String appId = apiRequest.getAppId();
        String token = apiRequest.getToken();
        long timestamp = apiRequest.getTimestamp();
        String originalUrl = apiRequest.getOriginalUrl();
    
        AuthToken clientAuthToken = new AuthToken(token, timestamp);
        if (clientAuthToken.isExpired()) {
          throw new RuntimeException("Token is expired.");
        }
    
        String password = credentialStorage.getPasswordByAppId(appId);
        AuthToken serverAuthToken = AuthToken.generate(originalUrl, appId, password, timestamp);
        if (!serverAuthToken.match(clientAuthToken)) {
          throw new RuntimeException("Token verfication failed.");
        }
      }
    }
    

    辩证思考与灵活应用

    在之前的讲解中,面向对象分析、设计、实现,每个环节的界限划分都比较清楚。而且,设计和实现基本上是按照功能点的描述,逐句照着翻译过来的。这样做的好处是先做什么、后做什么,非常清晰、明确,有章可循,即便是没有太多设计经验的初级工程师,都可以按部就班地参照着这个流程来做分析、设计和实现。

    不过,在平时的工作中,大部分程序员往往都是在脑子里或者草纸上完成面向对象分析和设计,然后就开始写代码了,边写边思考边重构,并不会严格地按照刚刚的流程来执行。而且,说实话,即便我们在写代码之前,花很多时间做分析和设计,绘制出完美的类图、UML 图,也不可能把每个细节、交互都想得很清楚。在落实到代码的时候,我们还是要反复迭代、重构、打破重写。

    毕竟,整个软件开发本来就是一个迭代、修修补补、遇到问题解决问题的过程,是一个不断重构的过程。我们没法严格地按照顺序执行各个步骤。这就类似你去学驾照,驾校教的都是比较正规的流程,先做什么,后做什么,你只要照着做就能顺利倒车入库,但实际上,等你开熟练了,倒车入库很多时候靠的都是经验和感觉。

    展开全文
  • REST 接口

    2020-11-25 21:51:25
    在设计web接口的时候,REST主要是用于定义接口名,接口名一般是用名词写,不用动词,那怎么表达“获取”或者“删除”或者“更新”这样的操作呢——用请求类型来区分。 比如,我们有一个friends接口,对于“朋友”...

    REST 接口

    在请求层面,REST 规范可以简单粗暴抽象成以下两个规则:
    url定位资源
    请求的method是对这个资源的操作。
    知乎大神Ivony有句话说的好:
    URL定位资源,用HTTP动词(GET,POST,DELETE,DETC)描述操作
    在设计web接口的时候,REST主要是用于定义接口名,接口名一般是用名词写,不用动词,那怎么表达“获取”或者“删除”或者“更新”这样的操作呢——用请求类型来区分。
    比如,我们有一个friends接口,对于“朋友”我们有增删改查四种操作,怎么定义REST接口?

    增加一个朋友,uri: generalcode.cn/v1/friends 接口类型:POST
    
    删除一个朋友,uri: generalcode.cn/va/friends 接口类型:DELETE
    
    修改一个朋友,uri: generalcode.cn/va/friends 接口类型:PUT
    
    查找朋友,uri: generalcode.cn/va/friends 接口类型:GET
    

    API请求方法

    在很多系统中,几乎只用 GET 和 POST 方法来完成了所有的接口操作;这个行为类似于全用 DIV 来布局。实际上,我们不只有GET 和 POST 可用,在 REST 架构中,有以下几个重要的请求方法:GET,POST,PUT,PATCH,DELETE。这几个方法都可以与对数据的 CRUD 操作对应起来。
    【Read】,资源的读取,用 GET 请求;比如:

    GET /api/users  ( 表示读取用户列表)
    

    【Created】,资源的创建,用 POST 方法;POST 是一个非幂等的方法,多次调用会造成不同效果;
    【Update】,资源的更新。用于更新的 HTTP 方法有两个,PUT 和 PATCH。
    他们都应当被实现为幂等方法,即多次同样的更新请求应当对服务器产生同样的副作用。

    PUT 和 PATCH 有各自不同的使用场景:

    PUT 用于更新资源的全部信息,在请求的 body 中需要传入修改后的全部资源主体;

    而 PATCH 用于局部更新,在 body 中只需要传入需要改动的资源字段。

    【Delete】,资源的删除,相应的请求 HTTP 方法就是 DELETE。这个也应当被实现为一个幂等的方法。

    状态码

    服务器向用户返回的状态码和提示信息,常见的有以下一些(方括号中是该状态码对应的HTTP动词)。

    • 200 OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。
    • 201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。
    • 202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务)
    • 204 NO CONTENT - [DELETE]:用户删除数据成功。
    • 400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的。
    • 401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。
    • 403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。
    • 404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。
    • 406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。
    • 410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。
    • 422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。
    • 500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。

    返回结果

    针对不同操作,服务器向用户返回的结果应该符合以下规范。

    • GET /collection:返回资源对象的列表(数组)
    • GET /collection/resource:返回单个资源对象
    • POST /collection:返回新生成的资源对象
    • PUT /collection/resource:返回完整的资源对象
    • PATCH /collection/resource:返回完整的资源对象
    • DELETE /collection/resource:返回一个空文档
    展开全文
  • 接口隔离原则

    2020-09-19 14:03:38
    接口隔离原则 接口隔离原则:是指用多个专门的接口,...下面我们来看一段代码,一个动物行为进行抽象描述: IEatAnimal接口的代码如下: public interface IEatAnimal { void eat(); } IFlyAnimal接口的代码如下:
  • 工具描述cURL是利用URL语法在命令行方式下工作文件传输工具,是开源爱好者编写维护免费工具,支持包括Windows、Linux、Mac等数十个操作系统,最新版本为7.27.0,但是我推荐大家使用7.26.0,从这里可以下载7.26.0...
  • 深入理解Java之接口

    2020-12-22 22:21:23
     Java中的接口是一组需求的描述。例如,以下是Comparable接口的定义:  public interface Comparable<T> {  int compareTo(T o);  }  Comparable接口中定义了一个compareTo方法,这个方法是它所描述的...
  • Spring Aware接口

    2018-11-28 08:23:17
    容器管理的 Bean 一般不需要了解容器的状态和直接使用容器, 但是在某些情况下, 是需要在 Bean 中直接IOC容器进行操作的, 可以通过特定的 Aware 接口来完成....实现了这个接口的类都可以获取到一个 ApplicationC...
  • 为了更好了解自动化测试框架,应该对以下几种自动化测试框架思想有一定认知: 模块化思想 库思想 数据驱动思想 关键字驱动思想 以上仅仅是代表了一种自动化测试思想,并不能定义为框架。 上面讲到框架=思想+...
  • Java——接口

    2020-12-01 11:30:00
    4.接口方法是抽象方法,是同一个行为不同描述。抽象方法没有方法体。 5.接口不能创建对象,但是可以作为一个单独类型出现 6.使用接口时按以下步骤进行 1、创建一个类实现接口 关键字: implements ...
  • REST 接口学习

    2018-07-30 11:57:00
    一、REST 接口 在请求层面,REST 规范可以简单粗暴抽象成以下两个规则: 请求 API 的 URL 表示用来定位资源;...在设计web接口的时候,REST主要是用于定义接口名,接口名一般是用名词写,不用动词,那怎么...
  • 内容简介:本文描述了如何通过一系简单...对以下技术进行了深入讨论:内存管理技术、TCP/IP连网技术,虚拟机与宿主代码的接口技术。总而言之,能在一个商业化运行时系统里找到技术都在HEC虚拟机系统里有所体现。
  • 抽象类和接口的区别

    2017-11-03 21:02:02
    从用户角度描述系统功能,并指各功能操作者。 创建用例模型包括三部分内容: 1. 识别出系统中角色和用例 1)如何从系统中识别出角色 参考以下问题: a. 谁将使用系统主要功能? b. 谁需要系统支持以完成其...
  • InputFormat 主要用于描述输入数据格式, 它提供以下两个功能。❑数据切分:按照某个策略将输入数据切分成若干个 split, 以便确定 Map Task 个数以及对应 split。❑为 Mapper 提供输入数据: 给定某个 split, ...
  • 基础配置已在上篇文章中进行了详细描述,本篇不做过多叙述,以下代码直接贴在MyGetMethod文件中 RequestMapping部分保持不变 for (Cookie cookie:cookies)内部分,取到cookies信息做校验 ...
  • 下图是Sun站点上JNI的基本结构的描述。JNI是Java语言的本地编程接口,是J2SDK的一部分。在java程序中,我们可以通过JNI实现一些用java语言不便实现的功能。通常有以下几种情况我们需要使用JNI来实现。·标准的java...
  • 深入理解Java接口

    千次阅读 2016-03-20 22:20:06
    例如,以下是Comparable接口的定义: public interface Comparable { int compareTo(T o); }  Comparable接口中定义了一个compareTo方法,这个方法就是它所描述的需求。若我们想调用Arrays.sort方法一个People...
  • 如果你比较细心的话,你还会发现我们在 PHP 中定义的方法和在 Java 中定义的接口的名字的大小写有点不同,但是仍然可以正常调用。是的,PHPRPC 发布的方法是不区分大小写的。所以不论你所使用的语言是否区分大小写,...
  • 如果你比较细心的话,你还会发现我们在 PHP 中定义的方法和在 Java 中定义的接口的名字的大小写有点不同,但是仍然可以正常调用。是的,PHPRPC 发布的方法是不区分大小写的。所以不论你所使用的语言是否区分大小写,...
  • 如果你比较细心的话,你还会发现我们在 PHP 中定义的方法和在 Java 中定义的接口的名字的大小写有点不同,但是仍然可以正常调用。是的,PHPRPC 发布的方法是不区分大小写的。所以不论你所使用的语言是否区分大小写,...
  • 项目描述:最近从java转来学习FastApi,想要快速搭建一个FastApi+mysql后端接口框架,但是网上没有找到demo,所以自己简单写了一个,做了一些简单封装,希望和我一样新学者有所帮助。功能涵盖:1.使用数据源...
  • 该库是PlaceOSTypescript接口 汇编 使用命令安装依赖项后,可以从源代码构建库 npm run build 用法 API文档可在找到 您可以使用npm命令安装PlaceOS Typescript客户端 npm install --save-dev @placeos/ts-client ...
  • 以下《JAVA 核心技术 卷1 基础知识第十版》接口部分重温和总结,如有错误等,敬请谅解,欢迎指正: 1.接口是什么? 接口一组需求描述,类遵循接口描述的同一格式进行定义。 接口是没有实例域...
  • 以下是小编整理PHP高级开发工程师工作职责描述。 PHP高级开发工程师工作职责描述1 职责: 1、负责移动端(安卓,苹果)接口方面开发和服务器安装部署; 2、能自己编写代码进行自测并保证一定代码质量...
  • 以下是小编整理php开发主管主要职责描述。 php开发主管主要职责描述1 职责: 1、负责公司电商网站和ERP企业管理系统新功能设计和开发; 2、参与B2C商城、会员论坛网站、微信小程序设计开发; 2、负责微信...
  • 工具描述 cURL是利用URL语法在命令行方式下工作文件传输工具,是开源爱好者编写维护...以下是官方介绍翻译: cURL是一个使用URL语法来传输数据命令行工具,支持DICT,FILE,FTP,FTPS,GOPHER,HTTP,HT...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 760
精华内容 304
热门标签
关键字:

以下对接口的描述