匹配 api 调用结果中的网址
Match Urls in results of api call
我有一个 api 调用,其中有 Url 个在它返回时被调用 JSON。
我需要找到那些返回的 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"
全部填充来自他们个人调用的响应。
我有一个 api 调用,其中有 Url 个在它返回时被调用 JSON。
我需要找到那些返回的 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"
全部填充来自他们个人调用的响应。