3

我目前正在实现一个 RESTful Web 服务,它使用CodeIgniterPhil Sturgeon的 REST 来讨论 XML 。我现在被困在如何从 HTTP PUT 读取 XML。这就是我所做的。

在客户端:

$(function(){
    // Bind a click event to the 'ajax' object id
    $("#new_user").click(function(evt){
        // JavaScript needs totake over. So stop the browser from redirecting the page
        evt.preventDefault();
        var str = '<?xml version="1.0" encoding="UTF-8"?><xml><name>'+$("#txtname").val()+'</name><email>'+$("#txtemail").val()+'</email></xml>';

        // Ajax request to get the data
        $.ajax({
            // URL from the link that was clicked on
            url: $(this).attr("href"),
                        type: "put",
                        contentType: "application/xml",
                        processData: false,
                        data: str,
            success: function(data, textStatus, jqXHR){
                //alert('Successful AJAX request!');
                                   //var items = parseXml(data);
                                   //printXml(items);
            },
            // Failed to load request. This could be caused by any number of problems like server issues, bad links, etc.
            error: function(jqXHR, textStatus, errorThrown){
                alert('Oh no! A problem with the Ajax request!');
            }
        });
    });
});

在服务器端:

public function users_put(){
    $input = file_get_contents('php://input');
    print_r($input);
}

它什么也没打印出来。上面的 JavaScript 代码和函数在 HTTP POST 中运行良好。

4

2 回答 2

2

该手册对此有很好的参考:http: //php.net/manual/en/features.file-upload.put-method.php

如果不更改 HTTP 守护程序的设置,您将无法处理 PUT 请求。


如果您使用的是 Apache 并且可以访问 mod_rewrite,请在您放入的根文件夹中创建一个 .htaccess 文件,其中包含以下内容:

    Options +FollowSymLinks
    RewriteEngine on
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ handler.php?uri=$1 [L,QSA]

但细节取决于您使用的 HTTP 守护程序(Apache、IIS、lighttpd 等)以及您使用的 PHP 框架。

于 2011-07-25T08:52:28.730 回答
0

使用 POST。您的应用程序必须确定请求是否为“PUT”。如果您指定要修改的对象的 id,那么您可以假设它是一个“PUT”请求。我不确定 CodeIgniter 是如何处理这个问题的,但我知道 Zend 框架会在指定 id 时自动路由到 putAction。(例如 /account/5)

于 2011-07-28T18:25:47.923 回答