- 學(xué)習(xí)如何使用nodejs向其他web服務(wù)器發(fā)送請求是十分重要的
- http已經(jīng)演變成為并非僅用于交換最終渲染,展示給用戶的標(biāo)記文本,而且它還是服務(wù)器在不同網(wǎng)絡(luò)環(huán)境傳遞數(shù)據(jù)的一種方式,同時,json 因其語法衍生自js線性對象,也快速成為http默認(rèn)的標(biāo)準(zhǔn)數(shù)據(jù)格式,這也是nodejs在服務(wù)器端的優(yōu)勢之一
- 這里我們會學(xué)習(xí)到如何查詢twitter API 獲取json數(shù)據(jù),并解碼成為一種數(shù)據(jù)結(jié)構(gòu),以方便對其進行迭代后生成人類可讀的形式
創(chuàng)建模塊
- 慣例,創(chuàng)建一個項目,創(chuàng)建一個package.json文件
- 不一一贅述
發(fā)送一個簡單的HTTP其你去
- 我們通過http模塊中得request靜態(tài)方法穿件一個Client對象
- 我們先回顧之前的http服務(wù)器
const http = require('http');
http.createServer(function (req, res) {
res.writeHeader(200);
res.end('hello world');
}).listen(3000);
- 再寫一個客戶端來抓取響應(yīng)內(nèi)容并打印在控制臺
const http = require('http');
http.request({
host: '127.0.0.1',
port: '3000',
url: '/',
method: 'GET'
}, function (res) {
let body = '';
res.setEncoding('utf8');
res.on('data', function (chunk) {
body += chunk;
});
res.on('end', function () {
console.log('\n We got:\033[96m' + body + '\033[39m\n');
});
}).end();
-
- 上述代碼中,首先調(diào)用了
request
方法,此方法用于初始化一個新的http.Client Request對象
- 上述代碼中,首先調(diào)用了
我們手機信息快的方式和此前在服務(wù)器端收起客戶端消息塊的方式一樣,連接的遠(yuǎn)程服務(wù)器會返回不同的數(shù)據(jù)塊,我們需要將他們?nèi)渴占~能得到完整的響應(yīng),當(dāng)然,也有可能所有的數(shù)據(jù)在一個data事件中都到達(dá)了,只不過我們無從所得
所以在這里我們要監(jiān)聽end事件,然后將body數(shù)據(jù)打印到控制臺
我們還通過響應(yīng)對象上編碼格式設(shè)置成了utf8,當(dāng)然如果是在獲取圖片就不行了
發(fā)送數(shù)據(jù)
在之前的例子中,我們調(diào)用完request 之后,還需要調(diào)用end
原因是在創(chuàng)建完一個請求之后,在發(fā)送給服務(wù)器錢還可以和request對象進行交互
這次已經(jīng)是創(chuàng)建表單,但是我們這次用 stdin來處理
-
服務(wù)器端處理表單
const qs = require('querystring'); const http = require('http'); http.createServer(function (req, res) { let body = ''; req.on('data', function (chunk) { body += chunk; }); req.on('end', function () { res.writeHeader(200); res.end('Done'); console.log('\n got name: \033[90m' + qs.parse(body).name + '\033[39m \n'); }); }).listen(3000);
?
客戶端也要做對應(yīng)處理
let http = require('http'), qs = require('querystring');
function send(theName) {
http.request({
host: '127.0.0.1',
port: 3000,
url: '/',
method: 'POST'
}, function (res) {
res.setEncoding('utf8');
res.on('end', function () {
console.log('\n \033[96m request complete! \033[39m');
process.stdout.write('\n your name: ');
});
}).end(qs.stringify({name: theName}));
}
process.stdout.write('\n your name: ');
process.stdin.resume();
process.stdin.setEncoding('utf8');
process.stdin.on('data', function (name) {
send(name.replace('\n', ''));
});
注意上述代碼是通過end方法發(fā)送的,和我們在服務(wù)器創(chuàng)造響應(yīng)消息方式y(tǒng)一樣
圖示
第二個 沒有顯示your name 是客戶端沒有走到結(jié)束..但是回車以后還是可以提交到服務(wù)端
第三個是通過瀏覽器直接訪問沒有攜帶任何數(shù)據(jù)所以是 undefined
獲取推文
- 我們創(chuàng)建tweets命令,該命令接收一個搜索參數(shù),然后將最近的相關(guān)話題推文展示出來
- Twitter開放的API文檔,URL是這樣的
http://search.twitter.com/search.json?q=blue+angels
這個已經(jīng)過期了...更新版本了
The Twitter REST API v1 is no longer active. Please migrate to API v1.1. https://dev.twitter.com/docs/api/1.1/overview.
- 現(xiàn)在貌似用Twitter的API 需要進行審查了 ,就暫時擱淺了這個小的demo