{"id":19237516,"url":"https://github.com/core-lib/pigeon","last_synced_at":"2025-08-04T05:36:18.982Z","repository":{"id":62369900,"uuid":"48630325","full_name":"core-lib/pigeon","owner":"core-lib","description":"跨平台远程方法接口调用框架, 致力于改善iOS/Android移动端与服务端API调用的各种繁琐问题, 屏蔽所有网络交互的技术细节, 让开发者只关心业务而不担心技术上的问题, 跨平台接口智能生成, 让你的API调用代码流畅一如书写本地方法调用. 提供目前网络数据传输的所有转换的接口和实现, 其中包括 序列化, 编码, 压缩, 校验, 加密, 签名 ...","archived":false,"fork":false,"pushed_at":"2018-03-16T06:04:34.000Z","size":710,"stargazers_count":116,"open_issues_count":3,"forks_count":72,"subscribers_count":15,"default_branch":"master","last_synced_at":"2025-03-29T05:12:32.918Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/core-lib.png","metadata":{"files":{"readme":"README.MD","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-12-27T02:39:09.000Z","updated_at":"2024-11-11T03:18:38.000Z","dependencies_parsed_at":"2022-10-31T18:01:06.152Z","dependency_job_id":null,"html_url":"https://github.com/core-lib/pigeon","commit_stats":null,"previous_names":[],"tags_count":16,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/core-lib%2Fpigeon","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/core-lib%2Fpigeon/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/core-lib%2Fpigeon/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/core-lib%2Fpigeon/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/core-lib","download_url":"https://codeload.github.com/core-lib/pigeon/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249215740,"owners_count":21231461,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-09T16:27:06.133Z","updated_at":"2025-04-16T07:55:46.976Z","avatar_url":"https://github.com/core-lib.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"What's this?\n====\n\n###\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;Pigeon是一个纯粹使用HTTP协议封装的一个符合RESTful规范的用于客户端与服务端之间通过接口规范来进行通讯的RPC框架.###\n\n#####尤其擅长于Android/iOS与JAVA服务端的API调用,致力于解决目前移动互联网开发过程中网络通讯方面的各种问题.#####\n\nWhat are the benefits?\n====\n\n框架提供符合RESTful规范的功能,通过接口的方式开放后台的服务,前端引入后台打包好的接口和传输数据类型(VO类型),\u003cbr/\u003e\n大大简化前端的开发难度,前端通过接口来进行远程调用后台的开放服务,直接利用已经打包过来的传输数据类型,\u003cbr/\u003e\n减少重复定义传输数据类型的繁琐和无技术含量的工作.使用接口的方式来调用带来的好处是:\u003cbr/\u003e\n* 1.不需要考虑参数类型和明确知道返回值类型是否匹配,因为接口声明好了,编译时就能检查是否正确.\n* 2.接口可声明可能抛出的异常,强制客户端需要对可能的异常进行处理.\n* 3.框架屏蔽序列化和反序列化过程,让代码更简洁,书写就像是在调用本地的方法.\n* 4.提供拦截器拓展,可以无限拓展对请求/回应的统一处理,轻松实现自动重新登录,网络不稳定自动重试,权限拦截,参数校验,日志记录等等统一切面功能\n* 5.提供目前网络请求所有数据转换的注解配置,不需要任何代码,轻松享受框架提供的编码/压缩/校验/加密/签名等常用功能\n* 6.提供多种客户端实现:同步/异步/RxJava 满足你日常的需要.\n* 7.纯粹的HTTP规范,与流行的HTTP框架可以无缝对接\n* 8.提供多种项目集成方式:与Spring集成(交给容器管理);与web服务器集成(作为一个Filter);裸开模式...\n\nHow to use?\n====\n说了这么多，到底怎么用？\n\n**1：明确需求**\u003cbr/\u003e\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;假如用户下载了我们的APP（以Android为例），这个时候用户需要注册。那么我们的后台需要有一个提供用户注册的方法或者叫API，我就一步到位吧。这个方法就长这样子\n\tUser register(String username, String password) throws IOException; 相信大家一眼就能看出来，这是个接口上的抽象方法，因为它没有方法体也没有修饰符。\n\n**2：定义接口**\u003cbr/\u003e\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;为什么要接口？因为我们要让Android/iOS客户端调用的时候代码书写就像在调用本地方法一样啊。例如在Android端使用的话就会变成\n\tUser user = api.register(\"叶良辰\",\"我有一百种方法让你在github混不下去\"); 很简单有没有？很想EJB、WebService是不是？我会说差不多，但是比它们都更简单更轻量级。\n\n**3：完整实现**\u003cbr/\u003e\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;这里我们注意到有一个User类，也应该有一个API接口同时也应该有一个API实现类。\u003cbr/\u003e\n好吧，那我们就创建一个Maven多模块项目将它们一一写出来吧。\n我们最好把项目分成几个模块，等下我们会知道为什么需要分模块。\n那就创建一个结构类似下面的Maven项目吧\n```\n/demo-parent\n   |\n   |--/demo-core\n   |\n   |--/demo-web \n```\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;其中我们把 User类 和 API接口 放在 demo-core模块中，让demo-web依赖demo-core模块，\n再把APIImpl这个接口实现类放在demo-web模块中，这三个类的主要代码如下\n\n// 注意让你的参与网络传输的类型实现 Serializable 接口，轻松拥有可序列化功能。\n```\npublic class User implements Serializable {\n\tprivate static final long serialVersionUID = 5991214707724188798L;\n\n\tprivate String username;\n\tprivate String password;\n\t\n\t// getter setter ...\n}\n\npublic interface API {\n\t\n\t// 注意这里的异常定义，框架明确要求开放方法必须定义IOException异常抛出，其实这大有用处，后面再说。\n\tUser register(String username, String password) throws IOException;\n\t\n}\n\npublic class APIImpl implements API {\n\t\n\tpublic User register(String username, String password) throws IOException {\n\t\tUser user = new User();\n\t\tuser.setUsername(username);\n\t\tuser.setPassword(password);\n\t\t// 将user保存到数据库...\n\t\treturn user;\n\t}\n\t\n}\n```\t\n**4：框架上场**\u003cbr/\u003e\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;怎么地？这样写出来就可以用啦？嗯，差不多了，我们继续看。\n* a.首先将框架从github里导入到你的eclipse中，地址：https://github.com/core-lib/pigeon.git\u003cbr/\u003e 这是个maven项目，有几个模块，第一次编译比较久因为需要下载一些第三方依赖。。。\n\n* b.假如你已经编译完成没有任何问题。\n\n* c.让demo-core项目依赖你下载的pigeon框架的pigeon-core模块，版本号看你下载的版本为准。\n```\n\u003cdependency\u003e\n\t\u003cgroupId\u003epayne.framework\u003c/groupId\u003e\n\t\u003cartifactId\u003epigeon-core\u003c/artifactId\u003e\n\t\u003cversion\u003e3.6.0-release\u003c/version\u003e\n\u003c/dependency\u003e\n```\n* d.我们把API接口加上一个框架提供的注解@Open，其他东西不用修改，然后它就变成了\n```\n@Open\npublic interface API {\n\n\tUser register(String username, String password) throws IOException; \n\t\n}\n```\n* e.下面我们写一个单元测试类吧，功能总是需要测试的对吧。给demo-web模块添加pigeon-server和pigeon-client依赖，如果没有junit依赖也补上去。版本号以你下载的为准。。。\n```\n\u003cdependency\u003e\n\t\u003cgroupId\u003epayne.framework\u003c/groupId\u003e\n\t\u003cartifactId\u003epigeon-server\u003c/artifactId\u003e\n\t\u003cversion\u003e3.6.0-release\u003c/version\u003e\n\u003c/dependency\u003e\n\n\u003cdependency\u003e\n\t\u003cgroupId\u003epayne.framework\u003c/groupId\u003e\n\t\u003cartifactId\u003epigeon-client\u003c/artifactId\u003e\n\t\u003cversion\u003e3.6.0-release\u003c/version\u003e\n\u003c/dependency\u003e\n\n\u003cdependency\u003e\n\t\u003cgroupId\u003ejunit\u003c/groupId\u003e\n\t\u003cartifactId\u003ejunit\u003c/artifactId\u003e\n\t\u003cversion\u003e4.5\u003c/version\u003e\n\u003c/dependency\u003e\n```\n```\npublic class APITests {\n\tprivate InvocationContext context;\n\tprivate API api;\n\t\n\tpublic static void main(String[] args) throws Exception {\n\t\tInvocationContext context = new BlockingInvocationContext();\n\t\tcontext.bind(10086);\n\t\tcontext.register(new APIImpl());\n\t\tcontext.startup();\n\t}\n\n\t@Before\n\tpublic void setup() throws Exception {\n\t\t// 启动服务端\n\t\tcontext = new BlockingInvocationContext();\n\t\tcontext.bind(10086); // 开放端口，根据自己喜好\n\t\tcontext.register(new APIImpl());\n\t\tcontext.startup();\n\t\t\n\t\t// 模拟客户端\n\t\tClient client = new Client(\"localhost\", 10086);\n\t\tapi = client.create(\"HTTP\", \"application/x-java-serialized-object\", \"/APIImpl\", API.class);\n\t}\n\t\n\t@Test\n\tpublic void testRegister() throws Exception{\n\t\tUser user = api.register(\"叶良辰\",\"我有一百种方法让你在github混不下去\");\n\t\tSystem.out.println(\"返回结果\" + user.getUsername() + \":\" + user.getPassword());\n\t}\n\n\t@After\n\tpublic void destroy() throws Exception {\n\t\tcontext.shutdown();\n\t}\n\n}\n```\n运行 testRegister 方法。。。\n\t\t\n**5：客户端使用API**\u003cbr/\u003e\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;到这里我们就会明白为什么我说项目要分模块。因为我们需要把这个模块打包给Android使用，或者生成对应的模型和接口给iOS使用。所以我们打包的时候不可能把实现类也打包给客户端吧？因为实现类我们放在了demo-web，所以客户端也就只知道接口而且，面向接口编程也是pigeon框架所提倡的。\n\t\n* a.假设你已经打好包了，把demo-core的jar包放到Android中，并且将我们之前打包好的pigeon-core、pigeon-introspection和pigeon-client三个jar包放入Android项目中。\n\t\n* b.构造客户端，记得改IP地址和端口，指向到你后台的IP地址和端口。\n```\nClient client = new Client(\"server.ip\", 10086);\napi = client.create(\"HTTP\", \"application/x-java-serialized-object\", \"/APIImpl\", API.class);\n```\n* c.通过 APITests 的main方法启动后台，后台一旦启动就会在等待请求的状态\n\t\n* d.调用后台，在适当的地方使用代码调用后台服务，例如在用户点了注册的确定按钮。注意！注意！这里虽然看上去是在调用本地代码，但是实际上是网络交互，所以不要放在主线程！！！用AsyncTask吧。\n```\nUser user = api.register(\"叶良辰\",\"我有一百种方法让你在github混不下去\");\nSystem.out.println(\"返回结果\" + user.getUsername() + \":\" + user.getPassword());\n```\n* e.当你写完一个AsyncTaks时，你会发现，似乎还是很麻烦的样子。不用担心，框架有更好的方案。让你直接在主线程写代码，框架实现异步调用和回调主线程代码。\n\n**6：更多功能**\u003cbr/\u003e\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;其实上述只是pigeon框架的冰山一角，框架提供session，序列化，编码，压缩，校验，加密，签名，参数校验。。。每种数据转换都有接口和原生的几个实现，可以直接使用也可以自定义拓展，所有这些数据\n转换功能都是无需编写代码，只需要在开放接口或方法上标注对应注解即可轻松拥有。\n\n**网络协议**\n```\nHTTP\nHTTP/1.0\nHTTP/1.1\n```\n**加密**\n```\nRSA\nAES\nDES\nDESede\n```\n**签名**\n```\nMD2WithRSA\nMD5WithRSA\nSHA1WithRSA\nSHA256WithRSA\n```\n**编码**\n```\nbase64\nbase32\nhex\n```\n**压缩**\n```\nflat\nGZIP\nLZ4\nsnappy\n```\n**序列化**\n```\napplication/json\napplication/xml\napplication/yaml\napplication/smile\napplication/cbor\napplication/avro\napplication/x-www-form-urlencoded\napplication/x-java-serialized-object\napplication/hessian\napplication/hessian2\napplication/burlap\n```\n**校验**\n```\nMD2\nMD5\nSHA-1\nSHA-256\n```\n\n**7：框架集成**\u003cbr/\u003e\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;框架轻松跟市面上流行的技术进行集成，例如Spring，Hibernate，web服务器（tomcat。。。）更好的整合在你已有的项目和拓展你的项目。在保证不修改你现有的开放服务的实现类代码前提下，可以通过抽象出一个接口就能通过pigeon框架的形式去开放远程接口方式的调用。\n\n**8：更多教程**\u003cbr/\u003e\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;更详细的使用教程，更强大的功能使用请下载pigeon-sample工程。地址：https://github.com/core-lib/pigeon-sample.git\n\n**9：更多功能**\u003cbr/\u003e\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;如何使用session？如何生成objective-c客户端？如何生成异步API？如何拓展框架？框架的运行原理？请下载pigeon-sample工程。地址：https://github.com/core-lib/pigeon-sample.git\n\n**10：有问题?**\u003cbr/\u003e\n\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;有任何问题，随时随地可以加我QQ：646742615（我的昵称是Payne）  或发邮件到我QQ邮箱：646742615@qq.com。你也可以微信我：change1921\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcore-lib%2Fpigeon","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcore-lib%2Fpigeon","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcore-lib%2Fpigeon/lists"}