2013년 5월 19일 일요일

Meteor에서 REST API를 사용하는 방법 #2

server쪽 API를 router package를 사용해 쓰다보면 header 같은 걸 다루거나 할땐 너무 단순하게 만들어서 곤란할 수 있다.
이전에도 다룬 적(http://spectrumdig.blogspot.kr/2012/08/meteor-rest.html)이 있지만 __meteor_bootstrap__ 객체를 통해 접근하면 node.js 식의 접근이 가능하다.

Meteor update와 함께 Npm 객체가 생겼으니 이를 이용해 connect 객체를 사용해보자
http://www.slideshare.net/cjoudrey/building-your-first-node-app-with-connect-express
위 슬라이드를 한번 보면 이해에 도움이 될 것이다.

WebApp.connectHandlers 가 connect.createServer()라는 걸 기억하면 된다.



connect = Npm.require 'connect'
server = WebApp.connectHandlers
server.use connect.router (app)->
app.get '/info', (req,res)->
res.end "info"
app.get '/user/:id', (req,res)->
res.end "user id: #{req.params.id}"

이와 같은 코드를 server 디렉토리에 안에 넣거나 Meteor.isServer일때 실행하도록 하자.
파일 업로드나 쿼리 문자열 처리(ex: ?a=1&b=c)하려면
각각 bodyParser(http://www.senchalabs.org/connect/bodyParser.html) 와 query(http://www.senchalabs.org/connect/query.html)를 추가하는 것이 좋다.
위의 해당 링크에 보면 소스까지 공개 해놓아서 이해하기 쉬우니 필요한게 있으면 추가해보자. (가령 logger라든지...)



connect = Npm.require 'connect'
server = WebApp.connectHandlers
server.use connect.bodyParser()
server.use connect.query()
server.use connect.router (app)->
app.get '/info', (req,res)->
res.end "info"
app.get '/user/:id', (req,res)->
res.end "user id: #{req.params.id}"
app.post '/user', (req, res)->
res.end "user name: #{req.body.user.name}"
app.get '/search', (req,res)->
res.end "search : #{req.query.q}"



$ curl -d '{"user":{"name":"tj"}}' -H "Content-Typeon" http://localhost:3000/user
user name: tj


$ curl http://localhost:3000/search?q=something
search : something

위 두개의 curl 명령은 각각 bodyParser와 query모듈이 없으면 오류를 발생한다. body와 query 객체가 request 객체 안에 없으니까.

Npm이 그랬던 것 처럼 __meteor_bootstrap__.app 도 세련되게 포장해야하지 않나 싶은데 그건 또 그때 일 :)


* Updatehttps://github.com/tmeasday/meteor-router/blob/master/lib/router_server.js 소스를 보니 기존의 __meteor_bootstrap__.app 이 WebApp.connectHandlers 로 바뀌었다.
만일 패키지를 만들었고 그것이 이전 버전과 하위 호환을 유지하고 싶다면 require와 connect.createServer에 대해

@require = if Npm? then Npm.require else __meteor_bootstrap__.require
@server = if WebApp?.connectHandlers? then WebApp.connectHandlers else __meteor_bootstrap__.app

과 같이 정의해서 쓰는 것도 좋겠다.

2013년 5월 11일 토요일

rvictl로 iOS Network packet을 보자.

iOS 5이후 부턴 USB로 장비를 연결하고 rvictl이란 명령으로 네트워크 패킷을 볼 수 있다고 한다.


$ rvictl

rvictl [-h][-l][-s <udid1> ... <udidN>][-x <udid1> ... <udidN>]

Remote Virtual Interface Tool starts and stops a remote packet capture instance
for any set of attached mobile devices. It can also provide feedback on any attached
devices that are currently relaying packets back to this host.

Options:
-l, -L List currently active devices
-s, -S Start a device or set of devices
-x, -X Stop a device or set of devices

내용은 간단.
UDID 입력하고 -s 로 시작 -l로 확인 -x로 정지.

한번 해보자


$ rvictl -s <UDID>

Starting device <UDID> [SUCCEEDED]


이런 식으로 나오면 성공. USB연결을 꼭 확인하자. 참고로 iPhone Simulator 에서도 UDID만 있으면 작동한다는 이야기가 있음; 어디다 쓸진 모르겠지만;;

확인해보자.

$ rvictl -l

Current Active Devices:

[1] <UDID>

아까 그 UDID 가 목록에 있으면 성공.

ifconfig 로 잘 들어갔나 확인해보자.


$ ifconfig -l
lo0 gif0 stf0 en0 p2p0 utun0 rvi0



rvi0이 들어갔으면 성공.


$ ifconfig rvi0
rvi0: flags=3005<UP,DEBUG,LINK0,LINK1> mtu 0

이런 식이다.

그다음은?
뭐 wireshark를 쓰던지 tcpdump를 쓰던지 마음대로

$ tcpdump -n -t -i rvi0 -q -A tcp
로 뽑아봤더니 잘 나오더라.