简易http接口实现

        http接口是什么,我一直没找到比较明确的定义(如果有哪位可以提点一下,我将非常感谢),今天就自己来总结一下吧。个人认为,http接口就是一种基于http服务的api,是系统之间交互的一种约定,所谓的web service其实也就是一种http接口,只不过它是比较规范的、通用的。

        http接口有什么用,个人体会是,http接口最主要的作用是能够较好地解决不同系统(可能是功能不同、开发语言不同、服务商不同,等等,但都是基于http服务的)之间的交互的需求,比如像微信公众号的各种接口,不管是使用Java开发还是PHP进行开发,不管是A公司在开发还是B公司在开发,也不管是要做商城系统还是做企业宣传网站,都一样可以很好地调用。

        接下来就展现一套自己写的简易的http接口,作为自己这段时间学习与实践的一个小总结。这套接口的基本框架,在本人的具体开发实践中是有用到的,目前来看,运行效率和可扩展性还算能满足需要。

        下图就是整个框架项目的目录结构

简易http接口实现_第1张图片

        整个接口服务端的处理流程如下:

        1、接收并解析请求;

        包括检查数据格式、验证签名等。

        2、根据请求实例化对应的处理器;

        简单工厂模式,映射规则为:接口名称为test,则实例化apis\TestApi类。

        3、处理器具体处理请求;

        调用处理器的handle()方法,比如userinfo接口,handle()可能就是去数据库中查找响应的user信息。

        4、处理器输出响应

        调用response()方法。

 

        前面也说了,接口是一种约定,因此发送数据和输出响应都是要遵循这个约定的,一般情况下,约定分为总体约定和具体接口约定两个部分,总体约定如下:

        1、以http的post方式提交数据,数据在$_POST中的键名为data;

        2、数据提交时需要先后经过json和base64编码,中文需保持原样,输出的响应同样如此;

        3、提交数据的格式:

   $data = [

      'api' => 'userinfo', // 具体接口名称,必须

      'noncestr' => '123',// 随机字符串,必须

      'serial' => '123', // 调用流水号,必须

      'signature' => 'xxx', // 签名,必须

      'body' => [

         ... // 请求详细数据,由具体接口约定,可选

      ]

   ];

   4、响应数据的格式:

   $data = [

      'code' => 0, // 状态码,0为调用成功,非0为失败,必须

      'serial' => '123', // 调用流水号,必须

      'signature' => 'xxx', // 签名,非必须

      'body' => [

         ... // 响应详细数据,由具体接口约定,可选

      ]

   ];

 

以下是各文件的代码:

aHttpApiHandler.php

data = $data;
	}
	
	/**
	 * 输出响应
	 * @access public
	 * @return mixed
	 */
	public function response() {
		$result = HttpApiUtil::makeReturn(0, '', $this->data['serial'], $this->result);
		echo base64_encode(json_encode($result, JSON_UNESCAPED_UNICODE));
	}	
}


TestApi.php


UserinfoApi.php

data['body']['id'];
		$this->result = [
			'id' => $id,
			'name' => 'webmaster',
			'nickname' => 'web管理员'
		]; 
	}
}


common.php


CurlUtil.php


HttpApiConfig.php


HttpApiError.php

 '数据格式错误',
		10002 => '数据解析错误',
		10003 => '签名错误',
		10004 => '接口不存在',
		10005 => '无法创建处理器',
		90001 => '未知错误',
	];
	
	/**
	 * 获取错误信息
	 * @access public
	 * @param integer $code 错误码
	 * @return mixed
	 */
	public static function getError($code) {
		return isset(self::$errors[$code]) ? self::$errors[$code] : false;
	}
}

HttpApiHandlerFactory.php

newInstance($request);
		} catch (\Exception $e) {
			throw new \Exception(HttpApiError::getError(HttpApiError::CANT_CREATE_HANDLER), HttpApiError::CANT_CREATE_HANDLER);
		}		
	}
}

HttpApiParser.php


index.php

getCode(), $e->getMessage()));
	exit();
}

// 执行操作
$api->handle();
$api->response();

test.php
 'test',
	'noncestr' => HttpApiUtil::makeNoncestr(),
	'serial' => HttpApiUtil::makeSerial(),
	'body' => [
	]
];
$data['signature'] = HttpApiUtil::makeSign($data);

$json = 'data=' . base64_encode(json_encode($data));
try {
	$response = CurlUtil::doPost($url, $json);
	echo $response;//  原始输出
	print_r(json_decode(base64_decode($response), true));
} catch (Exception $e) {
	echo $e->getMessage();
}

OK,简易的http接口就是这样了,如果要新增一个具体接口,比如查看用户列表,可以考虑新增一个apis\UserlistApi类,继承aHttpApiHandler类并实现相应的方法即可了。

 

你可能感兴趣的:(PHP)