您如何进行HTTP Put?


68

我们拥有带有Web服务组件的软件。

现在,这个系统的管理员来找我,想通过使用webservices组件将数据导入到系统中。

因此,我去阅读了文档,试图弄清楚这件事,并且看到了这样的事情:


单击此处查看我在说什么(在Firefox,Chrome和Safari浏览器中效果最好)

该文档提供了使用HTTP动词(例如GET,POST,PUT,DELETE)与系统进行交互的示例。但是以我有限的经验,我从来没有发送过HTTP PUT或DELETE。

你怎么做呢?我建立了具有method =“ post”或method =“ get”的HTML表单,并将请求发送到action属性中指定的任何内容(action =“ someResource”)。但是我真的不知道该怎么做。

如果我不得不猜测,我将不得不构建一个应用程序,该应用程序创建某种HTTP Request对象并设置其所有属性,并以某种方式包括我要放入RESOURCE的数据(


我正在尝试使用REST术语,这对我来说是很新的
)。然后,我将使用我的编程语言发送请求,等等等等。我只是在猜测。请提供一些帮助!

我以为自己是一名Web开发人员,因为我了解诸如XHTML,CSS,JavaScript等之类的东西,但是开始看起来我对Web(HTTP)的基础一无所知。

编辑

PS:我主要使用.net进行编程。因此,.net中的任何示例都将非常出色。


6
我认为这些方法不会过时而被忽略。我认为POST通常用于执行原本不打算使用的功能。RESTful开发实践试图使用HTTP的设计使用方式。我对吗?REST对我来说是一个新概念。
罗尼·欧弗比

37
让我更明确地说一下。PUT和DELETE绝对不是过时的。浏览器确实使执行PUT和DELETE变得很困难,但是您始终可以使用javascript和XmlHttpRequest对象。
达雷尔·米勒

5
在WebDav中使用PUT和DELETE,但肯定不会过时。
PQW

9
PUT和DELTE是一个真正的RESTful API根本
尼克Katsivelos

2
@R。Bemrose:您的信誉> 23k,并且说PUT / DELETE已经过时了吗?到底是什么让你这么说?我可以说他们在www上已经有一段时间没有真正使用了,但是最近几天(由于XHR),它们越来越多。
罗伯特·科里特尼克

Answers:


23

这是一个使用HttpWebRequest的C#示例:

using System;
using System.IO;
using System.Net;

class Test
{
        static void Main()
        {
                string xml = "<xml>...</xml>";
                byte[] arr = System.Text.Encoding.UTF8.GetBytes(xml);
                HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://localhost/");
                request.Method = "PUT";
                request.ContentType = "text/xml";
                request.ContentLength = arr.Length;
                Stream dataStream = request.GetRequestStream();
                dataStream.Write(arr, 0, arr.Length);
                dataStream.Close();
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                string returnString = response.StatusCode.ToString();
                Console.WriteLine(returnString);
        }
}

更新:System.Net.Http中现在有一个HttpClient类(可作为NuGet包提供),这使此操作变得容易一些:

using System;
using System.Net.Http;

class Program
{
    static void Main()
    {
        var client = new HttpClient();
        var content = new StringContent("<xml>...</xml>");
        var response = client.PutAsync("http://localhost/", content).Result;
        Console.WriteLine(response.StatusCode);
    }
}

这看起来很有希望。我会尝试的。谢谢
罗尼·奥弗比2009年

HttpWebRequest不支持GET或POST以外的动词。将“方法”设置为“ PUT”将引发NotSupportedException(糟透了,我知道!)- msdn.microsoft.com/zh-cn/library/…–
user141682 2010年

8
@Luke仅在Silverlight上不支持PUT(您的链接是Silverlight文档)。上面的代码按其他方式运行。
杰森·德丰特斯

1
谢谢!我没有意识到这一点。从那以后,我从WCF Rest Toolkit中找到了HttpClient类,这太棒了。
user141682 2010年

现在是2018年,这仍然很重要,因为您制作的内容非常简单明了。我在想的是为什么我们使用client.PutAsync()而不是PutAsXmlAsync()
Mese

15

