服务端接收不到Post请求的参数
今天用Fiddler模拟Post请求测试接口,发现服务端接收到的Post参数为空。
通过Fiddler记录了下真实Post请求的Header头,发现问题的原因在于Content-Type这个参数。
POST请求的Content-Type支持application/x-www-form-urlencoded 或 multipart/form-data 两种。
今天用Fiddler模拟Post请求测试接口,发现服务端接收到的Post参数为空。
通过Fiddler记录了下真实Post请求的Header头,发现问题的原因在于Content-Type这个参数。
POST请求的Content-Type支持application/x-www-form-urlencoded 或 multipart/form-data 两种。
$a = gzcompress('test');
echo 'before json : ';
print_r($a);
echo "\n";
echo 'after json : ';
print_r(json_encode($a));
输出的结果为:
before json : x+I-.]
after json : null
json_encode后的结果为null,PHP手册上给了说明。
待编码的 value ,除了resource类型之外,可以为任何数据类型
该函数只能接受 UTF-8 编码的数据
如何解决呢?
$a = gzcompress('test');
echo 'before json : ';
print_r($a);
echo "\n";
echo 'after json : ';
print_r(json_encode(base64_encode($a)));
输出结果为:
before json : x+I-.]
after json && base64 : "eJwrSS0uAQAEXQHB"
项目中用到一个C的二进制接口,需要通过php拼包请求接口同时解析返回的二进制包。
比较特殊的一点是,接口里有用到64位整型,但是php的pack/unpack原生并不支持64位整型,为了解决这个着实费了一番功夫。
将一个64位整型转换成高位和低位的两个32位整型,通过两个32位整型的结构来表示一个64位整型。
<?php
define("BIGINT_DIVIDER", 0x7fffffff + 1);
function split2Int(&$upper, &$lower, $value) {
$lower = intval($value % BIGINT_DIVIDER);
$upper = intval(($value - $lower) / BIGINT_DIVIDER);
}
function bigInt2float($upper, $lower) {
return $upper * BIGINT_DIVIDER + $lower;
}
$num = 5000000000;
split2Int($upper, $lower, $num);
$buffer = pack('NN', $upper, $lower); // 大端序
$result = unpack('Nupper/Nlower', $buffer);
echo bigInt2float($upper, $lower); // 5000000000
参考资料:
PHP: pack/unpack补遗
PHP pack() format for signed 32 int - big endian
A 64 bit integer for PHP
从5.1开始搞,中间陆陆续续一直有其他事情插进来,上周五才终于有时间专心验证这个问题。
经过周五的重新开发打包,在今天终于调通接口了。
哈哈~~~
这周身上堆了两件棘手的事情。
维护的项目底层存储异常,整个服务受到影响。
领导放话这周必须解决,压力好大的说...(第一次被领导训话的说...)
暂时将服务恢复到正常可用状态了,准备回家陪媳妇吃饭,这周老是让她等我了。