Tag: api

具有Kitura编码路由的服务器端Swift CRUD API

Kitura是IBM创建的服务器端Swift Web框架。 它已获得MIT许可,免费使用,并且源代码是开放源代码。 最近,随着2.0版本的发布,Kitura团队引入了新的Codable Routes功能,这使开发人员可以非常轻松地使用Swift 4 Codable自动处理URL请求和响应。 Swift 4引入了Codable协议,这意味着实现Codable协议的类型能够将其属性解码和编码为任何外部表示形式,例如JSON。 在语言级别上,许多原始数据类型(例如Int,String,Double,Data,URL)已经是Codable类型,包含Codable类型的Array和Dictionary也已经是Codable类型。 struct TodoItem:可编码{ var id:字符串 var标题:字符串 var内容:字符串 } //将TodoItem结构编码为JSON数据 让todoItem = TodoItem(id:“ 1”,标题:“ hello”,内容:“ world”) 让jsonData =试试! JSONEncoder.encode(todoItem)//将JSON数据解码为TodoItem结构 让todoItem2 =试试! JSONDecoder.decode(TodoItem.self,来自:jsonData) 使用内置的JSONEncoder和JSONDecoder类的Swift,从JSON编码和解码可编码对象,反之亦然。 使用Codable,我们不必手动解析JSON或使用第三方库(如SwiftyJSON)进行解析。 可编码的工作就像魔术一样。 使用Kitura Codable Routes,我们可以创建一个Router终结点方法,该方法接受请求的Codable对象,并将完成闭合传递给该Codable对象作为响应。 作为开发人员,我们不再需要手动编写编码和解码逻辑。 要查看所有这些操作,让我们使用内存数据存储区为TodoItem构建一个CRUD API。 进口Kitura 导入KituraContractsstruct TodoItem:可编码{ var id:字符串 var标题:字符串 var detail:字符串 } var todos = [ TodoItem(id:“ 1”,标题:“清理房子”,详细信息:“我的房子”), TodoItem(id:“ […]

Apple开发中的库,API,框架和SDK之间的关系。

有时我们会像类似元素一样谈论库,API和框架。 因此,我想简单地解释它们各自的含义以及它们之间的相互关系,以便您更好地理解它们。 此外,重要的是要知道SDK是Apple操作系统中的重要元素。 来吧,让我们说清楚! 图书馆 库是保存预编写代码的地方,可以调用这些代码来帮助您更快更轻松地完成工作。 该库基本上是一组元素,例如函数,类,常量,变量等,您可以在项目中使用它们来创建应用程序。 例子: Swift标准库解决了复杂的问题,并允许您编写高性能的可读代码。 这些库是用Swift编写程序的基本功能层,它们是为Swift设计的并以这种编程语言处理的一组数据类型和功能。 如果您用引号引起来的文本,例如“我喜欢制作原型”,那么Xcode将借助Swift标准库将其作为字符串进行处理。 如果输入: let a:Int = 10 ,则程序会将其解释为不带小数的整数。 例如: let sum = a + 1的结果为11。如果尝试使用let sum = a + 0.5 ,则会显示错误,因为编译器不允许常量和包含小数点后的数字。 但是,如果您编写: let b:Double = 10 ,程序将知道该数字可以有小数。 因此,如果您添加十进制值,例如: let add = b + 0.5 ,则结果为10.5。 API API(应用程序编程接口)是您的代码与一个或多个库之间的连接。 它与它所连接的库的版本有一定距离。 另外,API不包含实现细节。 例如,可能有多个库可以使用十进制Double或Float,并且每个库都有针对这些数字类型的完整实现。 尽管程序的API不会改变,但在这种情况下,会添加小数的API取决于您所使用的设备和操作系统,您将使用一个库或另一个库(对于macOS或iOs),具体取决于API。 例子: Apple Music API是音乐服务网络的一部分。 使用Apple […]

如何在IOS App中监视网络请求

