如何解决在API调用结果中匹配Urls
我有一个api调用,其中有一个Url,它在返回的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"
都充满了各自调用的响应。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。