如何用java实现对接PHP服务的接口调用?
情况是这样的,自己是java开发者,有对接php项目服务的接口请求场景。本来也就是个http接口对接,但问题来了,熟悉java数据结构的看到接口文档中php参数结构,会懵圈了?
根据文档若用php实现参数的设置:
$param = ['code'=>'543689'];
function sender($mobile, $tplCode,$param, $sign){
$data = [
'mobiles' => $mobile,
'tpl_code' => $tplCode,
'tpl_params' => $param,
'sign_name' => $sign,
];
$time = time();
$token = md5($time .15565422 .'接口秘钥');
$comData = ['time' => $time, 'user_id' => $userId, 'token' => $token];
$postData = array_merge($comData, $data);
$url = 'https://www.8a.hk/api/sms/sendByTplCode';
return sendPost($url, $postData);
}
想要用java实现,就需要知道 tpl_params参数值在http请求中PHP是怎么拼接的,所以通过在线的PHP执行测试,得到了下面日志:
Array
(
[time] => 1623910775
[user_id] => 15565422
[token] => 5c2070ec5205872d7ea5d94638f7e7d6
[mobiles] => 13888888888
[tpl_code] => SMS_2001023565
[tpl_params] => Array
(
[code] => 543689
)
[sign_name] => 短信签名
)
time=1623910775&user_id=15565422&token=5c2070ec5205872d7ea5d94638f7e7d6&mobiles=13888888888&tpl_code=SMS_2001023565&tpl_params%5Bcode%5D=543689&sign_name=%E7%9F%AD%E4%BF%A1%E7%AD%BE%E5%90%8D
我们URLdecode下url拼接形式,就获取到了 tpl_params[code]=543689 ,这不是任何一种java数据结构toString字符串输出。最好直接拼接解决这种跨语言数据结构的Http请求问题。
附件,提供下php版接口实现示例如下:
<?php
/**公共参数
* @param $userId 会员ID
* @param $secret 接口秘钥
*
* @return array
*/
function getCommonData($userId, $secret){
$time = time();
$token = md5($time . $userId . $secret);
return ['time' => $time, 'user_id' => $userId, 'token' => $token];
}
/**发送请求
* @param $url 接口地址
* @param $params 请求参数 数组
* @param null $header
*
* @return bool|mixed
*/
function sendPost($url, $params, $header = null){
if (empty($url)) {
return false;
}
// 判断是否是字符串
if (!is_string($params)) {
$params = http_build_query($params);
print_r($params);
}
$length = strlen($params);
$header[] = 'Content-Length: ' . $length;
$options = [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => $header,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $params,
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_TIMEOUT => 20, // 过期时间
];
$ch = curl_init();
$setRes = curl_setopt_array($ch, $options);
if (!$setRes) {
$error = 'curl error ' . curl_errno($ch) . ': ' . curl_error($ch);
trigger_error($error);
}
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
/**发送短信
* @param $mobile 手机号码,多个英文逗号隔开
* @param $tplCode 模板编号
* @param $param 参数 数组
* @param $type 短信类型 1:验证码 2:短信通知 3:营销短信
*
* @return mixed
*/
function sender($mobile, $tplCode,$param, $sign)
{
$data = [
'mobiles' => $mobile,
'tpl_code' => $tplCode,
'tpl_params' => $param,
'sign_name' => $sign,
];
$postData = array_merge(getCommonData(15565422, '接口秘钥'), $data);
print_r($postData);
$url = 'https://www.8a.hk/api/sms/sendByTplCode';
return sendPost($url, $postData);
}
$param = ['code'=>'543689'];
$result = sender('13888888888', 'SMS_2001023565', $param, '短信签名');//发送短信
?>