注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天朝布衣田中码农参上

苦逼码农的点点滴滴,请多多指教!

 
 
 

日志

 
 
 
 

php发送接收Request Payload Json数据的技术实现  

2017-09-28 10:14:08|  分类: PHP |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
在最近与某公司对调一个接口时,遇到了这个问题[写好代码后,自己测试相关发送和接收Payload Json数据功能,却发现通常的发送和接收代码根本不起作用]。Request Payload Json据说是很流行的模式,但跟常用的POST方式不太一样。AJAX POST 发送数据有2种方式: Form Data 和  Request Payload模式。Form Data 是大家常用的方式,数据格式都是:name=value&name2=value2&...,而要POST 一个 JSON 数据体,就要使用 Request Payload 方式。原有的代码只适应于普通POST方式,所以要想发送或接收Request Payload,就得重新修改下相关代码。当然,这种变动并不大,稍稍调整下即可。
下面来示范下相关发送请求例子:

<?php
function http_post_data($url, $data_string) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
//设置相关头部以适应Request Payload 方式
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json; charset=utf-8',
'Content-Length: ' . strlen($data_string))
);
ob_start();
curl_exec($ch);
$return_content = ob_get_contents();
ob_end_clean();
$return_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
return array($return_code, $return_content);
}
$url = "http://593668.com/testpostjson.json";
$data = '{"url":"593668.com","site":"668"}';
list($return_code, $return_content) = http_post_data($url, $data);
if($return_code==200){
//200正常执行返回数据
echo $return_content;
}
?>

其实是真的很简单,就是调整下请求头部,将Content-Type设成application/json即可[正常POST提交的头部默认是application/x-www.form-urlencoded],这样就会再按照Request Payload模式提交数据。
至于接收数据,也同样需要修正,不能直接用$_POST接收,需要自行去处理,通过获取原始数据流的方式来进行解析即可。

<?php
//先用$GLOBALS['HTTP_RAW_POST_DATA']来接收
$msg=$GLOBALS['HTTP_RAW_POST_DATA'];
//如果不行的话,再尝试用php://input接收参数
if(!$msg)$rmsg=file_get_contents( "php://input");
//将接收到的数据转成数组
$resultcode = json_decode($msg,true);
//打印数组
print_r($resultcode);
?>

这里用到了两种接收方式,由于PHP默认只识别application/x-www.form-urlencoded标准的数据类型,因此,对型如 application/json 的内容无法自动解析为$_POST数组[这也是为什么用$_POST接收不到数据的原因],故保留原始值,交给$GLOBALS['HTTP_RAW_POST_DATA'] 来接收。此外,php://input 也可以实现此这个功能,读取 POST 的原始数据。和$GLOBALS['HTTP_RAW_POST_DATA']  比起来,它给内存带来的压力较小,并且不需要任何特殊的 php.ini 设置。只是请注意一点,php://input 并不能用于 enctype="multipart/form-data"。
  评论这张
 
阅读(1)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018