澳门新蒲京娱乐


字符串编码截取函数

我跆拳道中断了,VJGUI消息设计

什么样的环境是程序员成长最快的环境,回敬傲慢和偏见

>除开五大这种要什么有什么,进去做打字也能光耀门楣的不谈。如果是嫁到一个普通软件公司,怎样的环境能使你最快的成长呢?<br/><br/>  首先基本的公司项目管理水平是必要的;<br/><br/>  其次稳健而不保守的公司技术选型是必要的;<br/><br/>  重要的,要有一个严苛的环境,那些古训说的都没错,越是严苛成长越快。<br/><br/>  然后有些助力,让你在严寒中节省体力,过得好些的,就是最佳的练功环境了。<br/><br/>  <strong>一,最复杂多变的业务规则,最难侍候的客户<br/><br/></strong>  大多数人碰上这几样东西都是愁眉苦脸,天天抱怨,其实应该把它视为入门锻炼的:<br/>  第一阶是努力用细密的编码迎合复杂的业务,以金牌的服务态度接受客户的善变和每样需求都要24小时有取的限时。充分打磨之后的眼耳口心,才是个合格的IT人。如果业务规则都清的像水,项目时时都是以我为主的,反是在做toy
application,不算入了IT的门。<br/><br/>  而如果被充分打磨之后,肯静下心来总结,设计架构如何适应改变,流程如何做到快速更新部署,并抽时间改进的,就是第二阶段的进步了。<br/><br/>  一直做ERP,自问有足够复杂的业务(因为不熟悉业务,有些不复杂的也变复杂了)和麻烦的客户(不是大公司,麻烦的客户就会很充足),但觉得在第二阶段方面还是不很静得下心。<br/><br/> <strong> 二,最严格的性能要求,准确率要求,错误恢复要求<br/></strong><br/>  最好是那种每天N万人访问,几亿条数据。还有准确性很严格,分分钟几十万上下,如果崩机又要迅速完全恢复状态的项目。<br/><br/>  每天几万人访问的项目没做过,遗憾。<br/><br/>  几千万条数据的项目倒是每天面对,优化学了一点,但没有充分利用严格的环境去追求改进,遗憾。<br/><br/>  ERP的报表倒是经常会搞到几十万上下的差额,但一直重视不足,以后要以历练来对待之。<br/><br/>  崩机恢复是最近的项目要求,更爽是这个项目澳国政府居然有一份规范,我说的助力就是指这些了,不用自己慢慢摸索而且经常摸错地方。<strong>三,最底层的编码<br/></strong><br/>  不要老是高高在上搞ERP搞.com,最好能用到起码C一级的语言,可以和硬件打打交道,直接写IO口阿,中断阿,都是有就不要放过的锻炼。<br/><br/>  没做过底层编码,只会纯软件的IT人的感觉是不完整的。<br/><br/>  刚好公司最近的项目有要求,捧一本看看〈Linux
Device
Driver〉。<br/><br/>  <strong>四,最高层的设计<br/><br/></strong>  设计,框架–多少技术人一听就眼红的字眼。但不是每个公司都搞很产品化的项目,或者在项目里自写框架重做轮子。所以,除了刚入行那段疯狂的日子,很高阶的设计其实我也没做多少,多数时间都是应用层的开发。<br/><br/>  不过,因为有时候要除bug或者增强开源产品使其符合项目需求,或者有错了不明就里时直接读源码会更快找到错误。这样就接触到不少优秀开源项目的源码,像很好读的Spring。<br/><br/>  而最近搞php的东西时,发现php早不一样了,其实应该算入python,ruby一类的动态OO语言,它的那些著名项目一样有着很好的MVC框架和数据层抽象,而且,和Java盛产框架型项目不同,php的项目多是熟透了的Web应用,细看之下学到不少东西。<br/>  <br/>  一阵发呆打了这篇字,其实也是鞭策自己在现在的环境里更快成长。</dd>

<p><strong>APIJSON简介:</strong></p>

海啸南风
发表于:2006-1-19 20:23:51
[编辑]
[精华]
[删除]
[回复]

<p>APIJSON是一种JSON传输结构协议。</p>


