>백엔드 개발 >PHP 튜토리얼 >PHP 컬 기능을 사용하여 Post 요청을 보낼 때 주의사항에 대한 자세한 설명

PHP 컬 기능을 사용하여 Post 요청을 보낼 때 주의사항에 대한 자세한 설명

黄舟
黄舟원래의
2017-03-22 10:20:221735검색

서문
며칠 전 직장에서 사용자가 특정 버튼을 클릭하면 백그라운드에서 게시물 요청이 시작되고 전달된 데이터를 수락하는 요구 사항이 발생했습니다. . 처음에는 동료가 회사 프레임워크에서 공개적으로 캡슐화한

http_request()

메서드를 사용하여 보냈습니다. 코드는 다음과 같습니다.

public function http_request( $url, $post = '', $timeout = 5 ){ 
 if( empty( $url ) ){
  return ;
 }
 $ch = curl_init();
 curl_setopt($ch, CURLOPT_URL, $url);
 curl_setopt($ch, CURLOPT_HEADER, 0);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
 
 if( $post != '' && !empty( $post ) ){
  curl_setopt($ch, CURLOPT_POST, 1);
  curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
  curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'Content-Length: ' . strlen($post)));
 }
 curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
 $result = curl_exec($ch);
 curl_close($ch);
 return $result;
 }

처음에는 전달된 데이터가

application/json
.

인코딩된 json 문자열인 경우

application/x-www-form-urlencoded

인코딩 형식을 허용하는 데이터 메서드를 직접 사용하여 전달된 데이터를 백그라운드에서 가져옵니다(즉,

$_POST

얻는 방법), 물론 아무것도 얻지 못했습니다. 나중에 내 동료가

http_request()

메서드를 직접 변경하고

application/x-www-form-urlencoded

인코딩 형식으로 데이터를 직접 전달했습니다. 저는 아무런 변경도 하지 않았습니다.

위 질문에 대해서는 왜 그 당시에는 데이터를 전달받지 못했는지 항상 궁금했습니다.

오늘 프로젝트가 기본적으로 완료되었으며 다음 사항이 연구되었습니다.

php의

curl()

함수가 post 요청을 하면 데이터 형식을 다음과 같은 방법으로 전달할 수 있습니다.

(1): Spliced ​​매개변수별 결과

key=>value

키-값 쌍 문자열입니다. 형식은 다음과 같습니다.

name=xxx&age=23$sex=1

이러한 요청 매개변수는 기본적으로

application/x-www-form-urlencoded

에 따라 인코딩됩니다.
(2):

key=>value

매개변수로 구성된 키-값 쌍의 배열(1차원 배열만 가능하며 고차원 배열은 오류를 보고합니다).

의 형식은 다음과 같습니다.

[ name="xxx" , age = 23 , sex = 男 ]

이 요청 매개변수는 기본적으로

multipart/form-data

형식으로 인코딩됩니다.

위에서 언급했듯이

curl()

는 post 요청 시 1차원 배열만 매개변수로 전달할 수 있는데, 다차원 배열을 전달하려면 어떻게 해야 할까요?

대처 방법은 2가지가 있는데, 아래의 3번 방법과 4번 방법입니다.

(3):

http_build_query()

를 사용하여 다차원 배열을 처리하고 key=>value 형식의 문자열을 기다립니다.

아래와 같이:

$data = [
          "msg"=>"这是一条测试数据",
          "xxx" => "yyyy",
          "msg_data" => [
                          "name"=>"sunms",
                          "age"=>23,
                          "sex"=>"男",
                          "content"=>[
                                 1,2,3
                                ]
                       ],
       ];



는 다음 문자열을 가져옵니다.

msg=这是一条测试数据&xxx=yyyy&msg_data[name]=sunms&msg_data[age]=23&msg_data[sex]=男&msg_data[content][0]=1&msg_data[content][1]=2&msg_data[content][2]=3

이 방법은

application/x-www-form-urlencoded进

라인을 통해서도 인코딩되며 수신측에서 $_POST를 통해 직접 얻을 수 있습니다.

(4): 다차원 배열을 json 형식의 문자열로 변환하고

application/json

형식으로 문자열을 인코딩한 후

file_get_contents(“php://input”)

또는

를 전달합니다. 수신측
$GLOBALS[‘HTTP_RAW_POST_DATA']

메서드를 사용하여 전달된 json 형식 문자열을 얻은 다음 처리를 위해 json 형식 문자열을 배열로 변환합니다.

$data = [];
$data_string = json_encode($data);
.....
//设置header信息
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
               'Content-Type: application/json',
               'Content-Length: ' . strlen($data_string))
      );


참고:

application/json

형식으로 인코딩된 데이터의 경우

$_POST

를 직접 가져올 수 없습니다.

file_get_contents(“php://input”)

또는

$GLOBALS[‘HTTP_RAW_POST_DATA']

를 통해 얻어야 합니다.

요약
위는 PHP에서 Post 요청을 보내기 위해 컬 기능을 사용할 때 주의사항에 대한 자세한 설명입니다. 자세한 내용은 PHP 중국어 홈페이지를 참고해주세요. (www.php.cn)!

관련 기사:

PHP가 컬을 사용하여 가져오기 요청을 시작할 때 URL 매개변수 문제

PHP에서 컬을 사용하여 요청 보내기(GET 요청 및 POST 요청)

PHP 개발 기술(8) - CURL 요청 코드 세부 정보

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.