cURL POST Запрос к API в PHP не возвращает никаких значений
Я пытаюсь получить токен доступа для Microsoft Translator API, и это было довольно сложно. Сначала я попытался написать запрос с помощью Ruby и HTTParty, но он не принимал мои параметры. Microsoft предоставила пример на PHP, поэтому я решил, что могу использовать это:
http://msdn.microsoft.com/en-us/library/hh454950.aspx
Код был скопирован непосредственно с веб-сайта Microsoft - я просто добавил переменные и вызвал функцию в конце:
<?php
/*
* Get the access token.
*
* @param string $grantType Grant type.
* @param string $scopeUrl Application Scope URL.
* @param string $clientID Application client ID.
* @param string $clientSecret Application client ID.
* @param string $authUrl Oauth Url.
*
* @return string.
*/
function getTokens($grantType, $scopeUrl, $clientID, $clientSecret, $authUrl){
try {
//Initialize the Curl Session.
$ch = curl_init();
//Create the request Array.
$paramArr = array (
'grant_type' => $grantType,
'scope' => $scopeUrl,
'client_id' => $clientID,
'client_secret' => $clientSecret
);
//Create an Http Query.//
$paramArr = http_build_query($paramArr);
//Set the Curl URL.
curl_setopt($ch, CURLOPT_URL, $authUrl);
//Set HTTP POST Request.
curl_setopt($ch, CURLOPT_POST, TRUE);
//Set data to POST in HTTP "POST" Operation.
curl_setopt($ch, CURLOPT_POSTFIELDS, $paramArr);
//CURLOPT_RETURNTRANSFER- TRUE to return the transfer as a string of the return value of curl_exec().
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, TRUE);
//CURLOPT_SSL_VERIFYPEER- Set FALSE to stop cURL from verifying the peer's certificate.
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
//Execute the cURL session.
$strResponse = curl_exec($ch);
//Get the Error Code returned by Curl.
$curlErrno = curl_errno($ch);
if($curlErrno){
$curlError = curl_error($ch);
throw new Exception($curlError);
}
//Close the Curl Session.
curl_close($ch);
//Decode the returned JSON string.
$objResponse = json_decode($strResponse);
if ($objResponse->error){
throw new Exception($objResponse->error_description);
}
$finalresponse = $objResponse->access_token;
return $finalresponse;
} catch (Exception $e) {
echo "Exception-".$e->getMessage();
}
}
$grant = "client_credentials"
$scope = "http://api.microsofttranslator.com";
$secret = "8Bo0SET1W8lmDgfV/l7FLEKUWRDXCEZrvTgv9tSH3Bs=";
$client = "globalchatapp"
$auth = "https://datamarket.accesscontrol.windows.net/v2/OAuth2-13/";
getTokens($grant, $scope, $client, $secret, $auth);
?>
В любом случае, когда я запускаю это (используя PHP 5.3.6), ошибок нет; это не возвращает никакого значения. Я не очень разбираюсь в PHP, и это может быть что-то явно очевидное, чего я просто не видел, но я боролся с этим некоторое время безрезультатно. Любая помощь будет принята с благодарностью.
Кроме того, если это поможет, вот мой оригинальный код Ruby. Я получил ответ от сервера, в котором говорилось, что "scope" отсутствует:
require 'httparty'
scope = "http://api.microsofttranslator.com";
secret = "8Bo0SET1W8lmDgfV/l7FLEKUWRDXCEZrvTgv9tSH3Bs=";
auth = "https://datamarket.accesscontrol.windows.net/v2/OAuth2-13/";
client_id = "globalchatapp"
grant_type = "client_credentials"
response = HTTParty.post("https://datamarket.accesscontrol.windows.net/v2/OAuth2-13/?&scope=#{scope}&secret=#{secret}&client_id=#{client_id}&grant_type=#{grant_type}", :body => {:key => :value})
puts response
Еще раз спасибо!
1 ответ
Сохранить значение, возвращаемое getTokens()
in a variable and pass it to urldecode()
расшифровать %2F
and other encoded characters.
$tokens = getTokens($grant, $scope, $client, $secret, $auth);
echo urldecode($tokens);