基于 Yii 2 的 HTTP 客户端扩展,通过应用组件配置客户端,HTTP 请求数据以 JSON 格式发送

1、通过应用组件配置客户端,\common\config\main-local.php

<?php
return [
    'components' => [
        'yqdsjApiHttp' => [
            'class' => 'yii\httpclient\Client',
            'baseUrl' => 'http://47.94.90.194:8085/haihe-service',
            'transport' => 'yii\httpclient\CurlTransport'
        ],
    ],
];

2、通过 setFormat() 方法设置用于请求内容的格式为 JSON,\common\logics\http\yqdsj_api\Article.php

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2018/02/28
 * Time: 13:14
 */
namespace common\logics\http\yqdsj_api;

use Yii;
use yii\base\Model;
use yii\web\ServerErrorHttpException;
use yii\httpclient\Client;

/**
 * 舆情大数据接口的舆情
 *
 * @author Qiang Wang <shuijingwanwq@163.com>
 * @since 1.0
 */class Article extends Model
{
    const SCENARIO_VIEW = 'view';

    public $service_key;
    public $id;
    public $access_token;

    public function scenarios()
    {
        $scenarios = parent::scenarios();
        $scenarios[self::SCENARIO_VIEW] = ['service_key', 'id', 'access_token'];

        return $scenarios;
    }

    public function rules()
    {
        return [
            /* 获取舆情详情 */            [['service_key', 'id', 'access_token'], 'required', 'on' => 'view'], //view
            ['service_key', 'compare', 'compareValue' => Yii::$app->params['yqdsjApi']['serviceKey'], 'on' => 'view'], //view
        ];
    }

    public function attributeLabels()
    {
        return [
            'service_key' => \Yii::t('model/http/yqdsj-api/article', 'Service Key'),
            'id' => \Yii::t('model/http/yqdsj-api/article', 'ID'),
            'access_token' => \Yii::t('model/http/yqdsj-api/article', 'Access Token'),
        ];
    }

    /**
     * 返回舆情详情
     *
     * @return array
     *
     * 格式如下:
     *
     * 舆情详情
     * [
     *     'message' => '', //说明
     *     'data' => [], //数据
     * ]
     *
     * 失败(将错误保存在 [[yii\base\Model::errors]] 属性中)
     * false
     *
     * @throws ServerErrorHttpException 如果响应状态码不等于20x
     */    public function getArticle()
    {
        $response = Yii::$app->yqdsjApiHttp->createRequest()
            ->setFormat(Client::FORMAT_JSON)
            ->setMethod('post')
            ->setUrl('article/detail.do?access_token=' . $this->access_token)
            ->setData(['docId' => $this->id])
            ->send();
        // 检查响应状态码是否等于20x
        if ($response->isOk) {
            // 检查业务逻辑是否成功
            if ($response->data['code'] === 0) {
                $yqdsjApiData = ['message' => '', 'data' => $response->data['result']];
                return $yqdsjApiData;
            } else {
                $this->addError('id', $response->data['msg']);
                return false;
            }
        } else {
            throw new ServerErrorHttpException(Yii::t('error', Yii::t('error', Yii::t('error', '20042'), ['statusCode' => $response->getStatusCode()])), 20042);
        }
    }
}

3、使用 REST API 时,由于请求格式全部为 JSON,为了简化代码,直接配置请求对象的格式即可。通过配置 [[\yii\httpclient\Client]] 的 requestConfig 来完成,配置所有的请求格式为 JSON,编辑 \common\config\main-local.php

<?php
return [
    'components' => [
        'yqdsjApiHttp' => [
            'class' => 'yii\httpclient\Client',
            'baseUrl' => 'http://47.94.90.194:8085/haihe-service',
            'requestConfig' => [
                'format' => yii\httpclient\Client::FORMAT_JSON
            ],
            'transport' => 'yii\httpclient\CurlTransport'
        ],
    ],
];

4、取消 setFormat() 方法设置用于请求内容的格式为 JSON,以精简代码,编辑 \common\logics\http\yqdsj_api\Article.php

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2018/02/28
 * Time: 13:14
 */
namespace common\logics\http\yqdsj_api;

use Yii;
use yii\base\Model;
use yii\web\ServerErrorHttpException;

