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 Req...
libcurlについて

•

URLを指定した通信機能を提供

•
•
•
•

•
•

スレッドセーフ、IPv6対応したライブラリ
バージョンを重ねてかなりの高機能に
ドキュメントが充実している

Mac OS Xには標準搭載
APIはC...
プロジェクトでliburlを使う

•
•

プロジェクトにlibcurlへの参照を作る
ヘッダには、以下のように記入するのみでOK

•

2009年4月8日水曜日

#import <curl/curl.h>

5
libcurlの参照

•
•

プロジェクトに新しく
ファイル加える
/usr/libにあるライブラ
リを追加

•
•
2009年4月8日水曜日

libcurl.4.dylib以外は全部
これへのシンボリックリ
ンク
いずれも4つのアーキ...
ライブラリの番号とバージョン

•

libcurl.n.dylibの「n」はライブラリの番号

•
•
•
•
•
•
•
libcurl最新版(Mac OS X 10.5.6)
•
•
•

libcurlでは、apacheのモジュールの番...
プログラムのポイント

•

基本的には何でも以下の手順でOK

(1) 初期化してハンドルを得る
(2) URLを教える
(3) その他のパラメータを設定(オプション設定)
(4) 実行する
(5) 後始末

•

データの受信

•
•

...
char *buffer;

URLへの単純なアクセス

size_t receivedCallback( void *ptr, size_t size, size_t nmemb, void *stream)	
{
	 int endPoin...
HTTPのポスト
void httpPost( const char* url, const char* postStr, char *receivedStr )	 {
	 buffer = receivedStr;
	 buffer[0] =...
SSLを使った通信
URLはhttps://…を指定
void https( const char* url, char *receivedStr )	 {
オプションの指定
	 buffer = receivedStr;
	 buffer[0...
認証が必要なWebサイト

void httpAuth( const char* url, const char* username, const char* password, char *received
	 buffer = receiv...
CURLOPT_VERBOSE

2009年4月8日水曜日

13
まとめとURL

•
•
•
•

簡単に使えるlibcurl
Cでの文字列処理はちょっと面倒
動作の原理を知ればCURLHANDLEも便利
URLs

•
•
•
•

cURL and libcurl
http://curl.haxx.se...
Upcoming SlideShare
Loading in...5
×

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

1,358
-1

Published on

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

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,358
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
8
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

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

  1. 1. Cocoa勉強会 #33関東 意外に楽に使えるlibcurl 新居雅行 nii@msyk.net 2009年4月8日水曜日 1
  2. 2. Agenda • • • 2009年4月8日水曜日 curlとlibcurlの紹介 libcurlの使い方 プログラムの実例 2
  3. 3. 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
  4. 4. libcurlについて • URLを指定した通信機能を提供 • • • • • • スレッドセーフ、IPv6対応したライブラリ バージョンを重ねてかなりの高機能に ドキュメントが充実している Mac OS Xには標準搭載 APIはC言語だが、さまざまな言語で利用できる • • 2009年4月8日水曜日 オープンソース 例えばPHPやJavaなど CocoaクラスのCURLHANDLE(NSURLHandleのサ ブクラス)もあるが、フルスペックではない 4
  5. 5. プロジェクトでliburlを使う • • プロジェクトにlibcurlへの参照を作る ヘッダには、以下のように記入するのみでOK • 2009年4月8日水曜日 #import <curl/curl.h> 5
  6. 6. libcurlの参照 • • プロジェクトに新しく ファイル加える /usr/libにあるライブラ リを追加 • • 2009年4月8日水曜日 libcurl.4.dylib以外は全部 これへのシンボリックリ ンク いずれも4つのアーキテ クチャをサポート 6
  7. 7. ライブラリの番号とバージョン • 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
  8. 8. プログラムのポイント • 基本的には何でも以下の手順でOK (1) 初期化してハンドルを得る (2) URLを教える (3) その他のパラメータを設定(オプション設定) (4) 実行する (5) 後始末 • データの受信 • • 2009年4月8日水曜日 コールバック関数を規定に従って定義 関数をパラメータとして指定 8
  9. 9. 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
  10. 10. 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
  11. 11. 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
  12. 12. 認証が必要な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
  13. 13. CURLOPT_VERBOSE 2009年4月8日水曜日 13
  14. 14. まとめとURL • • • • 簡単に使えるlibcurl Cでの文字列処理はちょっと面倒 動作の原理を知ればCURLHANDLEも便利 URLs • • • • cURL and libcurl http://curl.haxx.se/ CURLHANDLE 2009年4月8日水曜日 http://code.google.com/p/curlhandle/ 14
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×