YII2-你所该知道的杀马特操作-YII2下对接一个Json协议接口

博客 · 本文由 · 加班中途去撩妹 · 发布于 7月前 · 701 阅读

作为一个屌丝级别的开发者对接别人的api也是一个常见的事情。 比如有以下一个api需要对接

接口地址:http://api.qingyunke.com/api.php?key=free&appid=0&msg=关键词
     key 固定参数free
     appid 设置为0,表示智能识别,可忽略此参数
     msg 关键词,请参考下方参数示例,该参数可智能识别,该值请经过 urlencode 处理后再提交
返回结果:{"result":0,"content":"内容"}
     result 状态,0表示正常,其它数字表示错误
     content 信息内容

对接接口第一步封装一个能用于请求http的工具类,

components/helper/CurlHelper.php

namespace components\helper;
class CurlHelper extends \yii\base\Object
{
    public static function get($url,$data){
        $curl = curl_init();
        $o = "";
        foreach ( $data as $k => $v )
        {
            $o.= "$k=" . urlencode( $v ). "&" ;
        }
        $data = substr($o,0,-1);
        $url = $url.'?'.$data;
        curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2); // 从证书中检查SSL加密算法是否存在
        //curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模拟用户使用的浏览器
        curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
        curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer
        curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环
        curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
        $tmpInfo = curl_exec($curl); // 执行操作
        curl_close($curl); // 关闭CURL会话
        return $tmpInfo;
    }
}

components为根目录下的一个文件夹,里面用于存放自己定义的类,YII2时MVC结构,没有建议用户的自定义类放哪里,而vendor目录很多第三方的活雷锋库,最为一个自私的开发者。所有得自定义一个文件夹用于放自己定义的class,题外话”components“的叫法来自一个没我帅的人,我不会告诉大家他叫【谁偷了汝的凶兆】,也有人把自定义的class放libs的,由于我是Java过来的半吊子,觉得这样叫不太妥当。所有采用了”components“的叫法,总之大家开心就好。 对这个库进行配置

config/web.php
$config = [
    ...
    'aliases' => [
        '@components' => '@app/components'
    ],..];

封装一下api

components/qingyunke/FeiFei.php
namespace components\qingyunke;
use components\helper\CurlHelper;
use yii\base\Object;
use yii\helpers\Json;

/**
 * Created by PhpStorm.
 * User: 16487
 * Date: 2018/5/8
 * Time: 9:47
 */

class FeiFei extends Object
{
   const API_URL='http://api.qingyunke.com/api.php';
   const API_KEY='free';
   const APP_ID='0';
   public static function sendMessage($msg){
       $data = [
           'key' => self::API_KEY,
           'appid' =>self::APP_ID,
           'msg' => $msg
       ];
       try {
           $infoStr = CurlHelper::get(self::API_URL, $data);
           if ($infoStr != null) {
               $mjson = Json::decode($infoStr, false);
               if ($mjson->result == 0) {
                   $mContent=$mjson->content;
                   $mContent=str_replace("{br}","\n",$mContent);
                   $mContent=str_replace("请发送","请回复",$mContent);
                   return $mContent;
               }
           }

       } catch (\Exception $e) {

       }
       return null;
   }

}

测试api

commands/HelloController.php

namespace app\commands;
...
class HelloController extends Controller
{
...
  public function actionQwe()
    {
        var_dump(FeiFei::sendMessage("我是大帅哥"));
    }
...

}

cd 到yii目录执行

D:\www\foxhome>yii hello/qwe

得到响应

评论数量:0