即使在 2024 年,GraphQL 仍然存在一些基本问题。 译自 REST Still Outshines GraphQL for Many API Use Cases,作者 Gil Feig。...我将分解这些问题,以便您更好地决定 GraphQL 是否值得在您的集成中使用。我还将重点介绍为什么 REST 今天是更好的选择,并将继续成为领先的 API 标准。...随着时间的推移,随着您在请求中增加资源,理解和遵循您的速率限制将变得更加复杂。 最后,随着 API 的成熟,其 GraphQL 模式变得更加复杂。...由于这些响应不像 REST 中那样标准化,因此它们更难计划和自动处理。 许多工程师都有构建和/或维护 REST API 集成的经验。 各种规模的公司主要使用 REST API。...在竞争的 API 架构能够超越——甚至匹配——REST 对提供者和消费者双方的实用性之前,REST 将继续成为首选。
幂等性是 REST API 的一个关键概念,可确保系统的可靠性和一致性。幂等操作可以重复多次,而不会更改初始 API 请求之外的结果。...在 API 中实现幂等性有几个好处: 它可以防止意外的重复操作 它提高了分布式系统的可靠性 它有助于处理网络问题并正常重试 在本周的期刊中,我们将探讨如何在 ASP.NET Core API 中实现幂等性...POSTPOST 在 ASP.NET Core 中实现幂等性 为了实现幂等性,我们将使用涉及幂等性键的策略: 客户端为每个操作生成一个唯一密钥,并在自定义标头中发送该密钥。....AddEndpointFilter(); 前两个实现的替代方案是在自定义中间件中实现幂等逻辑。...这可以防止滥用幂等密钥并保持 API 的完整性。 在 REST API 中实现幂等性可以提高服务的可靠性和一致性。它确保相同的请求产生相同的结果,防止意外的重复并妥善处理网络问题。
文章目录 一、自定义插件中定义普通方法 二、自定义插件中定义 Gradle 任务 Task 三、代码示例 代码结构 自定义插件 自定义扩展 自定义扩展的扩展 自定义 Gradle 任务 build.gradle.../execution/TaskExecutionGraphListener.html 一、自定义插件中定义普通方法 ---- 在 自定义 Gradle 插件 的 Extension 扩展 中 , 可以定义方法...def extensionFun(String str) { println 'MyPluginExtensions extensionFun : ' + str } } 在自定义插件中...Gradle 任务 Task ---- 在 Android Studio 的 Gradle 面板中的 Task 任务 , 都是在 Android Gradle 插件中定义的 , 在自定义插件中 , 也可以自定义...{ @TaskAction void run() { println 'MyTask TaskAction' } } 然后 , 在自定义插件中 , 创建 Task
因为业务需要在小程序里加上很多的弹窗,就想写一个组件来实现; #创建组件 新建文件夹component专门放组件, 新建popup页面,在popup.json中设置: { "component"...注意:在组件wxss中不应使用ID选择器、属性选择器和标签名选择器。...在子组件中自定义值是以小驼峰的形式书写的,但是在父组件传的时候要以“-”连接。...然后子组件关闭按钮监听onTap事件,点击子组件关闭按钮时,会通知父组件去改变状态) 逻辑: 在子组件中给要触发的元素加 bindtap = 'onTap' 然后通过在method中设置onTap函数...在onTap中的triggerEvent中设置要触发父组件事件的函数名称 父组件接收到字组件的消息,然后触发事件 具体参考:小程序-组件通信 子组件: wxml <view class="hide-btn
文章目录 一、Android Gradle 插件扩展的扩展 二、为自定义 Gradle 插件的扩展配置扩展 并 获取扩展属性 Android Plugin DSL Reference 参考文档 : Android...Gradle 自定义 Plugin 插件 ③ ( 自定义插件作用 | Android Gradle 插件的扩展 | 自定义 Extension 扩展 ) 中 , 实现了 自定义插件 的 扩展 Extension..., 在 Module 模块下的 build.gradle 构建脚本中 , android 配置块 就是一个 AppExtension 扩展 , 但是在 android 扩展下又定义了 defaultConfig...自定义 Plugin 插件 的 Extension 扩展 中 , 再 定义一层 Extension 扩展 ; 二、为自定义 Gradle 插件的扩展配置扩展 并 获取扩展属性 ---- 定义扩展类 :...扩展属性 , 通过调用 project.扩展名.扩展的扩展名.扩展属性 可获取在构建脚本中配置的 扩展属性 的 扩展属性 ; import org.gradle.api.Plugin import org.gradle.api.Project
文章目录 一、META-INF 中声明自定义插件的核心类 二、在应用中依赖本地 Maven 仓库中的自定义 Gradle 插件 Android Plugin DSL Reference 参考文档 :.../Android_UI 一、META-INF 中声明自定义插件的核心类 ---- 参考 Android Gradle 插件内容 , 将 Android Studio 的 Project 面板中的 External...Libraries 展开 , 在 Android Gradle 插件中 , 需要在 META-INF/gradle-plugins/插件组名.插件名.properties 文件中 , 声明该...自定义插件的 implementation-class=org.gradle.api.plugins.antlr.AntlrPlugin 在自己的自定义插件中 , 也需要进行上述配置 ; 在 " src...Maven 仓库中的自定义 Gradle 插件 ---- 依赖本地 Maven 仓库 , 并导入 自定义 Gradle 插件 依赖 ; buildscript { repositories {
/Android_UI 一、将自定义 Gradle 插件上传到远程仓库中 ---- 在上一篇博客 【Android Gradle 插件】Gradle 自定义 Plugin 插件 ⑦ ( 自定义 Gradle...插件导入方式 | buildSrc 插件导入 | 构建脚本中自定义插件 | 独立文件 ) 中 , 总结了在 Android Studio 工程中 自定义 Gradle 插件 , 并在 build.gradle...中进行存储 , 在 Android Studio 工程的根目录中的 build.gradle 构建脚本中 , 通过如下方式将 自定义插件 引入 Android 工程 ; // Top-level build..., 在 Module 模块中 , 导入并使用 Android Gradle 插件 ; 这种方式是将 自定义 Gradle 插件 的 jar 包 上传到了 jcenter / google / mavenCentral...远程仓库 中 ; 二、创建自定义插件类型模块 ( Java or Kotlin Library ) ---- 选择 " 菜单栏 / New / New Module… " 选项 , 在 " Create
它提供了一些API,可以采用插件机制进行扩展,上图中,“部门”部分就是使用插件机制扩展出来的新功能。...,关于IQProvider 你可以查询Smack API,简单的来讲是处理你自定义的IQ 处理器。)...还有就是,我建议你在开发自己的插件的时候,多利用MVC 模式,尤其是在IQProvider 解析后,生成的部分可以实例化Model,然后你可以编写自己的Manager 进行这些Model 的处理。...-- More on this below --> 最重要的那一行我已经标记出来啦,就是你这个插件的初始化和垃圾清理类,例子中是在com.im.server.plugin...2、实现Plugin 类和IQHandler Plugin 类主要起到的作用是初始化和释放资源,在初始化的过程中,最重要的的注册一批IQHandler,IQHander 的作用有点类似于Spark 中的
文章目录 一、在 buildSrc 模块中依赖 Android Gradle 插件 二、完整代码示例 Android Plugin DSL Reference 参考文档 : Android Studio.../Android_UI 一、在 buildSrc 模块中依赖 Android Gradle 插件 ---- 在 Android Studio 工程的根目录的 buildSrc 模块下的 src/main...API , 如 Project 调用等 , 但是不能调用 Android Gradle 插件相关的 API ; 如果我们想要依赖其它的 函数库 , 可以在 buildSrc 模块下 , 自己创建 build.gradle...buildSrc 模块中调用 Android Gradle 模块中的 API ; // 获取 自定义 Gradle 插件的扩展属性 , 必须在 Gradle 分析完成之后才能进行 , 否则获取不到...】Gradle 自定义 Plugin 插件 ⑤ ( 自定义插件中获定义方法 | 在插件中创建 Gradle 任务 | 代码示例 ) 博客 ; GitHub 地址 : https://github.com
文章目录 一、在 Java or Kotlin Library 模块中定义插件 二、引入自定义 Gradle 插件模块 三、配置自定义 Gradle 插件上传选项 四、配置 Group 分组、插件名称、.../Android_UI 一、在 Java or Kotlin Library 模块中定义插件 ---- 在插件模块中的 src/main 目录 下创建 groovy 目录 , 用于存放 Groovy...Gradle 插件是无法在其它 Module 中引入的 ; 二、引入自定义 Gradle 插件模块 ---- 如果想要引入该插件 , 需要将该插件上传到 远程仓库 或者 本地仓库 中 , 才能通过 在...中 apply plugin: 'maven-publish' 然后 , 创建 publishing 扩展 , 在该扩展中 , 可以在其中的 publications 脚本块 中为插件传入参数 ; 注意...个元素使用 " : " 英文冒号 隔开 ; 因此 , 在自定义 Gradle 插件模块中 , 也可以指定 Group 分组 插件名称 插件版本号这 3 个信息 ; 通过 Project#setGroup
openfire群聊与QQ群对比 应该是去年的时候开始接触openfire,当时在分析后发现基于xmpp协议的openfire已经具备了群聊的功能。...通过openfire的插件体系增加一个插件,在服务端实现加群、退群等功能 毕竟xmpp协议里是没有获得群列表和房间成员的功能的,以及一些加群、退群的管理功能都没有,所以要自己开发。...这里可以通过openfire的插件体系来做,这样比较独立,不影响openfire内核功能。 这块涉及到写插件的技术,网上有很多,我就不多说了。...特别是可以设计成rest api,这样对于端来说是比较友好通用的,兼顾PC、移动端就简单多了,特别是移动端走http协议总比走长链接方便吧。...分析openfire muc群聊历史消息的实现 简单的介绍了群的实现,另外一个比较头痛的问题就是muc离线消息。在openfire里是有类似的支持的,这里就做一些简单的分析吧。
即时通信客户端可使用spark2.6.3,这个版本是目前最新的release版本,经过测试发现上一版本在视频支持,msn网关支持上可能有问题,所以选择openfire3.8.1+spark2.6.3是最合适的选择...Smack是即时通信客户端编程库,目前我已测通通过jsp使用smack的API向openfire注册用户发送消息,并且可以通过监听器获得此用户的应答消息。...Openfire 也提供了一些基本功能,但真的很基本的!庆幸的是,它也提供插件的扩展,像Spark 一样,同样强烈建议使用插件扩展的方式来增加新的功能,而不是修改人家的源代码。...Openfire 也提供了一些基本功能,但真的很基本的!庆幸的是,它也提供插件的扩展,像Spark 一样。...从上面的聊天记录我们发现所有的用户id全称都是:用户名@域名/资源名,这个就是我们在XMPP协议中通常说说的JID,即jabber id,它是一个xmpp协议帐号系统的通称,后面我们在使用smack编程库调试接口时会经常用到这个参数
2、Openfire的一些设计点与思路 Openfire的源代码整体看了看还是比较清晰的,扩展上支持插件与组件模式。...只不过Openfire可以通过插件扩展,对源代码本身的依赖就小了许多,所以说整体来说还是很不错的。...在Openfire中的插件扩展方式主要是: IQHandler 在XMPP协议中IQ包是指的信息/查询,可以用于服务器与客户端之间进行数据查询,Openfir中实现了一个IQRouter来处理IQ包。...中,在路由处理包时都会调用拦截器,上面的代码就是在路由中截取的代码例子。...在此也建议对于openfire的扩展最好还是使用插件吧,除非自己的定制要求很高,Openfire本身已经不适应了的。 我的要求基本都可以达成,而且这样以后升级新版本也非常简单,不会出现问题。
标准化的核心结果分为两部分; 核心的XML流传输协议 基于XMLFreeEIM流传输的即时通讯扩展应用 2、搭建开发环境 2.1 在eclipse中安装pydev插件 eclipse版本为myeclipse2014...在Select Interpretor界面中输入解释器名和解释器Python.exe的路径,我装的是Python2.6,路径在D:\Python26下。...添加完成后点击ok即可 2.3 测试python语言的开发 在Eclipse主界面点击File>New>Project… 在工程向导中,选择工程类型Pydev>Pydev Project: 如果工程创建后不是在...1 Python语言用ecilpse pydev插件编写Python程序 eclipse安装插件 建立开发环境 编写Python的hello world pydev官网 http://pydev.org.../manual_101_install.html 2 openfire服务器部署,二次开发 在开发环境上部署openfire 下载open的demo并跑通 3 使用xmpp协议开发业务功能
官方其实也会自己写一个插件来扩展功能,说明插件还是比较灵活的。 提一提Module的加载过程 下面代码是module的加载过程 if (!...因为Openfire只通过Module来管理的,那么对应的网络管理应该就在Module中。...而其中比较关键的一个步骤就是在sessionOpened中设置了StanzeHandler,而每种ConnectionHandler都有自己的StanzeHandler实现。...在Openfire中对于Session的管理都集中在SessionManager模块。但在前面说到连接管理时已经知道了IoSession的创建过程,但并没有看到openfire是如何管理它的。...但是这个时候并没有将session放入到openfire的session管理模块中,而是在客户端发送数据过来后才开始的。
选它的主要原因是: 1、它支持XMPP咯 2、它是java实现的,开源的 3、它比较有名,性能不错 4、部署挺简单的,还有许多现成的插件 至于openfire的安装部署网上文章比较多,这里也不打算写。...可以到这个网站上找到比较多的资源:http://www.igniterealtime.org/ 为什么说openfire部署简单,我当时只是下载了一个exe的安装包,然后在windows下按照向导安装部署配置后...openfire就在Servers中可以找到,spark在Clients可以找到,Smack在Libraries中找到。...", e.getMessage()); } } }.start(); } 这段代码里主要是两点注意: 1、服务器通讯要用自定义证书的话要用自定义的...2、connect要使用线程来执行,这是由于android中不允许在主线程中跑这种耗时的代码,影响界面响应 获取登录用户的好友列表: Roster roster = Roster.getInstanceFor
有篇关于Openfire导入到IntelliJ IDEA的文章(http://www.linuxidc.com/Linux/2015-01/112313.htm),不过在我导入的过程中,感觉还可以再简化一些...这是由于在plugins目录下面有一个rayo的插件使用了tinder的类库,而openfire也使用了这个类库,但是rayo的这个类库版本比较老,而项目用的却偏偏就是老的这个类库导致的。...同时,你还需要删除下面的四个插件: 8. 重新编译,这次应该能够顺利通过了。 9. 然后我们要开始配置ant了。打开ant窗口,单击+。 10....选择openfire源代码下的build目录中的build.xml文件。 选择OK后会出现此界面。 11. 先不用急着运行,我们还有一步配置需要完成。...好了,然后就可以执行ant命令了,ant->run完成后,在浏览器中输入localhost:9090,出现如下页面就说明这次导入完成了,接下去可以随意玩耍openfire啦。
官网 Apache Batik:在Java应用中程序以SVG格式显示、生成及处理图像的工具集,包括SVG解析器、SVG生成器、SVG DOM等模块,可以集成使用也可以单独使用,还可以扩展自定义的SVG标签...官网 RoboVM:Java编写原生iOS应用。官网 Quartz:强大的任务调度库.官网 应用监控工具 监控生产环境中应用程序的工具。 AppDynamics:性能监测商业工具。...官网 Grizzly:NIO框架,在Glassfish中作为网络层使用。官网 Netty:构建高性能网络应用程序开发框架。...官网 Undertow:基于NIO实现了阻塞和非阻塞API的Web服务器,在WildFly中作为网络层使用。官网 ORM 处理对象持久化的API。 Ebean:支持快速数据访问和编码的ORM框架。...官网 REST Assured:为REST/HTTP服务提供方便测试的Java DSL。官网 Selenide:为Selenium提供精准的周边API,用来编写稳定且可读的UI测试。
在之前的文章《Openfire阶段实践总结》中提到过一种openfire的扩展模式Compoent。本文将主要探讨对这种模式的应用与开发方法。...内部与外部组件介绍 在openfire中的许多插件都实现了Compoent,Compoent的灵活性在于它可以通过对特定的二级子域包进行处理。...在自己的组件内部可以实现更多的复杂的业务。 当然为了扩展的更丰富,openfire提供了内部与外部组件两种方式 内部组件,主要是以插件的形式,jar包的形式。内部组件可以和主域有同样的访问和控制权限。...外部组件,可是独立的一个应用程序,以tcp形式连接到openfire中,当然就不能获取到主域中的资源啦。...在openfire中就引用了这个包,所以基本上服务端中使用这个协议包。 whack 在tinder基础上提供了外部组件开发的一个开发包,使开发人员更方便的搭建openfire的外部组件。
之前接触的是Openfire的C#客户端,最近开始接触Openfire的服务端。...用MyEclipse部署Openfire的步骤,网上有很多,可以自行google,这里要记录的是用据说最好用的JAVA编辑器IntelliJ IDEA来部署Openfire服务端。...还有一步就是在项目中把il8n这个目录mark as source.不然会报有关openfire_i18n_zh_CN.properties的错误。...编译plugins的时候可能会出现内存溢出,在左侧的SRC中,把之前没有勾选的两个插件删除即可,一个是monitoring,一个是rayo。 然后再编译。 警告可以忽略。...DEBUG的时候有可能会报错,是因为OF源码引用冲突了,(我本地有两个包引用了plugins\jitsivideobridge中的jar,删除jitsivideobridge目录下lib中的tinder.jar