最新消息:yaf表单扩展中新增加了浮点数、日期和集合的校验。php yaf框架扩展实践三——表单

php发送http请求带json格式数据

PHP 1902浏览 0评论

上篇说到了php获取post请求http body中json格式的数据,在实际应用中也需要给其它应用发送类似的请求,这篇要说明一下如何发送http body为json格式的请求。因为涉及到http头信息,可以先参考一下:php获取post请求的json参数

先贴一下代码吧:


$url = "http://localhost:9090/";

$params = json_encode(array(
    'users' => array(
        array('user_id' => '1', 'name' => 'tony'),
        array('user_id' => '2', 'name' => 'andy')
        )));

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/json',
    'Content-Length: ' . strlen($params)
));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);

$res = curl_exec($ch);
curl_close($ch);
var_dump($res);

curl中CURLOPT_POSTFIELDS参数就是设置body的内容,这里设置为post提交是用CURLOPT_CUSTOMREQUEST而不是CURLOPT_POST,根据官网的说明:

CURLOPT_POST
启用时会发送一个常规的POST请求,类型为:application/x-www-form-urlencoded,就像表单提交的一样。

因为是要发送json格式,所以不能用这个。

踩的一个坑

在处理的时候踩了一个坑,么有设置头信息Content-Type: application/json,结果导致其它语言接收不到。但是php自己用file_get_contents(“php://input”);可以正常获取到。

后来找同事用nodejs,自己用golang语言测试才发现这个坑,如果没有设置Content-Type,默认是application/x-www-form-urlencoded,一定要要设置头信息Content-Type: application/json才可以。我估计其它语言在处理上有对Content-Type进行判断,根据不同类型进行处理。

最后在测试的过程中偶然发现postman的一个功能可以打印出各语言的请求代码,非常方便。

postman输出个语言请求代码

postman输出个语言请求代码

转载请注明:快乐编程 » php发送http请求带json格式数据

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址