cURL POST Запрос к API в PHP не возвращает никаких значений - PullRequest
2 голосов
/ 29 февраля 2012

Я пытаюсь получить токен доступа для Microsoft Translator API, и это было довольно сложно.Сначала я попытался написать запрос с помощью Ruby и HTTParty, но он не принимал мои параметры.Microsoft предоставила пример на PHP, поэтому я решил, что могу просто использовать это:

http://msdn.microsoft.com/en-us/library/hh454950.aspx#phpexample

Код был скопирован непосредственно с веб-сайта 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 Ответ

0 голосов
/ 01 марта 2012

Сохраните значение, возвращаемое getTokens() в переменной, и передайте его urldecode() для декодирования %2F и других закодированных символов.

$tokens = getTokens($grant, $scope, $client, $secret, $auth);
echo urldecode($tokens);
...