Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
290
Help us understand the problem. What is going on with this article?
@re-24

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実例いっぱい

290
Help us understand the problem. What is going on with this article?
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
re-24

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
290
Help us understand the problem. What is going on with this article?