上篇说到了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输出个语言请求代码
转载请注明:快乐编程 » php发送http请求带json格式数据