/**
 * 舆情大数据接口的舆情
 *
 * @author Qiang Wang <shuijingwanwq@163.com>
 * @since 1.0
 */class Article extends Model
{
    const SCENARIO_VIEW = 'view';

    public $service_key;
    public $id;
    public $access_token;

    public function scenarios()
    {
        $scenarios = parent::scenarios();
        $scenarios[self::SCENARIO_VIEW] = ['service_key', 'id', 'access_token'];

        return $scenarios;
    }

    public function rules()
    {
        return [
            /* 获取舆情详情 */            [['service_key', 'id', 'access_token'], 'required', 'on' => 'view'], //view
            ['service_key', 'compare', 'compareValue' => Yii::$app->params['yqdsjApi']['serviceKey'], 'on' => 'view'], //view
        ];
    }

    public function attributeLabels()
    {
        return [
            'service_key' => \Yii::t('model/http/yqdsj-api/article', 'Service Key'),
            'id' => \Yii::t('model/http/yqdsj-api/article', 'ID'),
            'access_token' => \Yii::t('model/http/yqdsj-api/article', 'Access Token'),
        ];
    }

    /**
     * 返回舆情详情
     *
     * @return array
     *
     * 格式如下:
     *
     * 舆情详情
     * [
     *     'message' => '', //说明
     *     'data' => [], //数据
     * ]
     *
     * 失败(将错误保存在 [[yii\base\Model::errors]] 属性中)
     * false
     *
     * @throws ServerErrorHttpException 如果响应状态码不等于20x
     */    public function getArticle()
    {
        $response = Yii::$app->yqdsjApiHttp->createRequest()
            ->setMethod('post')
            ->setUrl('article/detail.do?access_token=' . $this->access_token)
            ->setData(['docId' => $this->id])
            ->send();
        // 检查响应状态码是否等于20x
        if ($response->isOk) {
            // 检查业务逻辑是否成功
            if ($response->data['code'] === 0) {
                $yqdsjApiData = ['message' => '', 'data' => $response->data['result']];
                return $yqdsjApiData;
            } else {
                $this->addError('id', $response->data['msg']);
                return false;
            }
        } else {
            throw new ServerErrorHttpException(Yii::t('error', Yii::t('error', Yii::t('error', '20042'), ['statusCode' => $response->getStatusCode()])), 20042);
        }
    }
}

5、在 Postman 中调用接口,响应成功,符合预期,如图1

图1

