IT-Swarm.Net

CURLOPT_POSTFIELDS의 curl POST 형식

curl을 통해 POST을 (를) 사용하고 CURLOPT_POSTFIELD을 (를) 설정하면 urlencode 또는 특별한 형식이어야합니까?

예를 들어, 두 개의 필드를 게시하려면 먼저 다음을 수행하십시오.

first=John&last=Smith

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);
95
Ken

문자열을 보내는 경우 urlencode (). 그렇지 않으면 배열이면 키 => 값 쌍이어야하고 Content-type 헤더는 자동으로 multipart/form-data로 설정됩니다.

또한 배열에 대한 쿼리를 작성하기 위해 추가 함수를 만들 필요가 없습니다.

$query = http_build_query($data, '', '&');
94
kodeart

EDIT : php5부터 http_build_query 사용을 권장합니다 :

_string http_build_query ( mixed $query_data [, string $numeric_prefix [, 
                          string $arg_separator [, int $enc_type = PHP_QUERY_RFC1738 ]]] )
_

매뉴얼의 간단한 예 :

_<?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
*/

?>
_

php5 이전 :

manual 에서 :

CURLOPT_POSTFIELDS

HTTP "POST"작업으로 게시 할 전체 데이터입니다. 파일을 게시하려면 파일 이름 앞에 @를 붙여 전체 경로를 사용하십시오. 파일 형식은 '; type = mimetype'형식의 파일 이름을 따라 명시 적으로 지정할 수 있습니다. 이 매개 변수는 'para1 = val1 & para2 = val2 & ...'와 같은 urlencoded 문자열로 전달되거나 필드 이름이 키이고 필드 데이터가 값인 배열로 전달 될 수 있습니다. 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);
}
_
57
Czechnology

문자열을 전혀 전달하지 마십시오!

배열을 전달하고 php/curl이 인코딩 등의 더러운 작업을 수행하도록 할 수 있습니다.

37
ThiefMaster

PHP 매뉴얼에 따르면 문자열로 cURL에 전달 된 데이터는 URL로 인코딩해야합니다. curl_setopt () 페이지를보고 CURLOPT_POSTFIELDS을 검색하십시오.

4
Surreal Dreams

여기에 아직 언급되지 않은 또 다른 주요 차이점은 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"

작동하지 않습니다.

curl_setopt($ch, CURLOPT_POSTFIELDS, ['a' => 1, 'b' => [2, 3, 4]]);

이것은 당신에게 통지를 줄 것입니다. 코드 실행이 계속되고 엔드 포인트는 매개 변수 b을 (를) 문자열 "Array"로받습니다 :

PHP 공지 : ...에서 배열을 문자열로 변환 ...

3
7ochem

중첩 배열의 경우 다음을 사용할 수 있습니다.

$data = [
  'name[0]' = 'value 1',
  'name[1]' = 'value 2',
  'name[2]' = 'value 3',
  'id' = 'value 4',
  ....
];
2
Max

CURLOPT_POSTFIELDS의 경우, 매개 변수는 para1=val1&para2=val2&..와 같은 urlencoded 문자열로 전달되거나 필드 이름이 키이고 필드 데이터가 값인 배열로 전달 될 수 있습니다.

다음 형식을 시도하십시오.

$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);
1
Shraddha Vadnere

흥미롭게도 Postman 은 POST는 다음 두 가지 추가 옵션을 사용하는 완전한 GET 작업입니다.

curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, '');

또 다른 방법이며 매우 잘 작동합니다.

0
Klompenrunner