在C#、OC中也是客戶端發起一個請求,服務端作出響應。我們可以把這個過程抽象理解 .
1.客戶端給服務端發起請求相當於向服務端寫入一個流(writable)
2.服務端讀取客戶端的流(readable)
3.服務端向客戶端作出響應相當於向客戶端寫入一個流(writable)
4.客戶端讀取服務端的響應(readable)
整個流程分為兩部分一是客戶端的處理而是服務端的處理.最主要的還是客戶端請求和服務端響應.
一、http.ClientRequest對象
它實現了writable流,可以使用它的所有功能。http模塊中使用http.request(options,callback)方法來生成該對象。
1.options主要包括以下幾個可選:
host :服務器域名或IP地址,默認localhost
hostname:與host相同,但對url.parse()的支持優於host.
port:端口
localAddress:網絡連接的本地接口
socketPath:Unix域套接字(使用host:port或socketPath)
method:請求方法 :GET、POST等默認GET
path:請求的資源路徑默認/.也可包括查詢字符串
headers:請求頭
auth:身份認證
agent:代理.如果使用Agent,則請求默認為Connection:keep-alive.可能的值有undefined,Agent,false
2.ClientRequest提供的事件與方法
事件:
response:當從服務器收到該請求的響應時發出。該回調處理程序接收一個IncomingMessage對象作為唯一的參數。
socket:當一個套接字分配給該請求時發出。
connect:當服務器響應一個由CONNECT方法發起的一個請求時發出。如果該事件未被客戶端處理,那么該連接將關閉
upgrade:當服務器響應在其標頭包括一個更新請求的請求時發出
continue:當服務器發送一個100ContinueHTTP響應,指示客戶端發送請求正文時發出
方法:
write()、end()和writable流一樣
abort():終止請求。
setTimeout(timeout,[callback]):設置請求超時時間
setNoDelay([noDelay]):noDelay布爾值,true立即寫入,false緩沖寫入
setSocketKeepAlive([enable],[initualDelay]):啟用和禁用對客戶機請求的保持活動功能。initualDelay指定最后一個數據包和第一個保持活動請求之間的延遲。
二、http.ServerResponse對象
和http.ClientRequest對象一個也是實現了writable流。也可實現writable流的功能,另外還包括下面的事件屬性和方法。
事件或屬性:
close:在Response.End()刷新響應之前關閉時發出。
headersSent:布爾值.已發送為true.只讀。
sendDate:布爾值,true時,Date標頭自動生成,並作為響應的一部分發送
statusCode:無須顯示的寫入標頭來指定響應狀態碼。
方法:
writeContinue():發送一個HTTP/1.1 100 Continue消息給客戶端,請求被發送的正文內容
writeHead(statusCode,[reasonPhrase],[headers]):把一個響應標頭寫入請求。statusCode參數是HTTP響應狀態代碼,reasonPhrase是字符串,表示StatusCode的原因.headers是響應標頭對象。response.writeHead(200,'Success',{'Content-Length':body.length,'Content-Type':'text/plain'});
setTimeout(msecs,callback):設置客戶端連接的超時時間。
setHeader(name,value):設置標頭值。
getHeader(name):獲取標頭值。
removeHeader(name):移除標頭。
addTrailers(headers):將http尾隨標頭寫入響應的結束處。
三、客戶端響應和服務端請求
上面一二主要是writable流的,readable流的包括客戶端響應和服務端請求。它們都是一個對象:IncomingMessage對象。
IncomingMessage對象長成什么樣子可以把它輸出來看.由於IncomingMessage對象對於我們開發的來說不經常用,所以看看就好。
var http=require("http") var options={ hostname:'www.baidu.com', path:'', port:'80', method:'GET' }; var req=http.request(options,function(response){ console.log(response); }); req.end();