• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Cocoa勉強会#33-意外に楽に使えるlibcurl
 

Cocoa勉強会#33-意外に楽に使えるlibcurl

on

  • 386 views

Cocoa勉強会#33

Cocoa勉強会#33
2009/4/11
意外に楽に使えるlibcurl
新居雅行

Statistics

Views

Total Views
386
Views on SlideShare
386
Embed Views
0

Actions

Likes
0
Downloads
0
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Cocoa勉強会#33-意外に楽に使えるlibcurl Cocoa勉強会#33-意外に楽に使えるlibcurl Presentation Transcript

    • Cocoa勉強会 #33関東 意外に楽に使えるlibcurl 新居雅行 nii@msyk.net 2009年4月8日水曜日 1
    • Agenda • • • 2009年4月8日水曜日 curlとlibcurlの紹介 libcurlの使い方 プログラムの実例 2
    • curlとlibcurlとは • cURL and libcurl • • • • curlコマンド • • • libcurl • オープンソースの通信ツール Client for URLs or Client for URL Request Library MIT/X derivate license URLを与えて通信処理ができる コマンドは「カール」と発音する curlコマンドの機能をC言語のAPIから利用できる 2009年4月8日水曜日 3
    • libcurlについて • URLを指定した通信機能を提供 • • • • • • スレッドセーフ、IPv6対応したライブラリ バージョンを重ねてかなりの高機能に ドキュメントが充実している Mac OS Xには標準搭載 APIはC言語だが、さまざまな言語で利用できる • • 2009年4月8日水曜日 オープンソース 例えばPHPやJavaなど CocoaクラスのCURLHANDLE(NSURLHandleのサ ブクラス)もあるが、フルスペックではない 4
    • プロジェクトでliburlを使う • • プロジェクトにlibcurlへの参照を作る ヘッダには、以下のように記入するのみでOK • 2009年4月8日水曜日 #import <curl/curl.h> 5
    • libcurlの参照 • • プロジェクトに新しく ファイル加える /usr/libにあるライブラ リを追加 • • 2009年4月8日水曜日 libcurl.4.dylib以外は全部 これへのシンボリックリ ンク いずれも4つのアーキテ クチャをサポート 6
    • ライブラリの番号とバージョン • libcurl.n.dylibの「n」はライブラリの番号 • • • • • • • libcurl最新版(Mac OS X 10.5.6) • • • libcurlでは、apacheのモジュールの番号で管理 SONAMEとして参照されている libcurl.4.soなどをapacheが利用(Linuxなど) SONAME=1/ libcurl Ver.7.4.2(2000/11)より付ける SONAME=2/ libcurl Ver.7.7 - 2001/3/22 SONAME=3/ libcurl Ver.7.12.0 - 2004/6/12 SONAME=4/ libcurl Ver.7.16.0 - 2006/10/30 curl_version()→libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3 libphp5.soやphpコマンドがlibcurl.4.dylibをロードしている 2009年4月8日水曜日 7
    • プログラムのポイント • 基本的には何でも以下の手順でOK (1) 初期化してハンドルを得る (2) URLを教える (3) その他のパラメータを設定(オプション設定) (4) 実行する (5) 後始末 • データの受信 • • 2009年4月8日水曜日 コールバック関数を規定に従って定義 関数をパラメータとして指定 8
    • char *buffer; URLへの単純なアクセス size_t receivedCallback( void *ptr, size_t size, size_t nmemb, void *stream) { int endPoint = strlen( buffer ); memcpy( buffer + endPoint, ptr, size * nmemb ); buffer[endPoint + size * nmemb + 1]=0; コールバック関数 return size * nmemb; } void simpleHTTP( const char* url, char *receivedStr ) { buffer = receivedStr; URLはhttp://…を指定 buffer[0] = 0; ❶初期化とハンドル取得 CURLcode cc = curl_global_init( CURL_GLOBAL_ALL ); if ( cc == 0 ) { ❷URLを指定する CURL *curlHandle = curl_easy_init(); curl_easy_setopt( curlHandle, CURLOPT_URL, url ); curl_easy_setopt( curlHandle, CURLOPT_WRITEFUNCTION, receivedCallback ); curl_easy_setopt( curlHandle, CURLOPT_VERBOSE, 1 ); ❸オプションの指定 CURLcode success = curl_easy_perform( curlHandle ); デバッグに if ( success != 0 ) { 便利 sprintf( receivedStr, "libcurl error: %d", success ); ❹実行 } curl_easy_cleanup( curlHandle ); } ❺後始末 } 2009年4月8日水曜日 9
    • HTTPのポスト void httpPost( const char* url, const char* postStr, char *receivedStr ) { buffer = receivedStr; buffer[0] = 0; POST用のデータを作る CURLcode cc = curl_global_init( CURL_GLOBAL_ALL ); が、URLエンコードは if ( cc == 0 ) { libcurlの関数を使う CURL *curlHandle = curl_easy_init(); curl_easy_setopt( curlHandle, CURLOPT_URL, url ); curl_easy_setopt( curlHandle, CURLOPT_WRITEFUNCTION, receivedCallback ); char *urlEncoded = curl_easy_escape( curlHandle , postStr , 0 ); char *param = "postdata"; char *postData = malloc( strlen( urlEncoded ) + strlen( param ) + 2 ); strcpy( postData, param ); strcat( postData, "=" ); strcat( postData, urlEncoded ); curl_easy_setopt(curlHandle, CURLOPT_POSTFIELDS, postData); curl_easy_setopt( curlHandle, CURLOPT_VERBOSE, 1 ); CURLcode success = curl_easy_perform( curlHandle ); if ( success != 0 ) { sprintf( receivedStr, "libcurl error: %d", success ); } free( postData ); curl_free( urlEncoded ); curl_easy_cleanup( curlHandle ); } } 2009年4月8日水曜日 10
    • SSLを使った通信 URLはhttps://…を指定 void https( const char* url, char *receivedStr ) { オプションの指定 buffer = receivedStr; buffer[0] = 0; 後者は自己署名のサイトで CURLcode cc = curl_global_init( CURL_GLOBAL_ALL ); もエラーにならなくなる if ( cc == 0 ) { CURL *curlHandle = curl_easy_init(); curl_easy_setopt( curlHandle, CURLOPT_URL, url ); curl_easy_setopt( curlHandle, CURLOPT_WRITEFUNCTION, receivedCallback ); // curl_easy_setopt(curlHandle, CURLOPT_SSL_VERIFYPEER, 0L); // curl_easy_setopt(curlHandle, CURLOPT_SSL_VERIFYHOST, 0L); curl_easy_setopt( curlHandle, CURLOPT_VERBOSE, 1 ); CURLcode success = curl_easy_perform( curlHandle ); if ( success != 0 ) { sprintf( receivedStr, "libcurl error: %d", success ); } curl_easy_cleanup( curlHandle ); } } 2009年4月8日水曜日 11
    • 認証が必要なWebサイト void httpAuth( const char* url, const char* username, const char* password, char *received buffer = receivedStr; buffer[0] = 0; 認証情報はユーザ名とパス CURLcode cc = curl_global_init( CURL_GLOBAL_ALL ); ワードをつなげて指定 if ( cc == 0 ) { CURL *curlHandle = curl_easy_init(); curl_easy_setopt( curlHandle, CURLOPT_URL, url ); curl_easy_setopt( curlHandle, CURLOPT_WRITEFUNCTION, receivedCallback ); char *authInfo = malloc( strlen( username ) + strlen( password ) + 2 ); strcpy( authInfo, username ); strcat( authInfo, ":" ); strcat( authInfo, password ); curl_easy_setopt( curlHandle, CURLOPT_USERPWD, authInfo ); curl_easy_setopt( curlHandle, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST|CURLAUTH_BASIC); curl_easy_setopt( curlHandle, CURLOPT_VERBOSE, 1 ); CURLcode success = curl_easy_perform( curlHandle ); if ( success != 0 ) { sprintf( receivedStr, "libcurl error: %d", success ); } curl_easy_cleanup( curlHandle ); free( authInfo ); } } 2009年4月8日水曜日 12
    • CURLOPT_VERBOSE 2009年4月8日水曜日 13
    • まとめとURL • • • • 簡単に使えるlibcurl Cでの文字列処理はちょっと面倒 動作の原理を知ればCURLHANDLEも便利 URLs • • • • cURL and libcurl http://curl.haxx.se/ CURLHANDLE 2009年4月8日水曜日 http://code.google.com/p/curlhandle/ 14