Phi*_*eon 84 php rest curl codeigniter http-headers
我正在为CodeIgniter开发我的REST客户端库,我正在努力研究如何在PHP中发送PUT和DELETE参数.
在一些地方我见过人们使用这些选项:
$this->option(CURLOPT_PUT, TRUE);
$this->option(CURLOPT_POSTFIELDS, $params);
Run Code Online (Sandbox Code Playgroud)
令人讨厌的是,这似乎什么都不做.这是设置PUT参数的正确方法吗?
如果是这样,我该如何设置DELETE参数?
$ this-> option()是我库的一部分,它只是构建一个CURLOPT_XX常量数组,并在执行构建的cURL请求时将它们发送到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;
Run Code Online (Sandbox Code Playgroud)
这里有两个选项,我以错误的方式接近这个或者我的库中有一个错误.如果你能告诉我这是否理论上可行,我可以直接调试,直到我解决它.
我不想再浪费时间在一个根本错误的方法上.
Phi*_*eon 68
而不是使用CURLOPT_PUT = TRUE使用CURLOPT_CUSTOMREQUEST = 'PUT'
,CURLOPT_CUSTOMREQUEST = 'DELETE'然后只是设置值CURLOPT_POSTFIELDS.
Bry*_*ery 48
这里有一些代码可能对其他想要处理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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
Owe*_*wen 16
请记住,大多数Web服务器不处理PUT和DELETE请求.既然你正在建立一个图书馆,我建议你考虑解决这个问题.通常,您可以使用两种约定来通过POST模拟PUT和DELETE.
一般来说,大多数不允许直接使用PUT和DELETE的REST服务将至少支持其中一种策略.如果需要,可以使用cURL设置自定义标题CURLOPT_HTTPHEADER.
// ex...
curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-HTTP-Method-Override: PUT') );
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
72200 次 |
| 最近记录: |