[日常] 跨语言的POST请求问题的解决
部门对外提供了一个http的post接口,但是对方公司的程序员使用c语言进行的调用,php这边一直无法获取到参数.遇到这种情况是因为对方没有完全按照http协议中的post发送数据.在http头部分没有增加content-type: application/x-www-form-urlencoded头,数据部分直接传递的json字符串,这样就导致php这边解析不到$_post的数据,传递内容的字符串应该是以name=xxx&age=xxx这种形式传递
content-type是属于http的内容头部,当增加这个头部,并且数据格式正确时,php的$_post才能够获取得到数据
content-type:application/x-www-form-urlencoded,这个类型是ajax默认的content-type类型,这时前端可以以对象方式直接给后端,或者以json方式传给后端, 当action为get时候,浏览器用x-www-form-urlencoded的编码方式把form数据转换成一个字串(name1=value1&name2=value2...),然后把这个字串append到url后面,用?分割,加载这个新的url。 当action为post时候,浏览器把form数据封装到http body中,然后发送到server。在浏览器控制台可以看到它们的内容都是以'from data'形式展现
content-type:application/json
如果ajax的头部是application/json,那么post时,数据必须以json格式传给后端,这时后端在$_post中不能直接接受到数据,必须用$globals['http_raw_post_data']取出来,然后再json_decode就行了。
if($globals['content_type']=='application/json'){
$_post=json_decode($globals['http_raw_post_data']);
}
content-type:multipart/form-data是上传文件时指定的编码格式
还有就是当请求https的数据时,需要指定ca证书的位置,或者忽略掉ca验证,php请求https资源的时候使用curl扩展有参数可以忽略验证,如果是使用curl命令,那该命令使用的证书的位置是在/etc/pki/tls/certs/ca-bundle.crt
当使用cur无法访问https资源的时候,就需要下面的操作
1.需要下载ca证书 文件地址是 http://curl.haxx.se/ca/cacert.pem
2.把下载的文件放到这个位置 /etc/pki/tls/certs/ca-bundle.crt
推荐阅读
-
有关Ajax跨域问题的两种解决方法
-
[日常] 跨语言的POST请求问题的解决
-
Canvas引入跨域的图片导致toDataURL()报错的问题的解决
-
解决laravel 出现ajax请求419(unknown status)的问题
-
springboot解决前后端分离时的跨域问题
-
通过过滤器(Filter)解决JSP的Post和Request中文乱码问题
-
解决axios会发送两次请求,有个OPTIONS请求的问题
-
Python的Django应用程序解决AJAX跨域访问问题的方法
-
基于vue 添加axios组件,解决post传参数为null的问题
-
php中curl和soap方式请求服务超时问题的解决