在这篇文章中,让我们看看如何在IOS swift应用程序中监视和调试网络请求。 在此演示中,使用了Swift 4.1。 让我们从创建一个新的IOS swift项目开始。 现在,打开Storyboard并创建一个新按钮,然后通过创建一个动作函数将其连接到ViewController。 现在,我们创建一个名为requestData()的方法,在其中编写所有网络代码。 让我们使用session.dataTask() 现在让我们创建一个URL。 转到Intercept.rest并创建一个新的Intercept帐户。 通过提供端点URL作为所需的API URL来创建新的拦截器,然后单击“ 创建”按钮。 现在,复制已生成的新URL 。 现在打开代码,并将新生成的URL粘贴为常量URL的值,然后运行该应用程序。 按下我们创建的按钮,同时检查拦截器仪表板。 现在,您可以监视所有网络请求。 按下“扩展”按钮以查看完整的JSON响应。 Intercept.rest使您可以调试和监视API请求和响应。 它类似于Chrome开发者工具中的“网络”标签,但适用于任何API:移动应用,网络挂钩,前端等。

在Swift 5中编写可扩展的API客户端

对于本文,我们决定为Marvel API编写一个客户端。 在深入研究代码之前,让我们解释一下为什么选择它: 它是开放的 。 去获得一个API密钥! 它很大 。 否则,为什么要建立一个可扩展的客户端? 是真的 。 迫使我们处理丑陋的现实细节。 这是一致的 。 好的,我们不需要太多丑陋的细节,我们也需要系统的实现。 它有一个很棒的API测试器 。 文档非常丰富,此在线工具使测试我们的代码变得非常容易。 太酷了 。 😎 在本文的其余部分,我们将使用Swift Playgrounds对该API进行试验。 如果您真的想对它有用,请推荐使用Karumi的MarvelApiClient。 功能性无状态核心周围的有状态外壳 定义组件接口时,一个很好的规则是使您的设计基于无状态类型,且其值语义不会产生任何副作用。 拥有该核心后,您可以创建另一个将这些类型映射到实际副作用的类型。 我们的API客户端组件将围绕三种类型构建: APIRequest :将创建JSON请求的值类型。 APIResponse :将从JSON响应中创建的值类型。 APIClient :将接收请求,将其发送到服务器,然后通过回调通知调用方。 最后一种似乎比其他类型更混乱! 好吧,这就是我们的有状态外壳,它将是处理这种混乱状态的外壳。 实际上,该组件将与大多数细节无关,而您几乎不需要更改它。 APIClient初始接口 基于先前的想法,我们可能会从以下内容开始: 让我们从更改APIRequest协议开始: Decodable协议为我们做了很多工作! 您是否注意到ID是非可选的? 因此,如果我们遇到格式不正确的ComicCharacter ,则会引发错误,并且我们将能够以我们认为合适的任何方式对其进行处理。 但是,那里还有另一种类型。 查看Image类型? 在任何Apple框架中都没有定义,这是我们定义的自定义类型。 让我们看一下它的代码: 由于某种原因,Marvel API决定发送分为路径和扩展名的图像URL。 我们不希望将此解析细节公开给我们的业务逻辑层,因此我们尝试从该输入中构建正确的URL。 由于我们的输入和输出不匹配,因此我们必须走很长的路,并完全实现Decodable 。 这意味着定义一个CodingKey枚举和一个init 。 […]

服务器端Swift中带有Codables的类型化路由-完美

