Home > プログラミング > CFNetworkでHTTP POST

CFNetworkでHTTP POST

前回の続き。

CFURLRef theURL = CFURLCreateWithString(kCFAllocatorDefault, CFSTR("http://mixi.jp/login.pl"), NULL);

mixiのログインをやってみる。

CFHTTPMessageRef theRequest = CFHTTPMessageCreateRequest(kCFAllocatorDefault, CFSTR("POST"), theURL, kCFHTTPVersion1_1);

POSTを指定してやる。

CFDataRef thePostData = CFStringCreateExternalRepresentation( NULL, CFSTR("next_url=%2Fhome.pl&email=メアド%40ドメイン.org&password=パスワード&x=71&y=14"), CFStringGetSystemEncoding(), '?');

CFStringCreateExternalRepresentation()を使ってCFDataRefをCFStringRefから作る。使い回すわけでもないのでCFSTR()で作っちゃう。後ろのx=71とかy=14って何だろう?エンコーディングはCFStringGetSystemEncoding()でよい。最後の’?'は解釈できない文字を?で置き換えるという意味らしい。

CFHTTPMessageSetBody(theRequest, thePostData);

POSTデータをくっつける。あとは前回と同じでPOSTできる。とりあえずmixiがcookieを返すので、あとは色々できそうだ。check.plがいきなりリダイレクトするので、その処理もやらないと。あと、ステータスコードも取得しないと。

Rubyのリファレンスページにあるリダイレクトのやり方。

def fetch( uri_str, limit = 10 )
  # 適切な例外クラスに変えるべき
  raise ArgumentError, 'http redirect too deep' if limit == 0

  response = Net::HTTP.get_response(URI.parse(uri_str))
  case response
  when Net::HTTPSuccess     then response
  when Net::HTTPRedirection then fetch(response['location'], limit - 1)
  else
    response.error!
  end
end

print fetch('http://www.ruby-lang.org')

なるほど、上限を決めて再帰すればいいのね。

Comments:0

Comment Form
Remember personal info

Trackback+Pingback:0

TrackBack URL for this entry
http://blog.neoneet.jp/2009/05/cfnetwork%e3%81%a7http-post/trackback/
Listed below are links to weblogs that reference
CFNetworkでHTTP POST from 週刊(月刊?)プレカリアート

Home > プログラミング > CFNetworkでHTTP POST

Search
Feeds
Meta

Page Top