最近工作中需要请求一个API,由于之前接过类似的就直接拿来写好的函数使用。但数据死活就是传不过去,一只返回err.

代码如下:

 function post_params($url, $params,$headers) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$json= curl_exec($ch);
curl_close($ch);
return $json;
}

看起来没什么问题,但就是不行。

到网上看了类似的解决方案后,抱着试一试的心态修改了代码:

 function curlPost($url, $headers, $post){
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
if(!empty($headers)){
curl_setopt($ch,CURLOPT_HTTPHEADER,$headers);
}
curl_setopt($ch, CURLOPT_POST, 1);//POST
curl_setopt($ch, CURLOPT_POSTFIELDS,
http_build_query($post));//postData
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); //success
curl_setopt($ch, CURLOPT_HEADER,0);
curl_setopt($ch, CURLINFO_HEADER_OUT,1);
$json = curl_exec($ch);
return $json;
}

然后重新请求,OK了...
啥情况呢?

我的理解是:在当CURLOPT_POSTFIELDS被设置为数组时,Content-type 被设置成了multipart/form-data;

而用字符串传值时,Content-type为application/x-www-data-urlencoded。

传递一个数组到CURLOPT_POSTFIELDS,cURL会把数据编码成 multipart/form-data,而然传递一个URL-encoded字符串时,数据会被编码成 application/x-www-form-urlencoded。

代码中添加的http_build_query()函数的作用是使用给出的关联(或下标)、数组生成一个经过URL-encode的请求字符串;

写法格式:http_build_query ( mixed $query_data [, string $numeric_prefix [, string $arg_separator [, int $enc_type = PHP_QUERY_RFC1738 ]]] )

举个例子:$data = array("name"=>"callback" , "value"=>"test");

$rescult = http_build_query($data);

我们输出下$rescutl可以得到:

name=callback&value=test

这个有什么用呢,这是模拟http请求的,把得到的数据data通过函数URL-encode,一般是用在回调。(完)

结论:API接收的是字符串!http_build_query()把数组转为字符串传递。

相关链接:https://blog.csdn.net/u011250882/article/details/48983929

(完)

码代码 还是要静下心来思考 心无旁骛 对的逻辑很关键... 

PHP POST请求 字符串和数组传值的区别的更多相关文章

  1. 微信开发所需要的的方法(签名认证、数组转字符串方法、将xml字符串转换为数组、发送xml请求方法)

    //将xml字符串转换为数组 public function xmlToArray($xml){ $array_data = json_decode(json_encode(simplexml_loa ...

  2. JQuery发送ajax请求不能用数组作为参数

    JQuery发送ajax请求不能用数组作为参数,否则会接收不到参数, 一.js代码如下: $('#delete-button').click(function(){        var select ...

  3. ajax处理返回的三种格式(json格式 , xml通用格式 , html文本格式)(数据类型:整数、字符串、数组、对象)(基础最重要!)

    ajax方法的参数 常用的ajax参数比如url,data,type,包括预期返回类型dataType,发送到服务器的数据的编码类型contentType,成功方法,失败方法,完成方法.除了这些以外还 ...

  4. sizeof、strlen、字符串、数组,整到一块,你还清楚吗?

    写在前面 sizeof.strlen.字符串.数组,提到这些概念,相信学过C语言的人都能耳熟能详,也能谈得头头是道,但是,在实际运用中,当这些内容交织在一起时,大家却不一定能搞地清清楚楚,本文的目的正 ...

  5. Java中将一个字符串传入数组的几种方法

    String Str="abnckdjgdag"; char a[]=new char[Str.length()]; -------------------方法1 用于取出字符串的 ...

  6. 03- Shell脚本学习--字符串和数组

    字符串 字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号.单双引号的区别跟PHP类似: 单双引号的区别: 双 ...

  7. js中字符串和数组相互转化的方法

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #e4af0a } p. ...

  8. bash中不可以用字符串做数组下标

    bash中可以用字符串做数组下标吗例如 test["abc"]=1------解决方案-------------------- 好像是误会,是awk里可以,bash shell里不 ...

  9. js数字、字符串、数组之间的转化

    1.数组转字符串 var a, b; a = ,,,,); b = a.join("-"); 2.字符串转数组 var s = "abc,abcd,aaa"; ...

随机推荐

  1. Java多线程wait和notify协作,按序打印abc

    有一个经典的多线程面试题:启三个线程,按序打印ABC 上代码: package cn.javaBase.study_thread1; class MyRunnable1 implements Runn ...

  2. Virtual Judge POJ 1328 Radar Installation

    贪心 #include<algorithm> #include<iostream> #include<cstdio> #include<cmath> u ...

  3. openresty + lua

    lua语法总结: 1. 导入模块(用require来加载,模块是一个类型为table的全局变量) 导入写好的包,举例如下: 2. lua 数据类型(有8种:nil.boolean.number.str ...

  4. Educational Codeforces Round 76 D

    这次的ABC三道题非常水,但是我就卡在这个D题上了QAQ 当时大概猜到了贪心,但是没有思路,后来看了一些题解才明白到底是什么意思 首先,假设我们已经处理好了前面的monsters,对于第i个monst ...

  5. Apache Kafka(三)- Kakfa CLI 使用

    1. Topics CLI 1.1  首先启动 zookeeper 与 kafka > zookeeper-server-start.sh config/zookeeper.properties ...

  6. Tomcat无法成功启动——双击startup.bat闪退

    使用的Tomcat是免安装版本的.因为在启动tomcat是需要读取环境变量和配置信息,缺少了这些信息,就不能登记环境变量,导致了tomcat的闪退. 解决办法: 1:在已解压的tomcat的bin文件 ...

  7. zabbix监控规划及实施

    一.规划监控拓扑 二.主机分组 例:交换机.Nginx.Tomcat.MySQL 三.监控对象识别: 1.使用SNMP监控交换机 a.交换机开启snmp config -t snmp-server c ...

  8. Android 使用 MPAndroidChart 实现折线图

    Android 使用 MPAndroidChart 实现折线图 做Android项目的时候用到了折线图,不光折线图,还可能遇到很多的图表需要展示渲染,自己手画的话那好玩了,今天使用MPAndroidC ...

  9. 为什么Oracle等数据库软件可以同时创建多个连接

    首先我们要明确的是一个IP跟一个端口确定的是一个进程的地址,也就是我们运行了一个Oracle的数据库,这时候就已经确定的了. oracle监听器也是一个TCP/IP网络中的进程,默认的端口号是1521 ...

  10. 关于video++,jsrun,有道笔记等的感想

    这几天一直在思考切入点.想了很多,有关于给初创企业提供社交平台营销的,如公众号,小程序,支付宝的到位,附近等.这些初看起来可行,细想起来有一些根本不完备.如通过微小宝多平台客户端了解最热的内容,在内容 ...