標籤:style http color os io 使用 ar 檔案 資料
如果你想向遠程伺服器發起HTTP 串連,Node 也是很好的選擇。Node 在許多情景下都很適合使用,如使用Web service,串連到文檔資料庫,或是抓取網頁。你可以使用同樣的http 模組來發起HTTP 要求,但應該使用http.ClientRequest 類。該類有兩個Factory 方法:一個通用的方法和一個便捷的方法。
var http = require(‘http‘);
var opts = {
host: ‘www.google.com‘
port: 80,
path: ‘/‘,
method: ‘GET‘
};
var req = http.request(opts, function(res) {
console.log(res);
res.on(‘data‘, function(data) {
console.log(data);
});
});
req.end();
(method)是可選項,如果沒有指定,預設會設定為GET。最後需要注意的一點是,需要結束(end())該請求。因為這是一個GET 請求,所以我們並不會往伺服器發送任何資料。但對於其他的HTTP 方法,比如PUT 或POST,你可能需要發送資料。request 會等待end() 方法調用後,才初始化HTTP請求,因為在那之前,它不確定我們是否還會發送資料。
GET 是很常見的HTTP 使用方式,因此提供了一個專門的Factory 方法來更方便地使用
它,如例4-10 所示。
var http = require(‘http‘);
var opts = {
host: ‘www.google.com‘
port: 80,
path: ‘/‘,
};
var req = http.get(opts, function(res) {
console.log(res);
res.on(‘data‘, function(data) {
console.log(data);
});
});
這個例子的http.get() 和之前的例子做了一樣的事情,但更加明確。我們把method屬性從設定物件中去掉了,還把request.end() 也移除了,因為這些都已經隱含說明了。如果運行了這兩個例子,你得到的結果將是Buffer 對象的裸資料。本章後續會介紹到,Buffer 是Node 特殊定義的類,用來支援任意位元據的儲存。雖然你也可以直接使用這些內容,但通常要指定編碼方式,如UTF-8(一種Unicode 字元的編碼格式),這可以通過response.setEncoding() 方法來指定.
> var http = require(‘http‘);
> var req = http.get({host:‘www.google.com‘, port:80, path:‘/‘},
function(res) {
... console.log(res);
... res.on(‘data‘, function(c) { console.log(c); });
... });
> <Buffer 3c 21 64 6f 63 74 79 70
...
65 2e 73 74>
<Buffer 61 72 74 54 69
...
69 70 74 3e>
>
> var req = http.get({host:‘www.google.com‘, port:80, path:‘/‘},
function(res) {
... res.setEncoding(‘utf8‘);
... res.on(‘data‘, function(c) { console.log(c); });
... });
> <!doctype html><html><head><meta http-equiv="content-type
...
load.t.prt=(f=(new Date).getTime());
})();
</script>
發送HTTP POST 和PUT 資料
不是所有的HTTP 要求都是用GET 方法的,你還需要調用POST、PUT 和其他HTTP
方法,它們會改變對方的資料。這和發送GET 請求的功能一樣,只不過你還需要往
上發送一些資料(例4-12)。
var options = {
host: ‘www.example.com‘,
port: 80,
path: ‘/submit‘,
method: ‘POST‘
};
var req = http.request(options, function(res) {
res.setEncoding(‘utf8‘);
res.on(‘data‘, function (chunk) {
console.log(‘BODY: ‘ + chunk);
});
});
req.write("my data");
req.write("more of my data");
req.end();
這個例子和例4-10 很相似, 但增加了http.ClientRequest.write() 方法。可以用這個方法發送上行資料流。之前解釋過, 它要求你顯式地調用http.ClientRequest.end() 方法來表示資料發送完畢。每當調用ClientRequest.write() 時,資料會馬上上傳(不會被緩衝),但伺服器在ClientRequest.end()調用之前是不會響應你的資料請求的。你可以把一個流(Stream)的data 事件和ClientRequest.write() 綁定在一起,這樣就能把資料以流的形式發送給伺服器了。比如當需要把硬碟上的一個檔案通過HTTP 發送給遠程伺服器時,這會是個好主意。
node.js模組之http模組