由于FORM标记仅支持GET和POST动词,而链接仅发出GET请求,因此PUT和DELETE可能需要使用AJAX并发出XMLHttpRequests。

使用jQuery:

 $.ajax( {
       url: '/controller/action',
       type: 'PUT',
       data: function() { ...package some data as XML },
       dataType: 'xml',
       ... more options...
 );

jQuery ajax选项页面上的注释警告说,某些浏览器不支持请求类型的PUT和DELETE。FWIW,我从未使用过PUT,但在IE和FF中使用过DELETE。尚未在Safari或Opera中进行测试。


我可能不会编写代码来解决此问题以在Web服务器/ Web浏览器上使用。可能,我将编写一个控制台/ Windows应用程序,该应用程序从数据库/电子表格读取数据,然后创建一些xml到PUT / POST / FART或HTTP请求中返回服务器的任何内容。我在这里提出问题的目的只是为了获得有关执行这些陌生动词的信息。哈哈哈哈
罗尼·奥弗比2009年

通过html表单访问rest api时,您总是可以拥有一个带有“方法”字段的隐藏字段
brndnmg

8

这是在CURL中执行的方法:如何使用cURL测试RESTful Rails

或者...您绝对可以使用HTML表单。如果该应用程序真正是RESTful的,它将理解REST操作,并且仅允许您根据使用的方法执行某些操作。


如果使用HTML表单(我只想尝试以进行教育/概念验证),如何将XML发送回服务器?
罗尼·欧弗比

在此处获取针对Windows的curl:curl.haxx.se/download.html(不要介意URL中令人生畏的haxx!)
cgp

看看tvanfosson的评论。它显示了提出PUT请求的好方法。然后应该返回XML ...?
托尼(Tony)

6

您不能使用HTML表单进行PUT(规范定义表单的GET / POST)。

但是,任何HTTP API都应允许您进行PUT,就像允许GET或POST一样。例如,这是Java HTTPClient文档,其中详细介绍了PUT和所有其他HTTP动词。

我不知道您使用的是哪种语言,但是我认为编写用于执行HTTP PUT的应用程序将变得非常简单。


6

我发现了这个非常酷的免费软件RESTClient

它使您可以使用各种动词与HTTP资源进行交互,手动设置标头和正文,设置身份验证信息,ssl,运行测试脚本等。

这将帮助我弄清楚如何与我们的“ Web服务”软件进行交互,该软件实际上只是该软件数据库的RESTful API。



1

是一个工具,可让您拖放到PUT文件


我对拖放文件以将其上传到服务器不感兴趣。我想使用HTTP put方法将xml发送到服务器。
罗尼·奥弗比

如果文件是XML,那么它就是这样做的。
义乌

1

“现在,这个系统的管理员来找我,想通过使用webservices组件将数据导入到系统中。”

Web服务与HTML表单无关。

Web服务请求要么通过Javascript(例如,作为Ajax)完成,要么通过您的应用程序完成。

您将编写一个C#或VB程序,该程序使用HTTP对具有给定数据集的给定Web服务URL进行放置。

例如,这里是一些示例VB代码:http : //developer.yahoo.com/dotnet/howto-rest_vb.html#post

用“ PUT”替换“ POST”的方法字符串。



0

出于各种原因,一些网络管理员对此一无所知。因此,您可能必须使用POST而不是PUT。检查您的操作。


这一切将在我们的局域网内发生。我不必担心它被阻止。
罗尼·奥弗比

1
一定喜欢网络管理员如何阻止合法的HTTP。我们可以让他们完全允许Ajax,这真是一个奇迹!
09年

0

PUT和DELETE不是HTML4的一部分,而是包含在HTML5规范中。因此,大多数流行的浏览器对HTML4都没有很好的支持。但是,它们绝对是HTTP的一部分并且一直存在。您可以使用某些非浏览器客户端或在支持HTML5的浏览器中使用表单来执行PUT。

更新:PUT和DELETE不再是HTML5表单的一部分。参见:http : //www.w3.org/TR/html5/association-of-controls-and-forms.html#attr-fs-method


1
HTML5也不再提供PUT和DELETE。
朱利安·雷施克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.