我正试图进行我对RESTful服务的第一次真正尝试 (我正在使用@ Phil-Sturgeon放在一起的codeigniter-restserver库。)
该服务适用于GET请求 另一方面,POST给我一个曲线球。使用空 POST阵列的尝试是成功的......所有其他人似乎都失败了。
CODE:
/*** sandbox ***/
...
$curl_handle = curl_init();
curl_setopt($curl_handle, CURLOPT_URL, 'http://localhost/project/api/companies');
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl_handle, CURLOPT_POST, 1);
// This works.
curl_setopt($curl_handle, CURLOPT_POSTFIELDS, array());
// This throws the error
//curl_setopt($curl_handle, CURLOPT_POSTFIELDS, array('chicken'=>'licken'));
$buffer = curl_exec($curl_handle);
curl_close($curl_handle);
var_export($buffer);
...
/*** RESTful controller ***/
...
function companies_post(){
$this->response('It Works!', 200);
} // end method: companies_post()
...
错误:
当我的CURLOPT_POSTFIELDS
数组是而非为空时,我得到:
遇到错误
不允许您请求的操作。
的目标:
我的直接目标只是简单地在响应中返回POST有效负载,这样我就可以证明往返工作正常。
但是,在这一点上,我只是能够在不抛出错误的情况下将任何的实质内容发布到API而不会产生错误:)
有人听说过这样的事吗? 我在这里缺少什么?
答案 0 :(得分:2)
我认为在REST应用程序的配置文件中,CSRF保护设置为TRUE
。您需要在curl POST请求数组中传递CSRF令牌名称和CSRF哈希作为其值,或者通过将其值更改为FALSE
$config['csrf_protection'] = FALSE;
答案 1 :(得分:1)
您也可以仅为api请求禁用csrf 示例:编辑config.php并将$ config ['csrf_protection']行更改为
$config['csrf_protection'] = TRUE;
if (isset($_SERVER["REQUEST_URI"])
&& stripos($_SERVER["REQUEST_URI"],'/api') !== FALSE) {
$config['csrf_protection'] = FALSE;
}
答案 2 :(得分:0)
CSRF是一个婊子。把它关掉:
$config['csrf_protection'] = FALSE;
在以后的版本中,您可以添加白名单IP /域,您的客户端将成为其中之一。