Swift 4中Codables的引入使我们的生活更加轻松😊,我们不再需要使用解析和映射库或编写冗长的代码来提取/生成JSON等数据结构。 完美的框架适应了Codables,因此我们可以创建类型化的路由,以便在Server Side Swift中轻松解码和编码请求和响应。 让我们从创建一个返回服务器主路由的函数开始。 启动服务器时,只需调用此函数即可设置服务器的路由。 众所周知,从上面可以看到,定义路由的方法有很多,这里我将解释四种不同的方法: 异步路由(未输入!) 同步输入的路线 将类型化的路由与自定义HTTPResponse内容同步 具有自定义HTTPResponse内容和Promise的异步类型的路由 有更多的方法来定义路线,但是研究这些类别将使您对如何混合和匹配不同的方法有一个很好的了解。 添加了选件路线以支持SPA飞行前呼叫 异步路由(未输入!) 尽管这些类型的路由是灵活且异步的,但它们不是安全类型! 😬 此处理程序的路由定义为: routes.add(method: .get, uri: “/api/v1/user/logout”, handler: logout) 假设我们需要从请求中提取数据,我们需要首先提取postBodyString,然后将其解码为我们的模式,如下所示: 另外,在这种情况下,我们可以在响应正文中以JSON形式返回任何内容,并且由于处理程序函数不返回任何内容,因此尚不清楚此API将返回什么。 使用Codables,我们可以减少冗长和输入安全! 同步类型路由 当我们不需要调用任何异步方法(例如,使用PerfectCURL调用其他API)但我们正在寻找类型安全性时,这些类型的路由很有用! 😊 此处理程序的路由定义为: routes.add(TRoute(method: .get, uri: “/healthcheck”, handler: healthCheck)) 查看方法的签名,我们可以轻松地找到已经可编码的返回类型,而无需从中生成JSON! 具有自定义HTTPResponse内容的同步类型路由 这些类型的路由类似于上一类,但是从某种意义上说,它们在我们可以操纵响应内容(例如标头,http状态等)方面更加灵活。 此处理程序的路由定义为: routes.add(TRoute(method: .get, uri: “/api/v1/user/session”, handler: session)) 具有自定义HTTPResponse内容和承诺的异步类型的路由 在大多数情况下,我们创建的API比返回JSON更为复杂。 例如,当我们实现登录API时,我们需要针对数据库检查用户名和密码,或者我们可以异步调用其他一些API。 使用HTTPResponse Content and Promises满足异步类型的路由 。 […]

带有Rage的iOS中的实用网络

这篇文章是关于Rage的,Rage是我们的库,用于抽象iOS中的API实现。 如今,很少有移动应用程序没有API。 因此,我们必须每次为每个新项目创建网络层。 从移动开发的角度来看,我们看到每个后端的实现方式有何不同。 它在很大程度上取决于所选的服务器技术,例如严格且可预测的Java和.net,灵活且不同的node.js,ruby和python。 同时,在处理移动应用程序时,我们始终具有相同的技术堆栈,并且我们希望拥有清晰可预测的代码,每个项目看起来都相似。 世界状况 当您从Android世界过渡到iOS开发领域时,您将不可避免地对这里非常流行的模式感到惊讶。 出于联网目的,Apple的URLSession相当不错,但是许多项目仍使用Alamofire (它是AFNetworking的后继产品) 。 有Moya ,它比Alamofire更高 。 Moya很不错,我们在某些项目中使用了它。 它有充分的文档证明和测试,但是它的枚举滥用语法是我们无法忍受的。 在相同的枚举中,API描述立即变成大量的开关盒。 单个请求的每个参数都在其自己的位置描述,当您尝试了解单个请求的所有内容时,这确实令人困惑。 我们接受Moya的意识形态认可,但这会影响我们的生产力。 有时候,看起来像莫亚(Moya)自己陷入了困境。 Android世界的主要流行词是OkHttp , Retrofit和Moshi 。 没有人质疑他们为什么这么好。 我们也自然希望在iOS中也有这样的事情。 Swift没有我们在Java / Kotlin中常用的注释处理,因此在此处进行直接类似并不容易。 据说, Swift 4解决了JSON问题。 OkHttp为网络请求规范提出了一种不错的构建器样式语法。 Retrofit提出了一种描述请求列表的方法,如何对数据进行序列化/反序列化以及应使用哪个http客户端进行请求。 愤怒 愤怒做了类似的事情。 这是我们的库,使API规范更具可读性和更清晰。 我们努力减少错误,并力争拥有高定制能力。 这就是我们创建Rage的原因 。 我们之所以给该库起这个名字,是因为在使用该库之前在iOS应用中实现API时必须处理的所有事情。 基本上,我们可以将网络层表示为请求描述列表以及有关一般如何发出请求(即客户端)的信息。 客户发出请求。 它知道有关所有请求的常规信息。 每个请求都有其自己的特定参数。 至此,我们为客户端提供了以下参数: 基本网址 基本ContentType URLSessionConfiguration 一些插件,例如记录器 所有请求的标题 请求授权流程说明 这是我们对每个特定请求的要求: 网址 内容类型 […]

