source

PHP에서 PUT/DELETE 인수 처리

manysource 2022. 11. 4. 23:33

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 요청 인수를 읽는 간단한 클래스를 만들었습니다.이것도 채워집니다.$_REQUESTPUT/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를 모방하기 위해 사용할 수 있는 표기법은 두 가지가 있습니다.

  1. POST를 재정의하는 커스텀 POST 변수(예: _METOD=PUT)를 사용합니다.
  2. 커스텀 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&param2=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