node.jsでhttp GET/POSTデータの受け渡しを学ぶ
node.jsでhttp GET/POSTデータの受け渡しを学ぶ
GET/POSTの受け渡しは
まずは前回のhelloworldスクリプトを少し修正して、HTTPサーバが受け取ったパラメータを見てみる。
var ht = require('http'); ht.createServer(function (req, response){ response.writeHead(200, {'Content-Type':'text/html; charset=utf-8'}); response.end('<html><body><h1>Hello <span style="color:#c99;">Node.js</span></h1></body></html>\n'); console.log(req); }).listen(8124); console.log('Server running at http://127.0.0.1:8124/');
これを
foo@ /z/home $ node nd0606-01.js > nd0606-03request.txt
と実行して、中身を見る。
Server running at http://127.0.0.1:8124/
{ socket:
{ _handle:
{ writeQueueSize: 204,
socket: [Circular],
onread: [Function: onread] },
_pendingWriteReqs: 1,
_flags: 0,
_connectQueueSize: 0,
destroyed: false,
bytesRead: 420,
bytesWritten: 204,
allowHalfOpen: true,
writable: true,
readable: true,
server:
{ connections: 1,
allowHalfOpen: true,
_handle: [Object],
_events: [Object],
httpAllowHalfOpen: false },
ondrain: [Function],
_idleTimeout: 120000,
_idleNext:
{ _idleNext: [Circular],
_idlePrev: [Circular],
ontimeout: [Function] },
_idlePrev:
{ _idleNext: [Circular],
_idlePrev: [Circular],
ontimeout: [Function] },
_idleStart: Wed, 06 Jun 2012 10:30:40 GMT,
_events: { timeout: [Function], error: [Function], close: [Object] },
ondata: [Function],
onend: [Function],
_httpMessage: null },
connection:
{ _handle:
{ writeQueueSize: 204,
socket: [Circular],
onread: [Function: onread] },
_pendingWriteReqs: 1,
_flags: 0,
_connectQueueSize: 0,
destroyed: false,
bytesRead: 420,
bytesWritten: 204,
allowHalfOpen: true,
writable: true,
readable: true,
server:
{ connections: 1,
allowHalfOpen: true,
_handle: [Object],
_events: [Object],
httpAllowHalfOpen: false },
ondrain: [Function],
_idleTimeout: 120000,
_idleNext:
{ _idleNext: [Circular],
_idlePrev: [Circular],
ontimeout: [Function] },
_idlePrev:
{ _idleNext: [Circular],
_idlePrev: [Circular],
ontimeout: [Function] },
_idleStart: Wed, 06 Jun 2012 10:30:40 GMT,
_events: { timeout: [Function], error: [Function], close: [Object] },
ondata: [Function],
onend: [Function],
_httpMessage: null },
httpVersion: '1.1',
complete: false,
headers:
{ host: '127.0.0.1:8124',
connection: 'keep-alive',
'cache-control': 'max-age=0',
'user-agent': 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Iron/17.0.1000.1 Chrome/17.0.1000.1 Safari/535.11',
accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'accept-encoding': 'gzip,deflate,sdch',
'accept-language': 'ja,en-US;q=0.8,en;q=0.6',
'accept-charset': 'Shift_JIS,utf-8;q=0.7,*;q=0.3' },
trailers: {},
readable: true,
url: '/',
method: 'GET',
statusCode: null,
client:
{ _handle:
{ writeQueueSize: 204,
socket: [Circular],
onread: [Function: onread] },
_pendingWriteReqs: 1,
_flags: 0,
_connectQueueSize: 0,
destroyed: false,
bytesRead: 420,
bytesWritten: 204,
allowHalfOpen: true,
writable: true,
readable: true,
server:
{ connections: 1,
allowHalfOpen: true,
_handle: [Object],
_events: [Object],
httpAllowHalfOpen: false },
ondrain: [Function],
_idleTimeout: 120000,
_idleNext:
{ _idleNext: [Circular],
_idlePrev: [Circular],
ontimeout: [Function] },
_idlePrev:
{ _idleNext: [Circular],
_idlePrev: [Circular],
ontimeout: [Function] },
_idleStart: Wed, 06 Jun 2012 10:30:40 GMT,
_events: { timeout: [Function], error: [Function], close: [Object] },
ondata: [Function],
onend: [Function],
_httpMessage: null },
httpVersionMajor: 1,
httpVersionMinor: 1,
upgrade: false }
{ socket:
{ _handle:
{ writeQueueSize: 204,
socket: [Circular],
onread: [Function: onread] },
_pendingWriteReqs: 1,
_flags: 0,
_connectQueueSize: 0,
destroyed: false,
bytesRead: 765,
bytesWritten: 408,
allowHalfOpen: true,
writable: true,
readable: true,
server:
{ connections: 1,
allowHalfOpen: true,
_handle: [Object],
_events: [Object],
httpAllowHalfOpen: false },
ondrain: [Function],
_idleTimeout: 120000,
_idleNext:
{ _idleNext: [Circular],
_idlePrev: [Circular],
ontimeout: [Function] },
_idlePrev:
{ _idleNext: [Circular],
_idlePrev: [Circular],
ontimeout: [Function] },
_idleStart: Wed, 06 Jun 2012 10:30:41 GMT,
_events: { timeout: [Function], error: [Function], close: [Object] },
ondata: [Function],
onend: [Function],
_httpMessage: null },
connection:
{ _handle:
{ writeQueueSize: 204,
socket: [Circular],
onread: [Function: onread] },
_pendingWriteReqs: 1,
_flags: 0,
_connectQueueSize: 0,
destroyed: false,
bytesRead: 765,
bytesWritten: 408,
allowHalfOpen: true,
writable: true,
readable: true,
server:
{ connections: 1,
allowHalfOpen: true,
_handle: [Object],
_events: [Object],
httpAllowHalfOpen: false },
ondrain: [Function],
_idleTimeout: 120000,
_idleNext:
{ _idleNext: [Circular],
_idlePrev: [Circular],
ontimeout: [Function] },
_idlePrev:
{ _idleNext: [Circular],
_idlePrev: [Circular],
ontimeout: [Function] },
_idleStart: Wed, 06 Jun 2012 10:30:41 GMT,
_events: { timeout: [Function], error: [Function], close: [Object] },
ondata: [Function],
onend: [Function],
_httpMessage: null },
httpVersion: '1.1',
complete: false,
headers:
{ host: '127.0.0.1:8124',
connection: 'keep-alive',
accept: '*/*',
'user-agent': 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Iron/17.0.1000.1 Chrome/17.0.1000.1 Safari/535.11',
'accept-encoding': 'gzip,deflate,sdch',
'accept-language': 'ja,en-US;q=0.8,en;q=0.6',
'accept-charset': 'Shift_JIS,utf-8;q=0.7,*;q=0.3' },
trailers: {},
readable: true,
url: '/favicon.ico',
method: 'GET',
statusCode: null,
client:
{ _handle:
{ writeQueueSize: 204,
socket: [Circular],
onread: [Function: onread] },
_pendingWriteReqs: 1,
_flags: 0,
_connectQueueSize: 0,
destroyed: false,
bytesRead: 765,
bytesWritten: 408,
allowHalfOpen: true,
writable: true,
readable: true,
server:
{ connections: 1,
allowHalfOpen: true,
_handle: [Object],
_events: [Object],
httpAllowHalfOpen: false },
ondrain: [Function],
_idleTimeout: 120000,
_idleNext:
{ _idleNext: [Circular],
_idlePrev: [Circular],
ontimeout: [Function] },
_idlePrev:
{ _idleNext: [Circular],
_idlePrev: [Circular],
ontimeout: [Function] },
_idleStart: Wed, 06 Jun 2012 10:30:41 GMT,
_events: { timeout: [Function], error: [Function], close: [Object] },
ondata: [Function],
onend: [Function],
_httpMessage: null },
httpVersionMajor: 1,
httpVersionMinor: 1,
upgrade: false }長いな。
ということはサンプルを少し変えて‥‥
var ht = require('http'); ht.createServer(function (req, response){ response.writeHead(200, {'Content-Type':'text/html; charset=utf-8'}); response.end('<html><body><h1>Hello <span style="color:#c99;">Node.js</span></h1></body></html>\n'); console.log(req['headers']['user-agent']); }).listen(8124); console.log('Server running at http://127.0.0.1:8124/');
star@sssx /z/home $ node nd0606-04.js Server running at http://127.0.0.1:8124/ ここでブラウザでこれを開く Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Iron/17.0.1000.1 Chrome/17.0.1000.1 Safari/535.11 Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Iron/17.0.1000.1 Chrome/17.0.1000.1 Safari/535.11
ふむ。なんで2回でるんだろ。
star@sssx /z/home $ node nd0606-04.js Server running at http://127.0.0.1:8124/ req.method=GET req.url=/?your_name=%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF req.method=GET req.url=/favicon.ico
2回目のrequestはfavicon.icoを自動的にrequestしていたらしい。
そのスクリプトはこちら。
var ht = require('http'); ht.createServer(function (req, response){ response.writeHead(200, {'Content-Type':'text/html; charset=utf-8'}); response.end('<html><body><h1>Hello <span style="color:#c99;">Node.js</span></h1><form method="get"><input type="text" name="your_name" value="こんにちは" size="15"/><input type="submit" value="click!"/></form></body></html>\n'); console.log('req.method=' + req.method); console.log('req.url=' + req.url); }).listen(8124); console.log('Server running at http://127.0.0.1:8124/');
GETのときはreqに出てくるけど、POSTのときはreqに出てこない。