<p>客户端可以定义任何JSON结构去向服务端发起请求,服务端就会返回对应结构的JSON字符串,所求即所得。</p>

图片 1 认准信念,坚持不懈

<p>一次请求任意结构任意数据,方便灵活,不需要专门接口或多次请求。</p>

存在就是有道理!
既然这么多程序员存在着。而且,很多公司还在招聘程序员,那就说明,程序员有饭吃

<p>支持增删改查、模糊搜索、远程函数调用等。还能去除重复数据,节省流量提高速度!</p>

<p>从此HTTP传输JSON数据没有接口,更不需要文档!</p>

<p>客户端再也不用和服务端沟通接口或文档问题了!再也不会被文档各种错误坑了!</p>

<p>服务端再也不用为了兼容旧版客户端写新版接口和文档了!再也不会被客户端随时随地没完没了地烦了!</p>

<p><strong>项目主页详细介绍:</strong></p>

<p><a
href=”;

<p><strong>下载试用</strong></p>

<p><a
href=”;

<p>

图片 2

</p>

<p>图片 3

</p>

<p>图片 4

</p>

<p>图片 5

</p>

<p></p>

<p>前些天我发了几篇博客来推广APIJSON,几乎每次发布后都引起了很大的争议,有赞赏和认可,也有质疑和否定。</p>

<p>评论太乱太分散,就挑出部分偏见,在这里对关于APIJSON的<strong>开发、<strong><strong>功能、<strong>使用、性能、</strong><strong>安全</strong></strong></strong></strong>做一个统一的解答吧。</p>

<p> </p>

<p><strong>首先声明:</strong></p>

<p>开发APIJSON是为了解决小公司、团队及个人开发者中客户端和服务端的接口、文档和沟通问题,简化开发、提高效率、缩短周期。</p>

<p>希望大家不要用大公司的业务去要求APIJSON的功能、性能、安全等,而且个人也能力有限,所以只要方便、够用就好。</p>

<p>一般来说小公司只能开发小型系统,只有大公司才能开发大型系统。APIJSON解决的问题在小公司很容易出现并且容易造成致命的影响(开发周期长、产品上线迟导致资金链断裂而倒闭),但大公司因为资源充裕可以很好地避免这些问题。APIJSON降低了开发门槛和成本,使得小公司也能快速实现产品、节约资源,提高自己的竞争力。</p>

<p>另外,一般大公司基本都是自己造轮子用的,说不定有些公司也开发了类似APIJSON的数据交换协议,只是没有开源。</p>

<p> </p>

<p> </p>

<p><strong>一、关于开发</strong></p>

<p>翻了下聊天记录,大概是从2016年11月5日的问题开始构思的:</p>

<p>如果一个界面(如微信详细资料界面)需要获取1个User和它对应的1个pictureList,目前有这几种方法:<br
/>1.接口返回的User里包括pictureList;<br
/>2.分别请求User和pictureList两个接口;<br
/>3.后台新增一个接口,返回数据包括User和pictureList。<br
/>这几种哪种最好呢?</p>

<p>我陆续问了公司群、技术群、圈子内的朋友们,获得了很多阿里、网易、恒生、微店、蘑菇街、挖财等客户端、前端、后端开发者的回答,但得到的方案都是上面的,我都不满意。</p>

<p>或许是真的没有人知道新的方案,也可能是公司的方案不能外传。之前也网上搜索了一些接口定制、组合、嵌套等相关的关键词,都没找到满意的答案。</p>

<p> </p>

<p>求人不如求己,还是自己造一个轮子吧。</p>

<p>然后我花了大概一周的时间构思和评估新方案的</p>

<p><strong>需求(实现微信详细资料的用户+最近相册、QQ空间的用户+动态+评论等数据的各种组合嵌套)、</strong></p>

<p><strong>方式(</strong><strong><strong>客户端可定制、组合、嵌套服务端的返回数据)</strong>、</strong></p>

<p><strong>实现(数据库、数据结构、传输与交互、封装与解析算法等)。</strong></p>

<p>之后就开始动工了,先花了一周实现了最重要的</p>

<p><strong>封装与解析协议可行性验证(确定了3个方案中基于JSON的方案二)、</strong></p>

<p><strong>数据库MySQL
JDBC查询{User:{id:1}}、</strong></p>

<p><strong>简单对象组合{User:{},pictureList:[]}与列表+对象组合{[]:{User:{},Moment:{},Comment[]:{}}}的封装与解析,</strong></p>

<p>然后实现了</p>

<p><strong>客户端与服务端的HTTP通信、</strong></p>

<p><strong>客户端对Reqeust的封装和对Response的解析、</strong></p>

<p><strong><strong><strong>服务端</strong>对<strong>Reqeust</strong>的解析和</strong>对<strong>Response<strong>的封装。</strong></strong></strong></p>

APIJSON初步完成,放到Bitbucket远程仓库用SourceTree管理和备份,后来迁移到码云。</p>

<p>之后又经过了1.0-3.1的内部版本迭代,2016年11月21日放到GitHub上开源。</p>

<p>开发过程中遇到了很多问题:</p>

<p>1.一开始打算用请求格式最简洁的方案三,因为已经脱离JSON的合法格式不能封装和解析,尝试定制FastJSON失败,于是转为符合JSON格式的方案二。</p>

<p>2.对列表+对象组合Request的解析出现的各种问题,经过好几天的反复尝试、调试和修改终于完成。</p>

<p>3.URL中含有转义的字符’/’被UTF-8编码后发送到服务端仍然无法解析,后来通过多层encode解决。</p>

<p>…</p>

<p> </p>

<p><strong>偏见:</strong></p>

<p>以我的经验来看,此方式不通。也许只是作者一个人的狂热。闭门造车出来的产物吧…</p>

<p><strong>回敬:</strong></p>

<p>APIJSON不是闭门造车的产物,而恰恰是为了解决自己和开发圈子里的各种接口问题而总结出来的实践经验。</p>

<p>APIJSON解决了传统方式导致的开发周期长(客户端要等服务端开发完接口、写好文档才能请求和解析接口)、客户端容易被文档的各种错误坑从而导致耗费大量的调试和与后端沟通的时间等问题。</p>

<p> </p>

<p> </p>

<p><strong><strong>二、</strong>关于功能</strong></p>

<p>APIJSON目前已实现:</p>

<p>大体功能:增删改查、分页查询、统计与验证、注册登录、模糊搜索、结构校验、数据保护、远程函数调用等</p>

<p>操作方式:增、删、改、查、调用远程函数</p>

<p>操作对象:单个对象、可关联的多个对象、数组等</p>

<p>请求方法:GET,HEAD,POST_GET,POST_HEAD,POST,PUT,DELETE</p>

<p>请求结构:{Table:{…}}、{Table0:{…},Table1{…},Table2:{…}…}、{“[]”:{Table:{…}}}、{“[]”:{Table0:{…},Table1{…},”Array0[]”:{…},…}}等各种组合和嵌套</p>

<p>返回结构:对应请求结构的各种JSON结构。</p>

<p>功能符号:</p>

<pre>”key[]”:{} // 查询数组

“key{}”:[] // 匹配选项范围

“key{}”:”条件0,条件1…” // 匹配条件范围

“key()”:”function(Type0:value0,Type1:value1…)” // 远程调用函数

“key@”:”key0/key1…/targetKey” // 依赖引用

“key$”:”SQL搜索表达式” // 模糊搜索

“key+”:key指定类型的Object // 增加/扩展

“key-“:key指定类型的Object // 减少/去除

“@key”:key指定类型的Object //
@key为JSONObject中的关键词。如指定字段@columns、自定义关键词@position</code></pre>

<p>具体见文档:</p>

<p><a
href=”;

<p> </p>

<p><strong>偏见1:</strong></p>

<p>表连接查询</p>

<p><strong>回敬:</strong></p>

<p>table都是通过id关联的,连接查询在文章的
<strong>查询类微信朋友圈动态列表数据</strong>
里就给了demo,用户User、动态Moment、评论Comment就是通过id关联查询的。</p>

<p> </p>

<p><strong>偏见2:</strong></p>

