A. 如何優雅的「編寫」api介面文檔
一些剛開始寫介面文檔的服務端同學,很容易按著代碼的思路去編寫介面文檔,這讓客戶端同學或者是服務對接方技術人員經常吐槽,看不懂介面文檔。這篇文章提供一個常規介面文檔的編寫方法,給大家參考。
推薦使用的是docway寫介面文檔,方便保存和共享,支持導出PDF MARKDOWN,支持團隊項目管理。
一、請求參數
1. 請求方法
GET
用於獲取數據
POST
用於更新數據,可與PUT互換,語義上PUT支持冪等
PUT
用於新增數據,可與POST互換,語義上PUT支持冪等
DELETE
用於刪除數據
其他
其他的請求方法在一般的介面中很少使用。如:PATCH HEAD OPTIONS
2. URL
url表示了介面的請求路徑。路徑中可以包含參數,稱為地址參數,如**/user/{id}**,其中id作為一個參數。
3. HTTP Header
HTTP Header用於此次請求的基礎信息,在介面文檔中以K-V方式展示,其中Content-Type則是一個非常必要的header,它描述的請求體的數據類型。
常用的content-type:
application/x-www-form-urlencoded
請求參數使用「&」符號連接。
application/json
內容為json格式
application/xml
內容為xml格式
multipart/form-data
內容為多個數據組成,有分隔符隔開
4. HTTP Body
描述http body,依賴於body中具體的數據類型。如果body中的數據是對象類型。則需要描述對象中欄位的名稱、類型、長度、不能為空、默認值、說明。以表格的方式來表達最好。
示例:
五、介面工具
推薦使用的是http://docway.net(以前叫小幺雞) 寫介面文檔,方便保存和共享,支持導出PDF MARKDOWN,支持團隊項目管理。
B. 使用node.js,實現一個簡單的介面伺服器的功能
varhttp=require('http');
varmysql=require('mysql');
varconnection=mysql.createConnection({
host:'localhost',
user:'me',
password:'secret',
});
//開始你的mysql連接
connection.connect();
varserver=http.createServer(function(req,res){
//如果你發一個GET到http://127.0.0.1:1337/test?a=1&b=2的話
varurl_info=require('url').parse(req.url,true);
//檢查是不是給/test的request
if(url_info.pathname==='/test'){
//把query用urlencode,這樣可以用post發送
varpost_data=require('querystring').stringify(url_info.query);
//post的option
varpost_options={
host:'localhost',
port:1337,
path:'/response_logic',
method:'POST',
headers:{
'Content-Type':'application/x-www-form-urlencoded',
'Content-Length':post_data.length
}
};
//發出post
varrequest_made=http.request(post_options,function(response_received){
varbuf_list=newArray();
response_received.on('data',function(data){
buf_list.push(data);
});
response_received.on('end',function(){
varresponse_body=Buffer.concat(buf_list);
res.end(response_body);
connection.query('insertinto.........',function(err,rows,fields){
//處理你的結果
});
});
});
//發出post的data
request_made.end(post_data);
}
//這個是用來回復上面那個post的,顯示post的數據以表示成功了。你要是有別的目標,自然不需要這一段。
else{
req.pipe(res);
}
});
server.listen(1337,'127.0.0.1');
//在server關閉的時候也關閉mysql連接
server.on('close',function(){
connection.end();
});
console.log('listeningonport1337');
C. 怎樣使用node.js開發restful-api服務
Restful風格的WebService正在漸漸取代傳統的SOAP, java 也有很多Restful的框架,很方便簡潔,Jersey,restlet,甚至SpringMVC也可以,不得不說Rest讓人從Web轉型到WebService更容易和方便,當然深入Restful的理論還是發現比較復雜的,但是,開發和理論並不需要那麼的貼合,有時候偽Restful更直觀,靠譜些。
但是,作為很帥的Node.js怎麼可以不和同樣帥氣的Restful相結合呢!?對於我們這種無視理論的開發者來說,Restful不就是url的規范+HTTP method的規范而已嘛,所以Node這種很自由的技術來說,同樣實現restful變的非常正常。不需要什麼框架,但是我還是用了Express,Express只是對原生的http模塊的一層封裝而已,不要那麼計較嘛!
Java曾經是一個Xml配置文件橫行的世界,現在是各種Annotation(註解)亂入的世界,雖然註解的侵入性比較小,但是加了一摞註解的類也讓人傷神,尤其是各框架混雜的註解,好在各大框架還是比較自覺的,各種負責不同的層,所以還不會導致各種註解的混亂。好了,那麼下面歡迎來到,沒有註解,也沒用xml的世界:
----我是例子---------
[javascript] view plain
var express = require('express') //載入模塊
var app = express() //實例化之
var map = {"1":{id:1,name:"test"},"2":{id:2,name:"test"}} //定義一個集合資源,key為字元串完全是模仿java MAP<T,E>,否則誰會這么去寫個hash啊!
app.get('/devices',function(req, res){ //Restful Get方法,查找整個集合資源
res.set({'Content-Type':'text/json','Encodeing':'utf8'});
res.send(map)
})
app.get('/devices/:id',function(req, res){ //Restful Get方法,查找一個單一資源
res.set({'Content-Type':'text/json','Encodeing':'utf8'});
res.send(map[req.param('id')])
//console.log(req.param('id'))
})
app.post('/devices/', express.bodyParser(), function(req, res){ //Restful Post方法,創建一個單一資源
res.set({'Content-Type':'text/json','Encodeing':'utf8'});
map[req.body.id] = req.body
res.send({status:"success",url:"/devices/"+req.body.id}) //id 一般由資料庫產生
})
app.put('/devices/:id', express.bodyParser(), function(req, res){ //Restful Put方法,更新一個單一資源
res.set({'Content-Type':'text/json','Encodeing':'utf8'});
map[req.body.id] = req.body
res.send({status:"success",url:"/devices/"+req.param('id'),device:req.body});
})
app.delete('/devices/:id',function(req, res){ //Restful Delete方法,刪除一個單一資源
res.set({'Content-Type':'text/json','Encodeing':'utf8'});
delete map[req.param('id')]
res.send({status:"success",url:"/devices/"+req.param('id')})
console.log(map)
})
app.listen(8888); //監聽8888埠,沒辦法,總不好搶了tomcat的8080吧!
---------我是測試-----------
D. 在node.js領域中哪一個框架用來架構API比較好
程序 or 框架?
程序是已經成型的應用,你需要的是為它搭建環境、添加配置,然後就可以運行起來;框架則是應用的骨架,你需要為它添加數據模型、業務邏輯,它才能成為應用,開始提供服務。
事實上,對於Web開發來說,程序和框架的區別正越來越模糊,比如幾乎婦孺皆知的Wordpress,它是一個博客程序,但它豐富的插件以及高度的 自定義能夠支持很大程度上的二次開發,在這點上它比起一些PHP框架也並不遜色。我個人認為,如果重心在於提供服務而不是掌握技術,有WordPress 這樣的程序是沒有必要使用框架的。
可惜的是,由於Nodejs還很年輕,目前還沒有WordPress這樣的程序,因此目前在Node.js開發里,如果想做出自己想要的作品,框架是必然的選擇。如果是某些特定類型的應用,可以嘗試一些開源的程序,比如要用Nodejs做博客,有Hexo、Ghost等。
回到頂部
Node.js Web框架有哪些?
Node.js里的Web框架分為API框架和Web應用框架。前者能夠開發出RESTful的API,後者也能開發出RESTful API,但還包括模板、渲染等為前端所准備的功能。
API框架的使用場景是為跨平台應用提供統一的數據模型,而渲染由前端/客戶端自行解決。目前比較知名的API框架有
restify(文檔、Github、NPM)
ActionHero.js(官網、Github、NPM)
LoopBack(官網、Github、NPM)
Frisby(官網、Github、NPM)
Fortune.js(官網、Github、NPM)
Web應用框架顧名思義,就是為了打造Web應用所開發的框架。這里有兩種風格的Web應用框架。
一個是Sinatra風格,另一個是Rails風格。Sinatra和Rails都是Ruby語言的Web框架,後者的影響力更大也更為知名。這里簡單的解釋一下兩種風格是什麼意思。
Sinatra風格是指高度可配置,注重開發的自由度。代表性的Nodejs Web框架有:
Express(官網、Github、NPM)TJ大神開發,Node.js官方推薦
hapi(官網、Github、NPM)
koa.js(官網、Github、NPM)
flaliron(官網、Github、NPM)
total.js(官網、Github、NPM)
locomotive(官網、Github、NPM)
Rails風格則是指不重復自己和約定優於配置,以及嚴格遵循MVC結構開發。代表性的框架有:
Sails.js(官網、Github、NPM)
geddy(官網、Github、NPM)
CompoundJS(官網、Github、NPM) 原railswayjs
這兩種風格無所謂誰優誰劣,全憑使用者的偏好。
而在這兩種Web框架之外,還有更大型的框架,即全棧框架,其中的代表是MEAN。
回到頂部
MEAN?
MEAN指MongoDB+Express+Angular.js+Node.js,這一組合包括運行環境、資料庫、Web框架和前端引擎。被稱為 全棧框架(Full-stack framework)。這其中除了Node.js之外,每一個都是可替換的,目標是創建從前端到後端,全部使用javascript的Web應用。
由於這一框架的完善性,有人將其稱為LAMP的接班人。LAMP即PHP的典型運行環境,Linux+Apache+MySql+PHP,被大量的用於各種虛擬主機上。
MEAN看似龐大,但事實上要構建完整的現代化Web應用,特別是SPA(單頁面應用),這幾個組件都是難以缺少的,並且,其中每一項幾乎都是目前 情況下的最佳選擇,因此用於學習和重頭開始打造新的Web應用是非常合適的。但由於實際業務的獨特性,很可能要替換其中的組件,比如用Mysql來替換 MongoDB,因此,學習其中的原理和架構,打造自己的類MEAN框架也是一種選擇。
作為個人和小團隊來說,全棧框架MEAN基本上足夠了,但目前大多數全棧框架還包含一項特性,那就是實時,擁有實時功能的框架我們又稱為實時框架。
回到頂部
實時框架好嗎?
實時框架(Real-time framework)指包含了webSocket的雙向通信功能,能夠在伺服器和客戶端做到實時通信的框架。
服務端和客戶端自由通信的需求一直都在,但由於HTTP協議本身的局限性,因此催生了Comet等變通的方法,但即使這樣也離實時相距甚遠。而當 Node.js興起後,另一個HTML5技術webSocket也漸漸成熟,人們突然發現,實時通信一下子變得觸手可及,於是webSocket技術在 Node.js中得到大量的應用,其中最為知名的模塊就是socket.io,而各種全棧框架也紛紛加入實時特性來應對更廣闊的開發需求。
目前有代表性的實時框架有:
Meteor(官網、Github、NPM)
MEAN.io(官網、Github、NPM)
Derby(官網、Github、NPM)
SocketStream(官網、Github、NPM)
不過說實話,目前能看到的實時通信的應用場景其實不多,其中大多集中於聊天室、to-do、實時圖表、在線游戲等領域。其他領域使用實時特性不但沒必要,而且是對伺服器資源的浪費。因此目前是否要採用實時框架,要看具體的項目而定。
以上基本就是Node.js Web框架的現狀了,相信看到這里,對於選擇何種框架讀者已經心裡有數了吧。最後再介紹一個容易搞混的概念,和解釋一下我的選擇。
回到頂部
YEOMAN?
第一次見到這個詞,我還以為它和MEAN有什麼聯系。事實上,它們是截然不同的兩個東西。YEOMAN由YO(腳手架)、grunt(構建工具)、bower(包管理器),它代表的是一種工作流,與框架開發的思維方式完全不同。具體的介紹可見這里。
YEOMAN能夠和框架達到類似的目的,都是為構建一個Web應用做好准備,但是要不要採用YEOMAN,則是見仁見智。我個人的看法是,學習 YEOMAN本身就需要不少時間,並且有一定的學習門檻。至少在目前,使用框架開發還是相對經濟的,而如果以後YEOMAN這種模式推廣開來,再來學習也 不遲,更何況有一定的Node.js項目經驗之後再來學習YEOMAN要輕松很多。
事實上,我還是很認可YEOMAN這種Generator+package Manager的模式的,這是因為Node.js本身崇尚微模塊的 概念,即無論是多麼小的功能,都將它們模塊化,甚至大的模塊也要拆分成小的模塊,然後通過搭積木的方式來構建應用。這樣能夠徹底的解耦,對於不容易調試的 Javascript來說,也有助於定位和修復應用中的問題。Generator就是這種理念催生下的產物,通過選擇不同的配置和選項,將積木搭起來。不 過對於這種模式目前大家也還處於實驗當中,不急於進行實際應用。
回到頂部
為什麼我選擇了Hackathon Starter?
在我的個人項目中,使用的是Hackathon Starter,一個Node.js Web應用腳手架。
我使用它的原因是,要求高度可配置,同時又討厭寫一些配置的代碼,因此它對於我來說是很好的選擇。一些全棧框架對我來說,封裝過多,將原生的 Node.js/Express API隱藏掉了,要使用還需要一定的學習成本。而Express這樣的框架又太過簡潔,在實際的項目中使用還需要大量的插件和配置,而這些在 Hackathon Starter中都已經幫我們做好了,同時還有一些示例代碼以供學習,對於新人來說非常友好,可以避免過多的挫折感。
E. node.js 怎麼請求java後台api
這是兩個伺服器之間的通訊,首先要有java伺服器的IP,類似:112.5.114.7:8010,加上url。
nodejs向另一個伺服器發送請求,使用http模塊。例:
var HTTP = require('http');
var APIGET = function (url, callback) {
console.log("向API服務請求數據中...");
var op = {
host:『112.5.114.7』,
port:『8010』,
method:'GET',
path:url
};
debug(op);
var req = HTTP.request(
op, function(res) {
var recvData = "";
res.on('data', function(chunk) {
recvData += chunk;
});
res.on('end', function() {
if (callback) {
callback(null, JSON.parse(recvData));
}
debug("請求結束");
});
});
req.on('error', function (e) {
if (callback) {
callback(e, null);
}
});
req.end();
};
F. nodejs api怎麼實現私有調用
你可以通過如下的步驟,輕松進入開發狀態
1,獲得代碼
https://github.com/mz121star/taobao.git
2,進入項目目錄,執行如下命令安裝項目的依賴包
npm install
3,修改appconfig.js文件中的Appkey和Appsecret的值(該值從你的應用證書頁面獲得)
AppKey:"從淘寶獲得的Appkey",
AppSecret:"從淘寶獲得的AppSecret"
到此為止,你已經完成了項目運行起來所需要的全部步驟,你可以通過如下命令啟動web服務.
G. nodejs做api介面好處
nodejs做api介面好處:
1、業務升級:nodejs做api介面可以幫助降低公司時間和人力運營成本;
2、實時數據傳輸:nodejs做api介面以毫秒為單位傳輸數據。這使我們的物流服務可以運行實時數據。
H. 如何系統地學習Node.js
對於剛接觸Node.js的新手來說,第一步無非是打好基礎,你需要弄明白以下事情:
JavaScript 的特性和語法。假如你對 JavaScript 還不熟悉的話,推薦書籍及鏈接:
JavaScript 推薦書籍列表
深入理解JavaScript系列
Node.js 是什麼?Node.js與JavaScript的區別是什麼?
Node.js的優點?Node.js的缺點?
Node.js適用場景?Node.js不適用的場景?
Node.js的基本語法。Node.js的特性:
單線程
非同步 IO
事件驅動
npm 是什麼?npm的基本使用
REPL
等等
其實上面的內容,大部分Node.js的書籍都有介紹。基本了解了Node.js後,我們可以寫一些 hello world 的程序:
搭建一個 HTTP 伺服器,返回 hello, world 。(使用 HTTP 模塊)
讀取一個 txt 文件,將內容顯示到命令行中。(使用 fs 模塊)
等等
第二步
你也許想,Node.js 只有那些少得可憐的核心模塊能做什麼呢?別擔心,npm 上目前有近 7W 的第三方模塊,月下載量高達 2.1億 (2014—4—20 數據)… 這才是 Node.js 的活力所在。當你對Node.js已經了解的差不多了,並且按耐不住躍躍欲試了。這個時候,我們不妨用 Node.js 的第三方模塊做些好玩的事情:
搭建一個微博網站
搭建一個博客網站
搭建一個在線聊天室
寫一個簡單的爬蟲
調用一些網站的API做一些好玩的東西
等等
但是,並不是說 Node.js 只能做以上事情,幾乎其他語言能做的事情 Node.js 都能做,而且有些情況下能做的更好。
第三步
當然,就像學 js 也不能只會用框架一樣,學習 Node.js 也不能只會用外部模塊。這個時候,我們需要回頭深入了解下 Node.js 核心模塊的用法。說白了,就是好好看 Node.js 官方 API 文檔。看文檔是碼農必備技能,英語不好的童鞋瀏覽器裝個劃詞翻譯的插件。
第四步
多實踐。不管是用核心模塊還是外部模塊,嘗試用 Node.js 解決某個問題或者替換掉以前用其他語言寫過的代碼。
讀源碼。這里說的讀源碼並不是說上來就去讀 Node 或者其他較大的框架的源碼。這個時候,挑一些簡單的只實現某個特定功能的工具模塊的源碼讀,這種模塊的代碼通常在幾百行,閱讀起來並不是很困難,但是卻能漲不少的姿勢。比如:
underscore (學習 JavaScript 的語法和技巧)
等等
第五步
堅持第四步。在使用 Node.js 時發現沒有合適的模塊選擇或者選擇的模塊功能不盡人意,這個時候你可以嘗試去創建一個模塊或者修改現有的模塊,並且使用 npm 發布自己的模塊或者去該模塊的 GitHub 上提 PR 。
第六步
多實踐。這個就不用解釋了
讀 Node 源碼及較大的框架的源碼。提高必備
多關注下 GitHub 上的牛人
重復第1-6步