因為之前項目一直用的是google的protobuf(以下稱pb)用來做傳輸?shù)母袷?具體說 就是用這個來序列化數(shù)據(jù) 為的就是傳輸速度和體積?
這張是效率對比圖 (從別人那A來的) 可以明顯看出 pb的效率極高?
可惜越是方便的東西 越是好用的東西 開始總不是那么順手?
pb需要編寫 .proto文件 然后用google的編譯器進行編譯 (可以編譯成很多語言 比如 c++和java等)?
```
package tutorial;
option java_package = "com.example.tutorial";
option java_outer_classname = "AddressBookProtos";
message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phones = 4;
}
message AddressBook {
repeated Person people = 1;
}
```
這是pb文件的寫法 不詳細(xì)描述 請翻墻看 https://developers.google.com/protocol-buffers/docs/javatutorial?
剛開始走了很多歪路 ?因為其實百度 pb的資料 大多數(shù)都是從googl官網(wǎng)A下來 教你怎么編譯的 然后有一些基礎(chǔ)的寫法 比如 ?required repeat optional 等 税手。沮尿。就是一些基礎(chǔ)的用法 這并不能滿足我們的需求?
因為你如果要在java里面使用 ?(我用的最多的是給手機端寫接口) 刊驴,那么你知道以上的并不能使用 需要知道更多的東西 比如 rpc 和 grpc ?我之前一直不明白 看人家說的好高端
其實你只要涉及到寫接口 ?那么你其實和rpc接觸過很多很多 ?(請自行百度rpc)?
RPC(Remote Procedure Call Protocol)——遠(yuǎn)程過程調(diào)用協(xié)議?
我粗鄙的理解就是? c/s? 當(dāng)遠(yuǎn)程的客戶端(ios或者android)調(diào)用你部署在服務(wù)器上(可以是tomcat跑 或者 jetty 或者 。笤昨。。)的接口 ?那么就是 rpc 至于grpc 握恳。瞒窒。還是google吧 ?其實就是用pb來做序列化的 。乡洼。 其他還有一些變化?
————————
我一直在用pb 然而ios的同事不會去用崇裁。匕坯。我也不知道該怎么和他說 (只會寫pb的接口)所以就準(zhǔn)備改成json的。然后碰到一系列蛋疼的問題 比如 亂碼 比如 content-type 不是 application/json 拔稳,把我弄的欲仙欲死?
現(xiàn)在開始說 換成json后出現(xiàn)的問題 首先是亂碼 我在spring-mvc.xml里面已經(jīng)配置了 消息轉(zhuǎn)化器 并且 設(shè)置為 utf-8 然而還是 亂碼 后來 web.xml里面也設(shè)置了字符過濾 還是不行?
后來百度n多資料得知 其實是 spring框架內(nèi) StringHttpMessageConverter 類中葛峻,默認(rèn)采用的字符集是 ISO-8859-1 。 而我接口返回的都是 string 自然而然亂碼 巴比。其實你只要封裝一個類來做返回類型 就不會出現(xiàn)這樣的問題 這種問題只有在string的時候才會出現(xiàn)?
然而知道了問題的我 還是想返回string 因為感覺比較簡潔 (其實不然术奖。。轻绞。) 采记, 然后看解決方法 ?
網(wǎng)上搜集的文章 http://blog.csdn.net/wangyangbto/article/details/48804155
? ? ? ? ? ? ? ? ? ? ? ? ? http://blog.csdn.net/sen19910708/article/details/49933213
大致是兩種 一種是重寫那個 StringHttpMessageConverter 類 。
還有一種是 修改 spring配置里面的消息配置器 直接修改為 utf-8 (試過好像不行)
這個問題解決后 ?讓ios測試接口 政勃。唧龄。和我說協(xié)議不對 我一看?
。奸远。既棺。 無語了。然走。然后開始找問題 援制。后來看到 原來你返回json 使用的是 @responsebody 這個注解 然而這個注解 會自動根據(jù) 瀏覽器 響應(yīng)時候的 accept的第一個值作為 content-type。 如果你不指定的話
然后就只能在requestmapping上加上 @RequestMapping(value ="/test",produces="application/json;charset=UTF-8")
然后就不會出現(xiàn)這個問題了芍瑞。晨仑。 但是難道每個都要這樣寫嗎 我找遍了百度 好像還是不行
認(rèn)命? 其實可以寫個 Inteceptor 然后在 spring配置里面加載 達到全局效果
————————————
暫時告一段落 ?其實 ? content-type的格式 不代表你所使用的技術(shù) ios和我說 你怎么傳回來的是 text/html 這都沒人用了 如果你用這個 我還要json干嘛 ?其實這是誤區(qū) ?content-type只是你看的格式 不代表你傳輸中的序列化的格式 ? 兩者并無多大關(guān)系 ? 不過他的網(wǎng)絡(luò)協(xié)議框架 只會 json 那干后臺的我們就只能改了拆檬。洪己。?
還有處理時間戳 辦法很多 可以在字段上 注解 ?前提是你用的是 fastjson ?, jackson也是可以的?
關(guān)于 pb的 其他東西 https://github.com/jhunters/jprotobuf ?(這玩意好像是和百度有關(guān)系 好像是百度的人寫的竟贯。答捕。)不需要在寫pb文件 可以直接實體類上 直接注解 達到一樣的效果?