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