什么是GraphQL?

类似于SQL,GraphQL也是一种ql(query language)。不过是用于API查询,可以更加直观的取到所需要查询的数据。普通的RESTful API获取到的数据类型是以服务器确定的,但是GraphQL获取到的数据是以查询语句为准的。所以就不用担心服务器返回的数据结构发生变化而影响业务。

如何使用GraphQL API?

https://graphql.org/code/ 官方这里提供了一些开源工具,我们也可以方便的使用PostMan来调试API。

不过client并没有提供php版本的demo。虽然GraphQL很牛逼,但是我并不想自己搭建一个去看接口传输到底是如何的,于是我用PostMan抓了一下包,就拿到了传入的参数案例。

POST /client/v4/graphql HTTP/1.1
Content-Type: application/json
User-Agent: PostmanRuntime/7.15.0
Accept: */*
Cache-Control: no-cache
Postman-Token: aa6b2a4a-ed11-463f-a186-ce0da2c35c22
Host: api.cloudflare.com
Accept-Encoding: gzip, deflate
Content-Length: 408
Connection: close

{"query":"{ viewer { zones(filter: {zoneTag: \"XXXX\"}) { httpRequests1mGroups(orderBy: [datetimeHour_ASC], limit: 1000, filter: {datetime_geq: \"2020-04-23T18:00:00+08:00\"}) { dimensions { datetimeHour } sum { bytes cachedBytes requests cachedRequests countryMap { bytes requests clientCountryName } responseStatusMap { requests edgeResponseStatus } } uniq { uniques } } } } }"}

该请求是一个json格式的post请求,query键值对应了要查询的语句。所以用php实现很简单。

#要查询的GraphQL语句
$content=<<<CONTENT
{
  viewer {
    zones(filter: {zoneTag: "%s"}) {
      httpRequests1mGroups(orderBy: [datetimeHour_ASC], limit: %d, filter: {datetime_geq: "%s"}) {
        dimensions {
          datetimeHour
        }
        sum {
          bytes
          cachedBytes
          requests
          cachedRequests
          countryMap {
            bytes
            requests
            clientCountryName
          }
          responseStatusMap {
            requests
            edgeResponseStatus
          }
        }
        uniq {
          uniques
        }
      }
    }
  }
}    
CONTENT;
    $content = sprintf($content,"参数1","参数2",'参数3');#上面我的语句中留了几个参数,现在填进去
    $url = 'https://api.cloudflare.com/client/v4/graphql';
    $ch = curl_init();
    $defaultOptions = [
        CURLOPT_URL => $url,
        CURLOPT_POST => true,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_POSTFIELDS => json_encode(array('query' => $content)), # JSON化我们的POST数据
        CURLOPT_HTTPHEADER => [
            "Content-Type: application/json",# 必须指定JSON格式
            "X-AUTH-EMAIL: ".$mail, #这是我用的API验证部分
            "X-AUTH-KEY: ".$key,#这是我用的API验证部分

        ]
    ];
    curl_setopt_array($ch, $defaultOptions);
    $chContents = curl_exec($ch);
    $curlInfo = curl_getinfo($ch);
    curl_close($ch);
    $contents = $chContents;
    echo $contents;

基本上就是这样了。抓包就可以搞明白具体的传参情况了。

参考