누구든지 HTTP POST로 PHP curl을 수행하는 방법을 보여줄 수 있습니까?
다음과 같은 데이터를 보내려고합니다.
username=user1, password=passuser1, gender=1
에 www.domain.com
컬이와 같은 응답을 반환 할 것으로 기대합니다 result=OK
. 예가 있습니까?
답변
<?php
//
// A very simple PHP example that sends a HTTP POST to a remote site
//
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"http://www.example.com/tester.phtml");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,
"postvar1=value1&postvar2=value2&postvar3=value3");
// In real life you should use something like:
// curl_setopt($ch, CURLOPT_POSTFIELDS,
// http_build_query(array('postvar1' => 'value1')));
// Receive server response ...
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$server_output = curl_exec($ch);
curl_close ($ch);
// Further processing ...
if ($server_output == "OK") { ... } else { ... }
?>
답변
절차 적
// set post fields
$post = [
'username' => 'user1',
'password' => 'passuser1',
'gender' => 1,
];
$ch = curl_init('http://www.example.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
// execute!
$response = curl_exec($ch);
// close the connection, release resources used
curl_close($ch);
// do anything you want with your response
var_dump($response);
객체 지향
<?php
// mutatis mutandis
namespace MyApp\Http;
class CurlPost
{
private $url;
private $options;
/**
* @param string $url Request URL
* @param array $options cURL options
*/
public function __construct($url, array $options = [])
{
$this->url = $url;
$this->options = $options;
}
/**
* Get the response
* @return string
* @throws \RuntimeException On cURL error
*/
public function __invoke(array $post)
{
$ch = curl_init($this->url);
foreach ($this->options as $key => $val) {
curl_setopt($ch, $key, $val);
}
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
$response = curl_exec($ch);
$error = curl_error($ch);
$errno = curl_errno($ch);
if (is_resource($ch)) {
curl_close($ch);
}
if (0 !== $errno) {
throw new \RuntimeException($error, $errno);
}
return $response;
}
}
용법
// create curl object
$curl = new \MyApp\Http\CurlPost('http://www.example.com');
try {
// execute the request
echo $curl([
'username' => 'user1',
'password' => 'passuser1',
'gender' => 1,
]);
} catch (\RuntimeException $ex) {
// catch errors
die(sprintf('Http error %s with code %d', $ex->getMessage(), $ex->getCode()));
}
여기에서 참고 사항 : AdapterInterface
예를 들어 getResponse()
메소드로 호출되는 인터페이스를 작성하고 위의 클래스가 구현하도록하는 것이 가장 좋습니다 . 그런 다음 응용 프로그램에 아무런 부작용없이 항상이 구현을 원하는 다른 어댑터로 바꿀 수 있습니다.
HTTPS 사용 / 트래픽 암호화
일반적으로 Windows 운영 체제에서 PHP의 cURL에 문제가 있습니다. https로 보호 된 엔드 포인트에 연결하려고 할 때 오류 메시지가 표시 certificate verify failed
됩니다.
대부분의 사람들이 여기서하는 일은 cURL 라이브러리에 단순히 인증서 오류를 무시하고 계속하도록 지시하는 것입니다 ( curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
). 이렇게하면 코드가 작동하므로 악의적 인 사용자가 Man In The Middle 공격 등과 같은 다양한 공격을 앱에서 수행 할 수 있습니다 .
절대로 그렇게하지 마십시오. 대신, 당신은 단순히 당신을 수정 php.ini
하고 CA Certificate
파일이 인증서를 올바르게 확인할 수 있도록 PHP 에게 알려 주면됩니다 :
; modify the absolute path to the cacert.pem file
curl.cainfo=c:\php\cacert.pem
cacert.pem
인터넷에서 최신 버전 을 다운로드하거나 즐겨 찾는 브라우저에서 추출 할 수 있습니다 . php.ini
관련 설정을 변경할 때는 웹 서버를 다시 시작해야합니다.
답변
php curl_exec를 사용하여 HTTP 게시를 수행하는 실제 예 :
이것을 foobar.php라는 파일에 넣으십시오.
<?php
$ch = curl_init();
$skipper = "luxury assault recreational vehicle";
$fields = array( 'penguins'=>$skipper, 'bestpony'=>'rainbowdash');
$postvars = '';
foreach($fields as $key=>$value) {
$postvars .= $key . "=" . $value . "&";
}
$url = "http://www.google.com";
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POST, 1); //0 for a get request
curl_setopt($ch,CURLOPT_POSTFIELDS,$postvars);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT ,3);
curl_setopt($ch,CURLOPT_TIMEOUT, 20);
$response = curl_exec($ch);
print "curl response is:" . $response;
curl_close ($ch);
?>
그런 다음 명령으로 실행하면 php foobar.php
이런 종류의 출력을 화면에 덤프합니다.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Title</title>
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">
<body>
A mountain of content...
</body>
</html>
www.google.com에 PHP POST를 수행하여 데이터를 보냈습니다.
서버가 사후 변수를 읽도록 프로그래밍 된 경우,이를 기반으로 다른 작업을 수행 할 수 있습니다.
답변
다음과 같이 쉽게 도달 할 수 있습니다.
<?php
$post = [
'username' => 'user1',
'password' => 'passuser1',
'gender' => 1,
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.domain.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));
$response = curl_exec($ch);
var_export($response);
답변
컬 포스트 + 오류 처리 + 헤더 설정 [@ mantas-d 덕분에] :
function curlPost($url, $data=NULL, $headers = NULL) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
if(!empty($data)){
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
}
if (!empty($headers)) {
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
}
$response = curl_exec($ch);
if (curl_error($ch)) {
trigger_error('Curl Error:' . curl_error($ch));
}
curl_close($ch);
return $response;
}
curlPost('google.com', [
'username' => 'admin',
'password' => '12345',
]);
답변
curlPost('google.com', [
'username' => 'admin',
'password' => '12345',
]);
function curlPost($url, $data) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$response = curl_exec($ch);
$error = curl_error($ch);
curl_close($ch);
if ($error !== '') {
throw new \Exception($error);
}
return $response;
}
답변
양식이 리디렉션, 인증, 쿠키, SSL (https) 또는 POST 변수를 예상하는 완전히 열린 스크립트 이외의 것을 사용하는 경우 치아를 빨리 gn 기 시작할 것입니다. Snoopy를 살펴보면 , 많은 오버 헤드를 설정할 필요없이 정확히 생각하고있는 것을 수행 할 수 있습니다.