如何使Swagger Codegen为您的团队工作

Swagger Codegen是开源API客户端代码生成器,对于您的团队而言,它可以成为功能极其强大,节省时间的协作工具。 与大多数功能强大的工具一样,它可能无法立即满足您的需求。 为了让Swagger Codegen真正为您和您的团队工作,了解Swagger Codegen的工作方式将很有帮助。 但是,首先您可能会问,为什么? “我们鼓励您开发程序员的三大美德: 懒惰,不耐烦和傲慢。” — LarryWall,O’Reilly And Associates的ProgrammingPerl(第一版) 在讨论代码生成工具时,我会一开始就不提拉里·沃尔(Larry Wall)的“程序员的三种美德”。可以为懒惰辩护。 在这种情况下,懒惰由拉里·沃尔(Larry Wall)在其著名的《 编程Perl》一书的词汇表中解释为:“使您尽全力减少总体能源消耗的质量。 它使您可以编写省力的程序,其他人会发现它有用……” 现在,当拉里·沃尔(Larry Wall)赞扬程序员懒惰的优点时,他并不是指偷工减料和做懒惰的事情,例如不编写单元测试。 拉里·沃尔(Larry Wall)对懒惰的定义在任何情况下都不应视为对懒惰的辩护。 但是,如果您正确地做到了“懒惰”,并且希望您在阅读本文后会如此,那么使用Swagger Codegen不仅意味着减少自己的能源消耗,而且还意味着团队中所有成员的能源消耗减少。 您无需编写,维护或担心自动生成的代码的一致性! 您可以节省工作和精力,例如编写有关代码生成的博客。 😇 但是,等等,在我们开始凭空生成代码之前,我们必须谈论作为团队达到目标所需要的东西。 OpenAPI规范(以前称为Swagger规范)是“与RESTful API无关的语言的接口 ”,它使各种精通不同编程语言的开发人员可以以每个人都能理解的方式讨论REST API。 该规范允许开发人员创建合同,该合同定义API的工作方式以及应该在任何人编写一行代码之前执行的操作。 这样一来,将创建并维护API的开发人员及其客户就非常特定的合同达成协议,并说:“如果我将带有这些标头的正文发布到此端点,那么我期望以这种格式进行响应。” 举一个具体的例子,我邀请您查看此PetAPI应用程序的OpenAPI规范。 当您了解有关OpenAPI规范的更多信息时,Pet Store示例就是一个非常熟悉的示例。 这是每个开发人员为每种新语言实现代码生成规则时使用的参考点。 集成测试始终根据OpenAPI Initiative的Github Repo中的OpenAPI规范执行。 简要回顾一下`petstore.yaml`我们可以看到已经定义了一个简单但完整的API。 根据此规范中定义的要求,我们可以实现一个后端服务,该服务返回数据库中所有宠物的列表,或将新宠物写入数据库,然后发布到API。 在前端,我们可以构建与API交互所需的模型,并实现可用于调用端点以获取新宠物或发布新宠物的正确服务。 我们可以做所有的事情……但是作为“懒惰”程序员,我们可以使用Swagger Codegen代替它! 在使用Swagger Codegen之前,您需要在本地安装它。 有多种不同的方式来安装和使用Swagger Codegen。 为了最大程度地控制修改项目以适应我们的需求(并与该博客一起进行),获取Swagger Codegen的最佳方法是克隆整个存储库:https://github.com/ swagger-api / […]

我如何建立我的第一个开源库

上周,我发布了我的第一个开源库QuickTicker。 这是一个Swift库,可让您使用一行代码创建简单的股票行情动画。 结果看起来像这样: 在这篇文章中,我想谈谈这个项目并介绍: 为什么我创建这个图书馆 我是如何构建的(编码部分) 最终详细信息(示例项目,单元测试,README.md,Cocoapods) 要点和一般建议摘要(又名TLDR) 从一个明显的问题开始,我决定构建该库的原因是因为无论如何我通常最终都会将此功能集成到大多数项目中。 因此,我想我也可以使其更通用一些,然后将其打包到一个可以轻松添加到任何项目的库中,而不是在项目之间复制和粘贴代码。 构建此库对我来说也是一个机会,使我可以练习有关API的思考并练习构建模块化代码,同时隐藏实现细节。 我还必须使用泛型,而以前的任何项目都没有使用过泛型! 当我开始这个项目时,我的目标是建立一个简单的库,使您可以为类似于上面的gif的标签制作动画。 我最终在整个项目过程中添加了一些其他功能,尽管核心概念仍然相同。 这是我最终获得的功能列表: 仅使用一行代码即可开始制作动画 任何使用过UIView动画方法的人都熟悉的语法 接受任何数值作为最终值,您无需转换或打字 即使在同一标签中混有数字的文本也可以使用。 文本保持完整而数字动画化👍 完成处理程序可让您安全地将动画后的动作排队 您可以选择指定标签的动画曲线和小数点 可同时在UILabel和UITextField上使用(我打算稍后进行扩展) 标签动画是该库的主要目的,是我从Brian Voong的youtube视频中学到的东西。 在视频中,Brian讨论了CADisplayLink,以及如何使用它在UILabel中为文本设置动画以创建计数器和其他类似效果。 CADisplayLink正常工作,需要一些样板代码(包括选择器和@objc方法),而我认为该库可能会有用。 在继续之前,我想提到Daniel Kennett在Swift&Fika 2018上发表的关于API设计的演讲。 在该演讲中,Daniel谈到了API边界 ,这是API代码和用户代码之间的界线 。 作为API设计人员,您可以选择边界的去向,而这个决定可能会产生很大的影响。 边界越接近用户代码,您作为API设计人员要做的工作就越多。 作为回报,该API对于用户而言变得更加容易实现(请以其简单的安装过程来思考Crashlytics)。 丹尼尔展示了这张图片来传达这一点: 另一方面,如果您决定将边界放置在离代码更近的地方,那么最终您将不得不编写更少的代码,但是却为用户提供了更多的工作。 作为回报,他们通常最终会对API拥有更多控制权。 Daniel提供了Spotify元数据的示例: 我认为这两种方法都不对。 这完全取决于您要使用API​​来完成的工作。 就QuickTicker而言,我的目标是使用户入门尽可能简单,理想情况下是单行函数调用。 因此,我有兴趣制作与第一张图片(Crashlytics)更相似的图片。 该库的早期版本未使用专用类型。 相反,我将其构建为UILabel类型的扩展(如果您好奇它的外观,仍然可以在github的早期提交中看到它)。 因此,您可以直接在标签上使用点语法来调用API,如下所示: 让someLabel = UILabel()someLabel.startTicker(持续时间:2,最终值:250) 对于这种方法,我有些不满意的地方。 我不是扩展整个UILabel类型的忠实拥护者,因为当他们可能只需要为一个或两个标签设置动画时,我不想为用户污染所有UILabel的名称空间。 这种方法还意味着,如果不复制所有代码,就无法将相同的功能扩展到其他类型,例如UITextField。 顺便说一句,在早期的类型扩展试验中,我了解到实际上可以在Swift中为类型扩展添加存储的参数。 为此,您必须将计算所得的属性定义为关联的对象,然后使用关联键访问该对象,关联键是指向该关联的唯一指针。 […]

Oracle如何用UNDERSCORE欺骗我两个月

