将Yii2连接到另一个RESTful应用程序

时间:2016-05-02 15:31:51

标签: rest yii2 yii2-advanced-app

我有一个Yii2应用程序。我想将它连接到另一个安静的网页。因此用户将数据发送到我的应用程序,我将通过POST请求发送它们并根据JSON响应执行某些操作。如何在yii2中发送请求/获取响应部分?

1 个答案:

答案 0 :(得分:1)

最好的方法是使用curl对RESTful API进行端到端调用,在这种情况下,您可能有兴趣查看a yii2 extension for curl.

如果没有Yii2扩展,我们可以通过在控制器中创建更通用的功能,或者更优选地在模型中(用于共享访问)来实现此目的,如下所示:

/**
 * $method e.g POST, GET, PUT 
 * $data = [
        'param' => 'value',
   ]
 */

public function curlToRestApi($method, $url, $data = null)
{
    $curl = curl_init();

    // switch $method
    switch ($method) {
        case 'POST':
            curl_setopt($curl, CURLOPT_POST, 1);

            if($data !== null) {
                curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
            }
            break;
            // logic for other methods of interest
            // .
            // .
            // .

        default:
            if ($data !== null){
                $url = sprintf("%s?%s", $url, http_build_query($data));
            }
    }

    // Authentication [Optional]
    curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    curl_setopt($curl, CURLOPT_USERPWD, "username:password");

    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

    $result = curl_exec($curl);

    curl_close($curl);

    return $result;
}

然后我们根据需要调用此函数,即取决于methodurl和/或data

如果启用fopen包装器以访问Web服务URL,也可以方便地使用file_get_contents

$response = file_get_contents('http://example.com/path/to/api?param1=stack&param2=overflow');

如果提供了JSON响应,您可以按如下方式恢复php数组:

$response  = json_decode($response, TRUE);

如果返回XML响应,则

$response = new \SimpleXMLElement($response);

但是,如果API端点返回HTTP错误状态,则file_get_contents函数将失败并显示警告并返回null。