PHP에서 PUT/DELETE 인수 처리
저는 CodeIgniter용 REST 클라이언트 라이브러리를 만들고 있는데 PHP에서 PUT 인수와 DELETE 인수를 보내는 방법을 고민하고 있습니다.
몇 군데에서 다음과 같은 옵션을 사용하는 사람들을 볼 수 있었습니다.
$this->option(CURLOPT_PUT, TRUE);
$this->option(CURLOPT_POSTFIELDS, $params);
짜증스럽게도, 이것은 아무 소용이 없는 것 같다.이것이 PUT 파라미터를 설정하는 올바른 방법입니까?
이 경우 DELETE 파라미터를 설정하려면 어떻게 해야 합니까?
$this->option()은 라이브러리의 일부입니다.이것은 단순히 CURLOPT_XX 상수 배열을 구축하여 curl_setopt_array()로 전송합니다.
다음 코드를 사용하여 PUT 및 DELETE 파라미터를 읽어보려고 합니다.
case 'put':
// Set up out PUT variables
parse_str(file_get_contents('php://input'), $this->_put_args);
break;
case 'delete':
// Set up out PUT variables
parse_str(file_get_contents('php://input'), $this->_delete_args);
break;
여기에는 두 가지 옵션이 있습니다.제가 잘못된 방법으로 접근하고 있거나 제 라이브러리 어딘가에 버그가 있습니다.이론적으로 이것이 효과가 있는지 알려주시면 제가 해결할 때까지 디버깅을 열심히 할 수 있습니다.
나는 근본적으로 잘못된 접근법에 더 이상 시간을 낭비하고 싶지 않다.
사용하는 대신CURLOPT_PUT = TRUE
사용하다CURLOPT_CUSTOMREQUEST = 'PUT'
그리고.CURLOPT_CUSTOMREQUEST = 'DELETE'
그럼 값을 설정하기만 하면 됩니다.CURLOPT_POSTFIELDS
.
다음은 PUT 및 DELETE 매개 변수를 처리하는 데 도움이 될 수 있는 코드입니다.설정할 수 있습니다.$_PUT
그리고.$_DELETE
경유로$GLOBALS[]
단, 선언하지 않는 한 기능에서 직접 액세스 할 수 없습니다.global
또는 를 통해 액세스 합니다.$GLOBALS[]
이를 피하기 위해 GET/POST/PUT/DELETE 요청 인수를 읽는 간단한 클래스를 만들었습니다.이것도 채워집니다.$_REQUEST
PUT/DELETE 매개 변수를 사용합니다.
이 클래스는 PUT/DELETE 파라미터를 해석하고 GET/POST도 지원합니다.
class Params {
private $params = Array();
public function __construct() {
$this->_parseParams();
}
/**
* @brief Lookup request params
* @param string $name Name of the argument to lookup
* @param mixed $default Default value to return if argument is missing
* @returns The value from the GET/POST/PUT/DELETE value, or $default if not set
*/
public function get($name, $default = null) {
if (isset($this->params[$name])) {
return $this->params[$name];
} else {
return $default;
}
}
private function _parseParams() {
$method = $_SERVER['REQUEST_METHOD'];
if ($method == "PUT" || $method == "DELETE") {
parse_str(file_get_contents('php://input'), $this->params);
$GLOBALS["_{$method}"] = $this->params;
// Add these request vars into _REQUEST, mimicing default behavior, PUT/DELETE will override existing COOKIE/GET vars
$_REQUEST = $this->params + $_REQUEST;
} else if ($method == "GET") {
$this->params = $_GET;
} else if ($method == "POST") {
$this->params = $_POST;
}
}
}
대부분의 웹 서버는 PUT & DELETE 요청을 처리하지 않습니다.도서관을 만들고 계시기 때문에, 회계 처리를 고려해 보는 것이 좋을 것 같습니다.일반적으로 POST를 통해 PUT과 DELETE를 모방하기 위해 사용할 수 있는 표기법은 두 가지가 있습니다.
- POST를 재정의하는 커스텀 POST 변수(예: _METOD=PUT)를 사용합니다.
- 커스텀 HTTP 헤더 설정(예: X-HTTP-Method-Override: PUT)
일반적으로 PUT & DELETE를 직접 지원하지 않는 대부분의 RESTful 서비스는 이러한 전략 중 적어도 하나를 지원합니다.필요에 따라 cURL을 사용하여 커스텀헤더를 설정할 수 있습니다.CURLOPT_HTTPHEADER
선택.
// ex...
curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-HTTP-Method-Override: PUT') );
PUT는 파일을 넣기 위한 것이고 POST는 변수를 올리기 위한 것이다(파일을 POST 할 수 있지만).
변수를 하려면 , 「」를 합니다.CURLOPT_POSTFIELDS
" " " 중 합니다.param1=val1¶m2=val2
또는 연관 배열입니다.
합니다.CURLOPT_CUSTOMREQUEST
이것은 CI용 DELETE 버전입니다.DELETE에 대한 GET 스타일의 인수(예: GET /some/url?id=1&id=2&id=3)를 받아들입니다.
protected function _parse_delete()
{
$query = $_SERVER['QUERY_STRING'];
if ( !empty( $query ) )
{
foreach( explode('&', $query ) as $param )
{
list($k, $v) = explode('=', $param);
$k = urldecode($k);
$v = urldecode($v);
if ( isset( $this->_delete_args[$k] ) )
{
if ( is_scalar( $this->_delete_args[$k] ) )
{
$this->_delete_args[$k] = array( $this->_delete_args[$k] );
}
$this->_delete_args[$k][] = $v ;
}
else
{
$this->_delete_args[$k] = $v;
}
}
}
}
DELETE 문제는 다음과 같습니다.
==> REST_Controller에 있습니다.php i는 delault_delete() 함수를 다음과 같이 바꿉니다.
protected function _parse_delete()
{
$this->_delete_args = $_DELETE;
$this->request->format and $this->request->body = file_get_contents('php://input');
// Set up out DELETE variables (which shouldn't really exist, but sssh!)
parse_str(file_get_contents('php://input'), $this->_delete_args);
}
나한텐 효과가 있어!
언급URL : https://stackoverflow.com/questions/2081894/handling-put-delete-arguments-in-php
'source' 카테고리의 다른 글
PHP에서 컬 타임아웃 설정 (0) | 2022.11.05 |
---|---|
MAMP에 포함된 MySQL에는 구성 파일이 포함되어 있지 않습니까? (0) | 2022.11.05 |
처음 실행된 스크립트의 절대 경로를 가져옵니다. (0) | 2022.11.04 |
MySQL SELECT 증분 카운터 (0) | 2022.11.04 |
그림에 호버링 주석을 추가하는 방법 (0) | 2022.11.04 |