curl 我们经常说 请求提交用json格式,类似于下图。这自然无可厚非。
但是,如果我们现在就是要传一个json字符串的值呢?类似key=>123, key=>json_str这种形式,且这里要注意json_str可能是['thing4' => ['value' => '幸运大转盘'], 'thing6' => ['value' => '好友成功预约,快来抽奖吧!']]这种含单引号和汉字编码的。如果使用CURL get 或post是一定要处理url和汉字编码问题的。
问题来自于小马在实现一个 消息推送的接口封装,但是这个消息接口需要接收模板参数,这个模板参数就是个json数组格式的,如下:
$args =[
'templateData' => urlencode(json_encode(['thing4' => ['value' => '幸运大转盘'], 'thing6' => ['value' => '好友成功预约,快来抽奖吧!']],JSON_UNESCAPED_UNICODE)),//如果使用get post 的query参数就需要这样做编码处理
'templateId' => 2,
'templatePage' => ''
];
curl 如果直接用get query传递这些参数,显然会存在url处理编码的问题。所以考虑使用post并放在body中。
用body 这样做的好处就是,发送方不用处理任何编码:
$body = [ 'templateData' => ['thing4' => ['value' => '幸运大转盘'], 'thing6' => ['value' => '好友成功预约,快来抽奖吧!']], 'templateId' => 2, 'templatePage' => '' ]; $options = array(); $options[CURLOPT_CUSTOMREQUEST] = 'POST'; $options[CURLOPT_HTTPHEADER] = array( 'Content-Type:application/json' ); $query_json = json_encode($body,JSON_UNESCAPED_UNICODE);/* $args =[ 'templateData' => urlencode(json_encode(['thing4' => ['value' => '幸运大转盘'], 'thing6' => ['value' => '好友成功预约,快来抽奖吧!']],JSON_UNESCAPED_UNICODE)), 'templateId' => 2, 'templatePage' => '' ]; $args = http_build_query($args);*/ $requestUrl = 'http://miniprogram-user.com/?c=User&a=subscribeMessageSend&'; $backData = curl($requestUrl,$query_json,$options);
接收方也可以直接获得原始的参数:
$bodyArr = json_decode($body,true);
$bodyArr = json_decode($body,true);
就可以得到json字符串参数值,而不需要任何的编码处理。
如下。
我们换种思路,使用post请求将key=>json_str 放在body里请求会更好处理。
那么问题来了,如题,请求接收端该如何接收post请求里的 body参数值呢?
PHP:file_get_contents('php://input');//注意$_REQUEST 是取不到body值的
swoole: $body = $this->request->rawContent();//注意其他函数是取不到body值的
网友评论