【问题标题】:How do I use the PUT feature in REST如何在 REST 中使用 PUT 功能
【发布时间】:2013-01-30 15:38:35
【问题描述】:

使用这个 git-hub 库: http://github.com/philsturgeon/codeigniter-restserver 如何使用 PUT 功能保存数据?

example: example.com/put/some-data/some-data/...

【问题讨论】:

  • 使用 put 是一种不好的做法吗?
  • @Exploit - 使用 put 是一种非常糟糕的做法,大多数浏览器都不支持它
  • 我的目的是使用 curl 从外部网站发送数据到这个应用程序。那我会使用 POST 吗?如果是,我该怎么做?
  • 如果 API 使用 PUT,则不能使用 POST。而且我看不出浏览器不支持它有什么关系。

标签: php codeigniter


【解决方案1】:

您可以这样使用它:但要考虑到PUT 不太常用,大多数浏览器都不支持

function somename_put() 
        {  
            $data = array('somedata: '. $this->put('some-data'));  
            $this->response($data);  
        }  

【讨论】:

  • 谢谢,如何在浏览器中查看?我试过 mysite.com/index.php/example/user_put/somedata 但它不起作用
  • @Exploit - 你在获取数据吗?你在使用 cURL 吗?如果是这样$this->responce($data) 只是为了测试应该告诉你你是否以正确的方式工作。还是我误解了你的意思?
  • 顺便说一句,我正在通过一个表单将数据从一个外部网站发送到这个休息服务器。我会使用 PUT 还是 POST?
  • @Exploit - 使用帖子。这是一个很好的tutorial,可能会对您有所帮助。
  • 谢谢,我读到我不明白怎么做,如果你不介意你可以写一个例子然后如何通过浏览器进行测试
【解决方案2】:

您可以使用 ajax 请求来完成,例如

(假设使用 jQuery)

$.ajax({
    url: '/index.php/my_controller/somedata',
    type: 'PUT',
    success: function(result) {
        console.log(result);
    }
});

【讨论】:

  • 问题是如果您在浏览器中输入该网址,它将无法正常工作。作者正在进行某种路由,我在路由文件中没有看到设置。
  • 不,如果在地址栏中输入,浏览器会发出 GET 请求。您需要发出 PUT HTTP 请求。在浏览器中执行此操作的一种简单方法是使用 ajax 请求,但类型专门设置为 PUT。我相信 Phil Sturgeon 的 REST 库会查看发出的 HTTP 请求类型 (GET/POST/PUT/DELETE) 并路由到相关的控制器方法。
【解决方案3】:

据此(链接:https://github.com/philsturgeon/codeigniter-restserver/blob/master/application/libraries/REST_Controller.php#L915),$this->put 仅在将参数传递给它时才返回(因此有效:$username = $this->put('username'))。但是在REST_Controller 中,$this->_put_args 是受保护的,所以你将扩展这个类并可以像这样访问它:$params = $this->_put_args

简而言之(这只是一个例子,您可以根据需要进行改进);

<?php
// route: /api/users/123
class Users extends REST_Controller
{
    ...

    // update a user's data
    public function user_put() {
        $params = $this->_put_args;

        // you need sanitize input here, "db" is a pseudo
        $username = $db->escape($params['username']);
        $userpass = $db->escape($params['userpass']);

        $db->update(array(
            'username' => $username,
            'userpass' => $userpass
        ), (int) $params['id']);

        if (!$db->error) {
            // suppose right code should be 201 for PUT
            $this->response('Created', 201);
        } else {
            $this->response('Internal Server Error', 500);
        }
    }
}
?>

<script>
// Some ajax library
Ajax("/api/users/123", {
    method: "PUT",
    data: {username:"John", userpass:"new pass"},
    onSuccess: function(){ console.log("Success!"); }
    ...
});
</script>

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-15
  • 2020-05-07
  • 1970-01-01
  • 2011-03-03
  • 1970-01-01
  • 2020-04-24
  • 2016-09-03
相关资源
最近更新 更多