Help us understand the problem. What is going on with this article?

WebAPIを叩く(curl)

More than 3 years have passed since last update.

概要

WebApiをcurlを利用して実行する方法をまとめてみました。
Qiita Api v2を利用します。

認証しないと実行できない機能があるので、ユーザの管理画面から個人用AccessTokenを発行してtokenを取得しといてください。

やることは、WebAPIを叩く(file_get_contents)と同じです

Getメソッドの実行

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

<?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

$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

$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);

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

ヘッダー[$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'

・・・()・・・
レスポンス(投稿した記事データ)[$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
・・・()・・・

まとめ

deleteputも似たようなもんだと思うから省略

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

参考

Client URL Library
curl_setopt

phpのcurl ライブラリの使い方のHTTP実例いっぱい

re-24
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした