欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

[日常] 跨语言的POST请求问题的解决

程序员文章站 2023-10-30 23:12:40
部门对外提供了一个HTTP的POST接口,但是对方公司的程序员使用C语言进行的调用,PHP这边一直无法获取到参数.遇到这种情况是因为对方没有完全按照HTTP协议中的POST发送数据.在HTTP头部分没有增加Content-Type: application/x-www-form-urlencoded ......

部门对外提供了一个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