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に出てこない。