tldr; 我当时集成了Oracle的移动推送SDK,被困了2个月。 原来,他们有一个下划线的令人尴尬的错误! Oracle的Responsys / PushIO证明是正确的-企业产品糟透了。 这篇文章是我对甲骨文产品有多糟糕的抱怨。 我花了两个月的时间弄清楚为什么我们的iOS应用程序不显示从Oracle平台推送的丰富消息。 它归结为一个UNDERSCORE。 是的,在他们的API密钥中生成了_ ,这是我们的应用无法正常工作的原因。 从Oracle开发人员支持: 该错误是您的API密钥生成时带有下划线“ _”,并且对于在下游使用API​​密钥是无效的字符。 该修复应该很简单……创建一个新平台,直到您获得一个没有API密钥下划线的平台。 哇。 这是一个令人尴尬的错误,但更令我振奋的是他们如何处理它。 首先,该错误会影响大多数用户,因为在获得“有效”尝试之前,我进行了3次尝试。 我估计有66%的用户可能生成了“无效”密钥。 该错误影响很大。 所有丰富的推送消息将不会显示在应用程序中! PushIO SDK的最新版本是2017年6月16日,即撰写本文时的2个月前。 我给他们带来怀疑的好处,因为我认为该错误仅出现在该发行版中,尽管我确实认为该错误发生在6.32.1版之前。 关键是,应该尽快修复主要错误。 但是甲骨文没有。 更不用说这应该很容易解决。 他们可以用几行代码修复API密钥生成器。 Oracle不知何故选择不这样做。 在升级到开发人员之前,我们的客户经理和几个客户支持人员不了解尴尬_问题。 这可能意味着: 他们没有太多用户,这个问题从未出现过 他们在交流和共享此类知识时遇到问题 无论哪种方式,作为用户,我对Oracle都不太自信。 为什么这么久? 在尝试调查问题并找出问题时,我提出了一个简单的问题: 是否有iOS示例代码? 来自“企业支持”的回复并非很快。 他们花了2周的时间才终于得到答案-不,他们没有。 同样,这表明此类FAQ缺乏知识库。 调查我们的推送失败的原因是乏味且缓慢的,因为我必须等到第二天才能检查来自FTP服务器的日志。 感觉如此1990年代。 Responsys是企业电子邮件营销工具-一种缓慢而复杂的Web应用程序。 另一方面,Mail Chimp是竞争对手,很酷,而且用户友好。 自从苹果公司于2009年彻底改变了推送技术以来,PushIO是一个移动推送SDK,在一个非常拥挤的空间中。 更好的竞争对手包括Urban Airship和OneSignal(免费!)。 2014年,甲骨文吞并了Responsys,后者又吞并了PushIO,这是一笔15亿美元的收购 ! 当一家大公司收购一个团队及其产品时,这就是衰败的开始 。 这种情况比较麻烦,因为肥大的肥肉鱼吃掉了一条鱼,而鱼又吃了另一条小鱼。 小鱼(PushIO)可能不幸死亡。

如何使用iOS应用反向工程创建自己的Snapchat API客户端

抽象 动机 去年,我不得不在Snapchat的移动应用程序上使流程自动化,以便与脚本中的其他帐户进行交互。 由于Snapchat不提供任何公共API,因此我决定创建自己的客户端。 这个想法是创建一个非常可扩展的客户端以直接与其API进行交互,而不仅仅是半自动化地使用该应用程序。 为什么这么复杂? 在我之前,许多优秀的程序员为Snapchat创建了开源客户端(可以在Github上轻松找到源代码)。 问题在于Snapchat安全团队做得很好。 该API使用许多非常复杂的令牌来检查客户端请求的完整性,没有人找到一种方法来重现这些令牌后面的算法以模拟真实应用。 诀窍是什么? 对我们来说幸运的是,Snapchat是一个移动应用程序,并且由于您拥有客户端,因此您可以使用逆向工程技术来了解该应用程序的工作原理,并找到一种可以利用它的方法,从而发挥自己的优势。 经过数天的研究以了解该应用程序,我能够编写一个调整并将iOS设备用作身份验证服务。 以下是其工作方式的简化方案。 最终结果 使用这项技术和一些优化措施,我每天每台设备能够向Snapchat的API发送超过1000万个请求。 由于最终的架构是多设备支持就绪,因此规模几乎是无限的。 直接使用Snapchat应用作为身份验证提供程序的好处在于,几乎所有更新(甚至是主要版本)都不会破坏您的客户端,而且比尝试解密高安全性令牌要简单得多。 实际上,该客户在没有任何维护的情况下工作了一年很好,并且现在仍在工作。