我有一个API,我正在尝试创建一个用于发送请求的函数,文档位于此处:http://simportal-api.azurewebsites.net/Help
我考虑过要在PHP中创建此函数:
function jola_api_request($url, $vars = array(), $type = 'POST') {
$username = '***';
$password = '***';
$url = 'https://simportal-api.azurewebsites.net/api/v1/'.$url;
if($type == 'GET') {
$call_vars = '';
if(!empty($vars)) {
foreach($vars as $name => $val) {
$call_vars.= $name.'='.urlencode($val).'&';
}
$url.= '?'.$call_vars;
}
}
$ch = curl_init($url);
// Specify the username and password using the CURLOPT_USERPWD option.
curl_setopt($ch, CURLOPT_USERPWD, $username . ":" . $password);
if($type == 'POST') {
curl_setopt($ch, CURLOPT_POSTFIELDS, $vars);
}
// Tell cURL to return the output as a string instead
// of dumping it to the browser.
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//Execute the cURL request.
$response = curl_exec($ch);
// Check for errors.
if(curl_errno($ch)){
// If an error occured, throw an Exception.
//throw new Exception(curl_error($ch));
$obj = array('success' => false, 'errors' => curl_error($ch));
} else {
$response = json_decode($response);
$obj = array('success' => true, 'response' => $response);
}
return $obj;
}
因此,这确定了它是一个GET还是POST请求,但是在某些调用中返回的响应是不支持GET或不支持POST,尽管我为每个调用都指定了正确的请求。
我认为我的功能有某种错误,但我想知道是否有人可以在正确的方向帮助我?我也注意到,我也需要允许DELETE请求。
答案 0 :(得分:9)
为使生活更轻松,请尝试吃一些东西。 http://docs.guzzlephp.org/en/stable/
您可以这样请求:
use GuzzleHttp\Client;
$client = new Client();
$myAPI = $client->request('GET', 'Your URL goes here');
$myData = json_decode($myAPI->getBody(), true);
然后您可以像访问数组一样访问数据
$myData["Head"][0]
答案 1 :(得分:5)
问题出在$url
中,您尝试为GET请求创建。
您用于获取请求的$url
如下:
GET https://simportal-api.azurewebsites.net/api/v1/?param1=val1¶m2=val2
但是从文档中您可以清楚地看到您$url
应该是:
GET https://simportal-api.azurewebsites.net/api/v1/param1/val1/param2
例如:
GET https://simportal-api.azurewebsites.net/api/v1/customers/{id}
答案 2 :(得分:0)
GuzzleHttp是使用Web服务的标准方法。
您可以使用auth
参数发送身份验证详细信息。另外,无论您使用哪种便捷方法,都可以使用Oath或Beer令牌。如果您尝试通过令牌方法致电服务,请记住,您需要通过 header (而不是auth
)通过授权。
请参阅此GuzzleHttp authentication via token。此外,您可以非常快速地捕获异常。参见Handle Guzzle exception and get HTTP body
尝试从官方网站获取以下代码;)
$client = new GuzzleHttp\Client();
$res = $client->request('GET', 'https://api.github.com/user', [
'auth' => ['user', 'pass']
]);
echo $res->getStatusCode();
// "200"
echo $res->getHeader('content-type')[0];
// 'application/json; charset=utf8'
echo $res->getBody();
// {"type":"User"...'
// Send an asynchronous request.
$request = new \GuzzleHttp\Psr7\Request('GET', 'http://httpbin.org');
$promise = $client->sendAsync($request)->then(function ($response) {
echo 'I completed! ' . $response->getBody();
});
$promise->wait();
您可以在此处找到有关GuzzleHttp请求的更多信息:http://docs.guzzlephp.org/en/stable/quickstart.html#making-a-request
希望这是您想要的!
答案 3 :(得分:0)
我认为您应该首先尝试使用Postman工具来请求该API。如果邮递员完成这项工作,则说明您的PHP代码有问题。但是,如果您已经使用过邮递员,但仍无法获取响应,那么该API可能有问题。像网址封锁。