Home>Article>Backend Development> Things to note when using PHP curl function to send Post requests

Things to note when using PHP curl function to send Post requests

墨辰丷
墨辰丷 Original
2018-05-30 14:06:58 2691browse

This article mainly introduces to you some precautions for using the curl function to send Post requests in PHP. The article introduces it in detail through sample codes and explanations. It has certain reference value for everyone to learn or use PHP. Friends who need it can follow the editor to learn.

Preface

I encountered a requirement at work a few days ago. When the user clicks a button, a post request is initiated in the background. Come to me, I accept the data passed over. At first, my colleague sent the message using thehttp_request()method publically encapsulated by the company framework. The code is as follows:


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; }


At first I didn’t notice that the data passed was a json string encoded byapplication/json. I directly accepted theapplication/x-www-form-urlencodedencoding in the background. format data method to retrieve the passed data (that is, directly obtained using the$_POSTmethod), the result is of course nothing and nothing is retrieved. Later, my colleague directly changed thehttp_request()method and directly passed the data in theapplication/x-www-form-urlencodedencoding format, so I didn’t make any changes.

Regarding the above question, I have always wondered why I didn’t get the data passed at that time.

The project is basically completed today, and the following has been studied.

##curl()function in php When making a post request, the format of passing data can be in the following ways:

(1 ):

key=>valuekey-value pair string formed by concatenating parameters. The form is as follows:name=xxx&age=23$sex=1

This request parameter is encoded according to

application/x-www-form-urlencodedby default .

(2):

key=>valuekey-value pair array composed of parameters (can only be a one-dimensional array, higher-dimensional arrays will report an error).

The format is as follows:


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


##The request parameter defaults to

multipart/form- Encoded in data

format.As mentioned above,

curl()

When making a post request, only one-dimensional arrays can be passed as parameters. So what should be done if you want to pass multi-dimensional arrays?

There are two ways to deal with it, namely method 3 and method 4 below.

(3): Process the multi-dimensional array with

http_build_query()

and wait for a string in key=>value key-value pair format.As shown below:

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

##The following string will be obtained:

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


This method is also coded through
application/x-www-form-urlencoded. The receiver can pass $_POST Get it directly.

(4): Convert the multi-dimensional array into a string in json format, encode the string inapplication/jsonformat, and pass

file_get_contents(“php:/ /input”)

or$GLOBALS['HTTP_RAW_POST_DATA']to obtain the passed json format string, and then convert the json format string into an array for processing.

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



Note:

Forapplication/jsonformat The encoded data,$_POSTcannot be obtained directly, it needs to be obtained throughfile_get_contents("php://input")or$GLOBALS['HTTP_RAW_POST_DATA']way to obtain.The above is the entire content of this article, I hope it will be helpful to everyone's study.

Related recommendations:


php

Implementation method of loop traversal of one-dimensional array

How PHP and MYSQL implement paging navigation ideas

##php
array_reverse Detailed explanation of returning an array in reverse order


The above is the detailed content of Things to note when using PHP curl function to send Post requests. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn