CURLOPT_POSTFIELDS에 대한 curl POST 형식


99

내가 사용하는 경우 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);

답변:


100

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

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

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

13
기본 구분 기호 http_build_query($data)이므로 사용할 수 있습니다 &.
null 허용

6
물론 건너 뛸 수 있습니다. 이것은 특정 요구에 맞게 변경할 수 있거나 변경하지 않을 수있는 다른 두 인수 (예 : 기본 구분 기호)를 설명하기위한 것입니다.
kodeart 2014

62

편집 : 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 이전 :

로부터 수동 :

CURLOPT_POSTFIELDS

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

11
배열을 전달할 수 있다면 왜 문자열을 전달하겠습니까 ...?
ThiefMaster 2011 년

1
나는 $ 키 데이터가 최종 사용자에 의해 주어진다 특히 경우 "이름 및 성"등처럼이 단지의 경우도 인코딩해야한다고 생각
마리우스 Balčytis

2
@barius, 동의합니다. 그리고 실제로는 http_build_query ()가 위에 정의 된 함수보다 낫다고 생각합니다.
skyfree

1
@skyfree 동의합니다! 그 기능은 PHP5에 추가 된 생각이었다 아직까지 표준에서 2011 년
Czechnology

1
배열을 전달할 수 있는데 왜 http_build_query가 필요한가요?
Offenso

39

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

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


16
배열을 전달하는 것은 문자열과 다른 Content-type이 될 것이므로 그렇게해야 할 좋은 이유가 있습니다. 그것을 알아내는 데 시간이 걸렸습니다.
Thomas Vander Stichele 2011

이유는 모르겠지만, win dev PC에서 어레이를 전달하는 데 약 1 초가 더 걸립니다 (배열을 사용 http_build_query()하는 1.029s 대 동일한 어레이를 사용 하는
0.016s

2
중첩 된 배열은 작동하지 않습니다. 컬은 문자열과 PHP 용으로 변환하려고합니다 문자열 변환에 배열 따를 것이다 통지
7ochem

5

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


4

의 경우 CURLOPT_POSTFIELDS매개 변수는 다음과 같이 urlencoded 문자열로 전달 para1=val1&para2=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);

2
안녕하세요 Shraddha, json_encode()유효한 매개 변수 문자열과는 first=John&last=Smith. json_encode()출력됩니다 : {"first":"John","last":"Smith"}그러면 POST 요청의 원시 본문이됩니다.
7ochem

1
@ 7ochem의 주석에 추가하려면 수신자가 do 대신 json 인코딩 문자열을 포함하는 단일 매개 변수를 기대하지 않는 한 . 그러면 "&"로 구분 된 매개 변수가 포함 된 예상 "URL 인코딩 문자열"이 생성됩니다. json_encode(...)http_build_query(...)
ToolmakerSteve 2019

4

여기에 아직 언급되지 않은 또 다른 주요 차이점은 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 공지 : ...에서 문자열로의 배열 변환 ...


4

그것은에 달려 있습니다 content-type

URL 인코딩 또는 다중 부분 / 양식 데이터

표준 방식으로 데이터를 보내려면 브라우저가 양식을 사용하는 것처럼 연관 배열을 전달하면됩니다 . PHP 매뉴얼에 명시된 바와 같이 :

이 매개 변수는 'para1 = val1 & para2 = val2 & ...'와 같은 urlencoded 문자열로 전달되거나 필드 이름이 키로, 필드 데이터가 값으로 포함 된 배열로 전달 될 수 있습니다. 값이 배열이면 Content-Type 헤더가 multipart / form-data로 설정됩니다.

JSON 인코딩

그럼에도 불구하고 JSON API와 통신 할 때 API가 POST 데이터를 이해하려면 콘텐츠가 JSON으로 인코딩되어야합니다.

이러한 경우 콘텐츠는 JSON으로 명시 적으로 인코딩되어야합니다.

CURLOPT_POSTFIELDS => json_encode(['param1' => $param1, 'param2' => $param2]),

JSON에서 통신 할 때, 우리는 또한 일반적으로 설정 acceptcontent-type헤더 따라 :

CURLOPT_HTTPHEADER => [
    'accept: application/json',
    'content-type: application/json'
]

2

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

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

0

흥미롭게도 Postman 이 POST를 수행하는 방식 은 다음 두 가지 추가 옵션이있는 완전한 GET 작업입니다.

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

다른 방법으로 아주 잘 작동합니다.


-3

이 대답은 저도 찾는 데 영원히 걸렸습니다. URL (파일 이름과 확장자 뒤의 '?')을 URL 인코딩 된 쿼리 문자열과 연결하기 만하면됩니다. POST cURL 옵션을 설정하지 않아도되는 것 같습니다. 아래 가짜 예를 참조하십시오.

//create URL
$exampleURL = 'http://www.example.com/example.php?';

// create curl resource
$ch = curl_init(); 

// build URL-encoded query string
$data = http_build_query(
    array('first' => 'John', 'last' => 'Smith', '&'); // set url
curl_setopt($ch, CURLOPT_URL, $exampleURL . $data); 

// return the transfer as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

// $output contains the output string
$output = curl_exec($ch); 

// close curl resource to free up system resources <br/>
curl_close($ch);

다음을 사용할 수도 있습니다 file_get_contents().

// read entire webpage file into a string
$output = file_get_contents($exampleURL . $data);

9
POST가 아닌 GET을 수행하는 것 같습니다.
grandnasty
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.