WebAPIを叩く(curl)

## 概要

WebApiを`curl`を利用して実行する方法をまとめてみました。
[Qiita Api v2](https://qiita.com/api/v2/docs)を利用します。

認証しないと実行できない機能があるので、[ユーザの管理画面](https://qiita.com/settings/applications)から個人用AccessTokenを発行してtokenを取得しといてください。

やることは、[WebAPIを叩く(file_get_contents)](http://qiita.com/re-24/items/542f39220a606e319fa1)と同じです

## Getメソッドの実行
`GET`メソッドで、データを取得
指定した、タグに紐づいた投稿を取得するsample

```php
<?php

$base_url = 'https://qiita.com';
$tag = 'PHP';

$curl = curl_init();

curl_setopt($curl, CURLOPT_URL, $base_url.'/api/v2/tags/'.$tag.'/items');
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 証明書の検証を行わない
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);  // curl_execの結果を文字列で返す

/*
一括で指定することもできる
$option = [
	CURLOPT_URL => $base_url.'/api/v2/tags/'.$tag.'/items',
	CURLOPT_CUSTOMREQUEST => 'GET',
	CURLOPT_SSL_VERIFYPEER => false,
];
curl_setopt_array($curl, $option);
*/

$response = curl_exec($curl);
$result = json_decode($response, true);

curl_close($curl);

```

## Responseヘッダやステータスコードを取得
WebApiを叩くと、ヘッダに追加の情報を含めてきたりする。

```php
<?php

$base_url = 'https://qiita.com';
$tag = 'PHP';

$curl = curl_init();

curl_setopt($curl, CURLOPT_URL, $base_url.'/api/v2/tags/'.$tag.'/items');
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HEADER, true);	// ヘッダーも出力する

$response = curl_exec($curl);

// ステータスコード取得
$code = curl_getinfo($curl, CURLINFO_HTTP_CODE);

// header & body 取得
$header_size = curl_getinfo($curl, CURLINFO_HEADER_SIZE); // ヘッダサイズ取得
$header = substr($response, 0, $header_size); // headerだけ切り出し
$body = substr($response, $header_size); // bodyだけ切り出し

// json形式で返ってくるので、配列に変換
$result = json_decode($body, true); 

// ヘッダから必要な要素を取得
preg_match('/Total-Count: ([0-9]*)/', $header, $matches); // 取得記事要素数
$total_count = $matches[1];

curl_close($curl);
```

ステータスコードだけなら`curl_getinfo()`で取得できるけど、それ以外のデータを取りたいなら`$response`にヘッダ内容を出力させてヘッダ部分を分割させてあげる必要がある。

## Postメソッドの実行
`curl`でpostメソッドのapiを実行する。
記事を新規に作成してみる

```php
<?php

$token = 'xxxxxxxxxxxxxxxxxxxxxx'; // 前準備で作っておいた、tokenを設定
$base_url = 'https://qiita.com';

$data = [
	'body' => 'example',
	'coediting' => false, 
	'private' => true,		// テストで作る時は限定公開で
	'title'=> 'sample test',
	'tags' => [
		[
			'name' => 'PHP',
			'versions' => ["4.3.0",">="]
		],
		[
			'name' => 'sample',
		]
	]
];

$header = [
	'Authorization: Bearer '.$token,  // 前準備で取得したtokenをヘッダに含める
	'Content-Type: application/json',
];

$curl = curl_init();

curl_setopt($curl, CURLOPT_URL, $base_url.'/api/v2/items');
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST'); // post
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data)); // jsonデータを送信
curl_setopt($curl, CURLOPT_HTTPHEADER, $header); // リクエストにヘッダーを含める
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HEADER, true);

$response = curl_exec($curl);

$header_size = curl_getinfo($curl, CURLINFO_HEADER_SIZE); 
$header = substr($response, 0, $header_size);
$body = substr($response, $header_size);
$result = json_decode($body, true); 

curl_close($curl);
```

記事作成後のレスポンスは下記のとおり

```php:ヘッダー[$header]
string 'HTTP/1.1 201 Created
Cache-Control: max-age=0, private, must-revalidate
Content-Type: application/json; charset=utf-8
Date: Wed, 11 Feb 2015 03:18:58 GMT
ETag: "3bab3b27dced43d996b94d8b5ad8dbcd"
Rate-Limit: 300
Rate-Remaining: 297'

・・・（略）・・・
```

```php:レスポンス(投稿した記事データ)[$result]
array (size=11)
  'rendered_body' => string '<p>example</p>
' (length=15)
  'body' => string 'example
' (length=8)
  'coediting' => boolean false
  'created_at' => string '2015-02-11T12:09:51+09:00' (length=25)
  'id' => string 'acdeec27b2f91b190638' (length=20)
  'private' => boolean true
・・・（略）・・・
```

## まとめ
`delete`も`put`も似たようなもんだと思うから省略

* `file_get_contents()`よりはこっちを使ったほうがいい。(速度、メモリ的にも)
* オプションの付け方を変えて抽象化しやすい
* ただ、オプションが多いので何をつけるべきか調べるのが大変…
* ステータスコードの判定が楽(ヘッダの取得はもっと簡単にできる方法ある？）

## 参考
[Client URL Library ](http://php.net/manual/ja/book.curl.php)
[curl_setopt](http://php.net/manual/ja/function.curl-setopt.php)

[phpのcurl ライブラリの使い方のHTTP実例いっぱい](http://takuya-1st.hatenablog.jp/entry/2014/07/27/093053)