为什么Retrofit会宣传为“Type Safe”库?

问题描述 投票:17回答:5

我刚刚通过他们的main page,它说,

适用于Android和Java的类型安全的HTTP客户端

为什么Retrofit将自己宣传为Type Safe,而其他图书馆(许多其他受欢迎的图书馆)则没有?

在你回答之前......

这个问题here有一个答案。它说,

类型安全性是编程语言阻止或防止类型错误的程度。类型错误是由程序的常量,变量和方法(函数)的不同数据类型之间的差异引起的错误或不期望的程序行为,例如,将整数(int)视为浮点数(浮点数)。这在静态类型语言(如Java和C)中很常见

因此,Retrofit可以防止此类错误

如果这确实是答案,那么许多库会阻止这些类型的错误,但它们都没有宣传为类型安全。那是营销吗?

我认为上述答案不充分,因为类型安全的定义尚未得到认真对待。

无论如何,有another post与类型安全的定义。他们给出了例子:

类型安全意味着编译器将在编译时验证类型,如果尝试将错误的类型分配给变量,则抛出错误。

一些简单的例子:

// Fails, Trying to put an integer in a string
String one = 1;
// Also fails.
int foo = "bar";

这也适用于方法参数,因为您将显式类型传递给它们:

int AddTwoNumbers(int a, int b)
{
    return a + b;
}

如果我尝试使用以下方法调用:

int Sum = AddTwoNumbers(5, "5");

根据上面的定义,它将是语言(Java),而不是特定于TypeSafe的库。

所以,我再次问,为什么Retrofit将自己宣传为类型安全库?

java android retrofit retrofit2 type-safety
5个回答
5
投票

我并没有过多考虑它,但从我开始使用Retrofit的那一刻起,我就把这个标题理解为在更高抽象层上的类型安全,而不是其他人在这里讨论的。

通常我们将编程语言作为存在或不存在类型安全的“目标”。我认为这不是Retrofit的标题类型安全的情况;)如果我们假装整个HTTP调用是一个单一的编程语言指令(可能有一些参数和值),那么我们确实可以说Retrofit是类型 - 安全...你已经严格定义了你得到了什么样的结果......你得到的这个或者没有/错误。当然错误是在运行时,因为你永远不会真正知道将从互联网上检索什么。当然,许多其他图书馆可以做到这一点,而不仅仅是改造。当然,您可以通过使用ResponseBody类型的返回值(可以接受任何内容)定义服务来误导Retrofit的类型安全性。但一般来说,开箱即用,您将获得库,它将检查,解析,验证HTTP调用的响应,转换为适当的类型,如果有任何问题 - 将给您一个错误。

我现在脑子里的简单类比(就类型安全的口号而言):

  • 编程语言有:指令+参数'和值类型

  • 改造有:http电话+身体和响应的结构

最诚挚的问候,Darek


4
投票

我的猜测是因为您可以将自定义类用作请求Body,例如

@GET("/token")
Call<Token> getToken(@Body Credentials credentials);

而且你并不总是需要创建一个String。因为String将在引擎盖下创建,但你永远不必触摸它。


4
投票

让我们首先简要介绍一下如何使用Retrofit发出请求并获得响应。通常你会这样做:

@GET("user/images")
Call<UserImage> getUserImage();

然后有一个像这样的模型类来保持响应:

public class UserImage  {

     @SerializedName("ImgId")
     private int userImageId;

     @SerializedName("ImgName")
     private String userImageName;

     //and so on...
}

借用你的问题 -

类型错误是由程序的常量,变量和方法(函数)的不同数据类型之间的差异引起的错误或不期望的程序行为,例如,将整数(int)视为浮点数(浮点数)。

我相信Retrofit称自己为类型安全的http客户端的原因是因为它不允许您调用不会像您定义的那样返回确切响应的API。例如,如果您的API响应使用“ImageId”而不是“ImgId”(参考上面的示例),则Retrofit将不允许它。我相信这是Retrofit所指的类型安全,即特定于序列化和反序列化的类型安全,而不仅仅是将int作为float等处理,这使得它不仅仅是Java提供的东西。

希望这可以帮助。


4
投票

看看Retrofit project's cover page,似乎类型安全中的类型是指请求体和响应体对象。

我们必须记住,Retrofit是建立在OKHttp之上的,它只能处理RequestBodyResponseBody对象。 Retrofit以其使用Converters安全地将这些类型序列化为其他类型和从其他类型序列化的能力而自豪。

类型安全的安全性是指在构建RequestBody和解析ResponseBody对象时,Retrofit处理所有样板代码以确保正确的类型转换。 Retrofit附带了几个内置的Converters,它包含流行的序列化库,如GSon和Jackson。

TL; DR

前面提到的类型安全性是Retrofit,它负责构建HTTP请求并解析DTO之外的HTTP响应。

作为开发人员,您可以像往常一样继续使用您选择的序列化库,而不必担心您对该主题的关注。


2
投票

Retrofit将其声明为类型安全的原因直接链接到整个实现被反映和注释的事实。它处理请求正文和响应请求数据的所有转换。它不允许来自任何服务器的响应类型不匹配。因此Type Safe,请记住改造的本质是HTTp api,用于客户端和服务器之间的严格合同。

类型安全与原始或对象结构无关,正如规范性观点所暗示的那样,而是网络响应请求机构的构造和约束。

© www.soinside.com 2019 - 2024. All rights reserved.