<p>那要是3个表4个表内连接呢?</p>

<p><strong>回敬:</strong></p>

<p>APIJSON给出的Demo里的Moment,User,Comment这3个表就是通过id内连接的。文中给出的查询类似微信朋友圈动态列表数据的demo:</p>

<pre>{“[]”: { //请求一个array”page”: 0, //array条件”count”:
2,”User”: { //请求查询名为User的table,返回名为User的JSONObject”sex”: 0
//object条件},”Moment”: {“userId@”: “/User/id”
//缺省依赖路径,从同级object的路径开始},”Comment[]”: {
//请求一个名为Comment的array”page”: 0,”count”: 2,”Comment”:
{“momentId@”: “[]/Moment/id”
//完整依赖路径}}}}</code></pre>

<p>这就表示Moment.userId = User.id, Comment.momentId =
Moment.id,不就实现了3个表内连接查询么?而且还是多个数组和单个Object复杂嵌套的应用场景。</p>

<p> </p>

<p><strong>偏见3:</strong></p>

<p>处理不了复杂的请求,只能看着玩玩。</p>

<p><strong>回敬:</strong></p>

<p>APIJSON就是为复杂请求和数据结构变化而生的。</p>

<p>不管是简单对象组合{User:{},pictureList:[]},还是列表+对象组合{[]:{User:{},Moment:{},Comment[]:{}}}都可以。</p>

<p>微信朋友圈动态列表够复杂吧?APIJSON查询:(可<a
href=”;

<p>请求:</p>

<pre>{“[]”: { //请求一个array”page”: 0, //array条件”count”:
2,”User”: { //请求查询名为User的table,返回名为User的JSONObject”sex”: 0
//object条件},”Moment”: {“userId@”: “/User/id”
//缺省依赖路径,从同级object的路径开始},”Comment[]”: {
//请求一个名为Comment的array”page”: 0,”count”: 2,”Comment”:
{“momentId@”: “[]/Moment/id”
//完整依赖路径}}}}</code></pre>

<p><a
href=”;

<p>返回:</p>

<pre>{“[]”:[{“User”:{“id”:38710,”sex”:0,”phone”:”1300038710″,”name”:”Name-38710″,”head”:”
is a
Content…-470″,”userId”:38710,”pictureList”:[”
is a
Content…-4″,”targetUserName”:”targetUserName-14604″,”userName”:”userName-93781″}},{“Comment”:{“id”:22,”parentId”:221,”momentId”:470,”userId”:332,”targetUserId”:5904,”content”:”This
is a
Content…-22″,”targetUserName”:”targetUserName-5904″,”userName”:”userName-11679″}}]},{“User”:{“id”:70793,”sex”:0,”phone”:”1300070793″,”name”:”Name-70793″,”head”:”
is a
Content…-73″,”userId”:70793,”pictureList”:[”
is a
Content…-44″,”targetUserName”:”targetUserName-6378″,”userName”:”userName-88645″}},{“Comment”:{“id”:54,”parentId”:0,”momentId”:170,”userId”:3,”targetUserId”:62122,”content”:”This
is a
Content…-54″,”targetUserName”:”targetUserName-62122″,”userName”:”userName-82381″}}]}]}</code></pre>

<p> </p>

<p> </p>

<p><strong><strong>三、</strong>关于使用</strong></p>

<p>见项目的文档和服务端及客户端的Demo工程:</p>

<p><a
href=”;

<p> </p>

<p><strong><strong>偏见</strong>1:</strong></p>

<p>有违项目开发前后端分离的趋势。</p>

<p><strong>回敬:</strong></p>

<p>传统方式连客户端的UI都是和后端接口关联的,比如类似微信朋友圈、QQ空间的动态的列表都需要特定接口来传输对应结构的数据,耦合性很高。</p>

<p>而APIJSON让服务端和客户端UI完全分离了,不需要服务端为客户端UI定制接口,也不用为了兼容旧版客户端保留冗余字段以及开发新版接口和更新接口文档。</p>

<p>难道APIJSON不是更好地实现了前后端分离?</p>

<p> </p>

<p><strong><strong><strong>偏见2</strong></strong>:</strong></p>

<p>数据结构过于罗嗦,为什么我还需要声明返回值是一个数组?</p>

<p><strong>回敬:</strong></p>

<p>数组非必须,只有获取列表数据才需要,可能你只看了最上面复杂结构的APIJSON请求,误解了APIJSON请求方式。</p>

<p>比如获取一个User可以是{“User”:{“id”:1}},获取一个女性User列表可以是{“[]”:{“User”:{“sex”:1}}},page和count也都是可选参数非必须。</p>

<p>仅从请求上看,APIJSON的数据确实比传统方式的多;但从整体上看,APIJSON让客户端看请求知结果,所求即所得,让服务端和客户端都大幅降低了开发和沟通成本,所以是值得的。</p>

<p>而且APIJSON的客户端工程提供了JSONRequest类,可以很方便地封装请求,还不需要像传统方式那样addParameter后再拼接键值对,请求的代码量反而更少。</p>

<p> </p>

<p> </p>

<p><strong><strong><strong><strong>偏见3</strong></strong>:</strong></strong></p>

<p>GET的限制。请求报文不能太长。。。</p>

<p><strong>回敬:</strong></p>

<p>http协议里并没有对GET请求的长度有限制,浏览器到倒是有,最少的是IE,限制为2083字符,Chrome限制为8182,Safari限制为80000,其它都在8000以上。</p>

<p>APIJSON客户端DemoApp主页圈子仿微信朋友圈界面,列表里的单项有1个发布者User、一个带图片的Moment、最多显示3个评论Comment,每个评论里至少有1个评论者User,有的还有1个被回复的User。</p>

<p>就这么复杂的数据列表,APIJSON的GET请求经过URLEncder.encode后是1144个字符。其它界面都比圈子界面简单得多,url长度短很多,所以怎么都是够用的了。</p>

<p> </p>

<p><strong><strong><strong><strong>偏见4</strong></strong>:</strong></strong></p>

<p>还不是要一套查询文档,感觉也没多少必要,也一样麻烦。</p>

<p><strong>回敬:</strong></p>

<p>APIJSON给出的是公开的随时可用的文档;<br
/>传统模式下是不同后端写出水平不一、参差不齐的还可能只有在公司内才能看的文档。<br
/>

APIJSON的文档仅针对通用特性,少量、统一、清晰;<br
/>传统模式下的文档要根据不同业务逻辑、不同功能划分,一般的程序员还真写不好,内容多、容易混乱,难免出现不少错误和坑。当然如果和你配合的后端是个大牛就当我没说。<br
/>总之,传统方式不仅导致服务端开发成本高、客户端要等服务端开发完接口和文档才能请求,而且很容易被文档的错误坑,增加大量的调试和沟通成本;<br
/>而APIJSON大幅简化了连接方式,降低了双方的开发和沟通成本;将后端的业务逻辑和前端/客户端的UI分离类似于MVP开发模式的Model和View解耦,大幅降低了开发和调试难度。</p>

<p> </p>

<p><strong><strong><strong><strong>偏见5</strong></strong>:</strong></strong></p>

<p>如果要这样设计的话,那不如让js直接访问数据库,还可以没有接口!</p>

<p><strong>回敬:</strong></p>

<p>这会导致以下问题:<br
/>1.前端、客户端需要了解后端结构、会使用数据库;<br
/>2.容易引发sql注入,不安全。如果要预防sql注入,需要从文本提取字段去分析,代码又会很臃肿。</p>

<p> </p>

<p><strong><strong><strong><strong><strong>偏见6</strong></strong>:</strong></strong></strong></p>

<p><strong>APIJSON可以让客户端传一个columns字段来指定需要的字段</strong>这种方式会造成客户端服务器的强耦合,比如有一天我删了这个columns,所有依赖这个columns的消费方都挂了</p>

<p><strong><strong><strong>回敬:</strong></strong></strong></p>

<p>传统方式删掉不照样会挂?你把currentUserId、pageNum或者User里的id、name、head删掉一个试试?</p>

<p> </p>

相关文章

No Comments, Be The First!
近期评论
    功能
    网站地图xml地图