{
    "code": 10000,
    "message": "获取舆情(舆情大数据)详情成功",
    "data": {
        "city": "甘肃省 教育厅",
        "clusterId": 6048085228,
        "description": "来源:中国教师资格网 2018年6月12日 分享到 \n评论\n导读:  以下为各省及其辖区教师资格证认定机构联系方式,更多教师资格认定信息敬请关注233网校教师资格证认定栏目! 教师资格取证上岗>>\n各省份及其辖区内各认定机构联系方式\n序号  省份  省厅联系方式  认定机构联系方式\n1 北京市 010-82089117 shixunban@bjie.ac.cn 北京认定机构\n北京市教师资格认定网:http://www.bjtcc.org.cn\n2 天津市 022-23540113\n022-23540149 tjjszg@126.com 天津认定机构\n天津市高等学校师资培训中心:http://www.tjgspx.cn\n3 河北省 0311-66005786/66005789(资格认定)\n0311-86263380(定期注册) jszgrd@sina.com(资格认定) 河北认定机构\n河北省教育厅:http://jszg.hee.gov.cn/\n4 山西省 0351-2279655 sxjszgzx@163.com 山西认定机构\n山西省教育厅:http://www.sxedu.gov.cn\n5 内蒙古自治区 0471-2856822 jiaoyuting@126.com\n内蒙古教育:http://www.nmgov.edu.cn\n6 辽宁省 024-26901976 lnjszg@126.com\n辽宁省教师培训交流中心:http://www.lnttec.cn\n7 吉林省 0431-82760337\n0431-82752926(高校资格) jljszg@163.com\njytspb@126.com(高校资格)\n吉林教育信息网:http://www.jledu.gov.cn\n吉林省政府政务公开网(高校):http://zwdt.jl.gov.cn/dtgz/dtjj\n8 黑龙江省 0451-53643467 hljjszgrd@126.com\n黑龙江教育信息网:http://www.hlje.net\n9 上海市 021-62523036 shteacher900@163.com 上海认定机构\n上海教育人才:http://www.shehr.cn\n10 江苏省 025-83239421\nhttp://www.ec.js.edu.cn/col/col8327/index.html\n 网站在线留言 江苏认定机构\n江苏教师教育网:http://www.jste.org.cn\n11 浙江省 0571-88908530\n 0571-88908550 zjjszgzx@zjzk.cn\n浙江省教育考试网:http://www.zjzs.net\n12 安徽省 0551-62831877 ahjszgzx@163.com 安徽认定机构\n安徽省教师资格认定指导中心:http://jszg.hfnu.edu.cn\n13 福建省 0591-83781304 fjjszgzx@163.com\n福建教育网:http://www.fjjszg.com\n14 江西省 0791-86765179 jxjszgzx@sina.com\n江西教育网:http://www.jxedu.gov.cn\n15 山东省 0531-66778381\n 0531-86180266(高校资格) sdjszgzx@163.com\n sdgspx@126.com(高校资格) 山东认定机构\n山东省教师资格认定指导中心:http://www.sdjszg.cn\n 山东省高等学校师资培训中心(高校):www.gspxzx.sdnu.edu.cn\n17 河南省 0371-60867560 hnjszgzx@163.com 河南认定机构\n河南省教师资格网:http://jszg.haedu.gov.cn\n16 湖北省 027—87327255 hbsjszg@sina.com\n湖北教师教育网:http://jsjy.e21.cn\n18 湖南省 0731-88607919\n 0731-84736649(高校资格) hnjszg@hnedu.cn \n湖南省教育厅教师处:http://jsc.gov.hnedu.cn\n19 广东省 020-37628372 jszg@gdhed.edu.cn 广东认定机构\n广东省教师资格网:http://www.gdedu.gov.cn\n20 广西壮族自治区 0771-5815208 sf0771@163.com 广西认定机构\n广西教师教育网:http://www.gxjs.com.cn\n21 海南省 0898-65203038 65203038@163.com 海南认定机构\n海南省教育厅:http://edu.hainan.gov.cn\n22 重庆市 023-62658186\n 023-63865672(高校资格) cqjszg@163.com\n重庆市教师资格网:http://www.jszg.cq.cn\n 重庆市教委人事处(高校):www.cqedu.cn\n23 四川省 028-86138701 anjinyang147@163.com 四川认定机构\n四川省教育厅:http://www.scedu.net\n24 贵州省 0851-86700608 gzjszgzx@gznu.edu.cn\n贵州教育网:http://www.gzsedu.cn/\n25 云南省 0871-65141568 jytrsc@126.com 云南认定机构\n云南省教育厅:http://www.ynjy.cn\n26 西藏自治区 0891-6599504 xzjszg@126.com\n西藏教育:http://www.xzedu.com.cn\n27 陕西省 029-88668691 snjszg@126.com\n snjszgzx@126.com 陕西认定机构\n陕西省教育厅:http://www.snedu.gov.cn\n28 甘肃省 0931-7971340 gsjytsfc@126.com 甘肃认定机构\n甘肃省教师资格认定指导中心:http://www.nwnu.edu.cn/cate.do?dept=0087\n29 青海省 0971-6310741 qhsfjy@126.com\n青海省教育厅:http://www.qhedu.cn\n30 宁夏回族自治区 0951-5559106 nxedurs@163.com 宁夏认定机构\n31 新疆维吾尔自治区 0991-4362086 szglc@126.com 新疆认定机构\n新疆生产建设兵团 0991-2896283",
        "docId": "6048085228",
        "emotionScore": 30,
        "emotionTendency": 1,
        "pics": [],
        "pubTime": "2018-06-12 10:06:46",
        "src": "www.233.com",
        "title": "各省及其辖区教师资格证认定机构联系方式汇总-教师资格证-233网校",
        "url": "http://www.233.com/teacher/rending/201806/12100118272.html",
        "exportTime": "2018-06-15 14:29:40"
    }
}

6、查看 Available Debug Data,请求格式为 application/json,如图2

图2

yii\httpclient\CurlTransport::send
POST http://47.94.90.194:8085/haihe-service/article/detail.do?access_token=fb46626f0e71e423ca8ab4c750620a85
Content-Type: application/json; charset=UTF-8

{"docId":"6048085228"}
E:\wwwroot\pcs-api\common\logics\http\yqdsj_api\Article.php:79
E:\wwwroot\pcs-api\api\rests\yqdsj_article\ViewAction.php:66

 

永夜