繁体   English   中英

匹配 api 调用结果中的 URL

[英]Match Urls in results of api call

我有一个 api 调用,其中包含在它返回的 JSON 中被召回的 Url。

我需要找到那些返回的 url,其中包含用于原始 get 请求的字符串并且状态为 200。我尝试使用 strpos 方法,但这似乎不起作用。

public function getCompanyData() {
    $client = new Client();
    $response = $client->request('GET', 'https://api.github.com/orgs/fakename');
    $statusCode = $response->getStatusCode();
    $body = $response->getBody()->getContents();

    $confirmed = strpos($body,'api.github.com/orgs/fakename');
    if($statusCode === 200 && $confirmed !== false) { 
        return $body; 
    }
    else {
        return $statusCode." Error";
    }
}

返回的 JSON -

{
  "login": "fakename",
  "id": 1214096,
  "node_id": "***=",
  "url": "https://api.github.com/orgs/fakename",
  "repos_url": "https://api.github.com/orgs/fakename/repos",
  "events_url": "https://api.github.com/orgs/fakename/events",
  "hooks_url": "https://api.github.com/orgs/fakename/hooks",
  "issues_url": "https://api.github.com/orgs/fakename/issues",
  "members_url": "https://api.github.com/orgs/fakename/members{/member}",
  "public_members_url": "https://api.github.com/orgs/fakename/public_members{/member}",
  "avatar_url": "https://avatars3.githubusercontent.com/u/****?v=4",
  "description": "",
  "name": "fakename",
  "company": null,
  "blog": "fakename.com",
  "location": null,
  "email": null,
  "twitter_username": null,
  "is_verified": false,
  "has_organization_projects": true,
  "has_repository_projects": true,
  "public_repos": 41,
  "public_gists": 0,
  "followers": 0,
  "following": 0,
  "html_url": "https://github.com/fakename",
  "created_at": "2011-11-22T21:48:43Z",
  "updated_at": "2020-09-11T23:05:04Z"
}

一种方法如下:

<?php

class SomeClass
{
    /**
     * @var int The status code of the last http request
     */
    private $statusCode;

    /**
     * Get an array of decoded data from the given url.
     * @param $url
     * @return array
     */
    public function getDataFromUrl($url) {
        $client           = new Client();
        $response         = $client->request('GET', $url);
        $this->statusCode = $response->getStatusCode();
        $body             = $response->getBody()->getContents();
        return $this->statusCode === 200 ? json_decode($body, true) : [];
    }

    /**
     * Get all data for a given organization including nested ancillary data
     * @param string $orgName
     * @return array
     */
    public function getCompanyData($orgName) {
        $mainUrl = "https://api.github.com/orgs/$orgName";
        $mainData = $this->getDataFromUrl($mainUrl);
        if ($mainData && $this->statusCode === 200) {
            $ancillaryUrls = $this->getAncillaryUrlsFromData($mainData, $orgName);
            foreach ($ancillaryUrls as $property => $url) {
                $ancillaryData = $this->getDataFromUrl($url);
                $mainData[$property] = $ancillaryData;
            }
        }
        return $mainData;
    }

    /**
     * Get a JSON string containing all data for a given organization including nested ancillary data
     * @param string $orgName
     * @return array|mixed
     */
    public function getCompanyDataAsJson($orgName) {
        return json_encode($this->getCompanyData($orgName));
    }

    /**
     * From the provided array of data, return an new array containing the ancillary urls
     * which also need to be requested
     * @param array $data
     * @param string $orgName
     * @return array
     */
    public function getAncillaryUrlsFromData($data, $orgName) {
        $urls = [];
        if (is_array($data)) {
            $targetUrl = "api.github.com/orgs/$orgName";
            foreach ($data as $property => $value) {
                // if property has '_url' and value is like our url, add it to our array of urls
                if (strpos($property, '_url') !== false && strpos($value, $targetUrl) !== false) {
                    $cleanProp = str_replace('_url', '', $property);
                    $urls[$cleanProp] = $targetUrl;
                }
            }
        }
        return $urls;
    }
}

现在,如果你想要一个数组的结果,你可以调用:

$someClass   = new SomeClass();
$arrayOfData = $someClass->getCompanyData('fakename');

或者,如果您希望将结果作为 JSON 字符串,您可以调用:

$someClass = new SomeClass();
$jsonData  = $someClass->getCompanyDataAsJson('fakename');

并且响应将包含以下键(除了原始主要数据) "repos", "events", "hooks", "issues", "members", "public_members"所有这些都填充了来自他们个人调用的响应。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM