当我使用curl
via POST
和set时CURLOPT_POSTFIELD
,我必须urlencode
或任何特殊格式?
例如:如果我想发布2个字段,第一个和最后一个:
first=John&last=Smith
Run Code Online (Sandbox Code Playgroud)
curl应该使用的确切代码/格式是什么?
$ch=curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$reply=curl_exec($ch);
curl_close($ch);
Run Code Online (Sandbox Code Playgroud)
kod*_*art 95
如果你要发送一个字符串,urlencode()它.否则,如果是数组,则应该是key => value paired并且Content-type
标头会自动设置为multipart/form-data
.
此外,您不必创建额外的函数来为您的数组构建查询,您已经拥有:
$query = http_build_query($data, '', '&');
Run Code Online (Sandbox Code Playgroud)
Cze*_*ogy 57
编辑:从PHP5以上,http_build_query
建议使用:
string http_build_query ( mixed $query_data [, string $numeric_prefix [,
string $arg_separator [, int $enc_type = PHP_QUERY_RFC1738 ]]] )
Run Code Online (Sandbox Code Playgroud)
手册中的简单示例:
<?php
$data = array('foo'=>'bar',
'baz'=>'boom',
'cow'=>'milk',
'php'=>'hypertext processor');
echo http_build_query($data) . "\n";
/* output:
foo=bar&baz=boom&cow=milk&php=hypertext+processor
*/
?>
Run Code Online (Sandbox Code Playgroud)
在php5之前:
从手册:
CURLOPT_POSTFIELDS
要在HTTP"POST"操作中发布的完整数据.要发布文件,请在文件前加上@并使用完整路径.可以通过使用格式为'; type = mimetype'的类型的文件名来明确指定文件类型.此参数可以作为urlencoded字符串传递,如'para1 = val1¶2 = val2&...',也可以作为数组传递,字段名称为键,字段数据为值.如果value是数组,则Content-Type标头将设置为multipart/form-data.从PHP 5.2.0开始,使用@前缀传递给此选项的文件必须采用数组形式才能工作.
所以像这样的东西应该完美地工作(在关联数组中传递参数):
function preparePostFields($array) {
$params = array();
foreach ($array as $key => $value) {
$params[] = $key . '=' . urlencode($value);
}
return implode('&', $params);
}
Run Code Online (Sandbox Code Playgroud)
Thi*_*ter 38
你可以传递一个数组,让php/curl完成编码等的脏工作.
此处尚未提及的另一个主要区别是CURLOPT_POSTFIELDS
无法处理嵌套数组。
如果我们采用嵌套数组,['a' => 1, 'b' => [2, 3, 4]]
那么这应该被参数化为a=1&b[]=2&b[]=3&b[]=4
([
并且]
将/应该是 URL 编码的)。这将自动转换回另一端的嵌套数组(假设这里的另一端也是 PHP)。
这将起作用:
var_dump(http_build_query(['a' => 1, 'b' => [2, 3, 4]]));
// output: string(36) "a=1&b%5B0%5D=2&b%5B1%5D=3&b%5B2%5D=4"
Run Code Online (Sandbox Code Playgroud)
这行不通:
curl_setopt($ch, CURLOPT_POSTFIELDS, ['a' => 1, 'b' => [2, 3, 4]]);
Run Code Online (Sandbox Code Playgroud)
这会给你一个通知。代码执行将继续,您的端点将接收b
字符串形式的参数"Array"
:
PHP 注意:数组到字符串的转换 in ... 在线 ...
小智 7
对于CURLOPT_POSTFIELDS
,参数既可以作为 urlencoded 字符串传递,也可以作为以para1=val1¶2=val2&..
字段名称作为键和字段数据作为值的数组传递
尝试以下格式:
$data = json_encode(array(
"first" => "John",
"last" => "Smith"
));
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$output = curl_exec($ch);
curl_close($ch);
Run Code Online (Sandbox Code Playgroud)
content-type
要以标准方式发送数据,就像浏览器发送表单一样,只需传递一个关联数组。正如 PHP 手册所述:
此参数可以作为 urlencoded 字符串(如 'para1=val1¶2=val2&...')或作为以字段名称作为键和字段数据作为值的数组传递。如果 value 是一个数组,则 Content-Type 标头将设置为 multipart/form-data。
尽管如此,在与 JSON API 通信时,内容必须是 JSON 编码的 API 才能理解我们的 POST 数据。
在这种情况下,内容必须明确编码为 JSON :
CURLOPT_POSTFIELDS => json_encode(['param1' => $param1, 'param2' => $param2]),
Run Code Online (Sandbox Code Playgroud)
在 JSON 中进行通信时,我们通常也会相应地设置accept
和content-type
标头:
CURLOPT_HTTPHEADER => [
'accept: application/json',
'content-type: application/json'
]
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
231303 次 |
最近记录: |