Как вы делаете HTTP Put?

У нас есть это программное обеспечение с компонентом веб-сервисов.

Теперь ко мне пришел администратор этой системы, желающий импортировать данные в систему с помощью компонента веб-сервисов.

Итак, я пошел читать документацию, чтобы попытаться понять это, и я вижу такие вещи:


Нажмите здесь, чтобы узнать, о чем я говорю (эта выглядит лучше всего в Firefox, Chrome и Safari)

В этой документации приведены примеры взаимодействия с системой с использованием HTTP-команд, таких как GET, POST, PUT, DELETE. Но по моему ограниченному опыту мне никогда не приходилось отправлять ни HTTP PUT, ни DELETE.

Как ты это делаешь? Я создал HTML-формы, которые имеют метод=post или метод=get, и запрос отправляется тому, что указано в атрибуте действия (action=someResource). Но я действительно не знаю, что делать с этой штукой PUT.

Если бы мне пришлось угадывать, мне пришлось бы создать приложение, которое создает какой-то объект HTTP-запроса, устанавливает все его свойства и каким-то образом включает данные, которые я хочу поместить в РЕСУРС (


Я пытаюсь использовать терминологию REST, что еще очень ново для меня
). Затем я отправлял запрос, используя свой язык программирования, и бла-бла-бла. Я просто спекулирую на этом. Пожалуйста, предложите помощь!

Я думал, что я веб-разработчик, так как я знаю такие вещи, как XHTML, CSS, JavaScript и т. д., но это начинает выглядеть так, будто я вообще ничего не знаю об основах Интернета (HTTP).

РЕДАКТИРОВАТЬ

PS: я программирую в основном с .net. Итак, любые примеры в .net были бы просто потрясающими.


person Ronnie Overby    schedule 01.05.2009    source источник
comment
В наши дни PUT и DELETE в основном устарели. PUT был заменен формами POST с кодировкой multipart/form-data и элементами управления вводом файлов. DELETE был в значительной степени заменен POST на сценарий с аргументами, указывающими, какие файлы нужно удалить.   -  person Powerlord    schedule 04.05.2009
comment
Я не думаю, что эти методы устарели настолько, насколько они игнорируются. Я считаю, что POST часто используется для того, для чего он не предназначен. Методы разработки RESTful стремятся использовать HTTP так, как он был разработан. Я прав в этом? REST для меня новая концепция.   -  person Ronnie Overby    schedule 05.05.2009
comment
Позвольте мне заявить об этом немного решительнее. PUT и DELETE определенно не устарели. Браузеры затрудняют выполнение PUT и DELETE, но вы всегда можете использовать javascript и объект XmlHttpRequest.   -  person Darrel Miller    schedule 07.05.2009
comment
PUT и DELETE используются, например, в WebDav, конечно, не устарели.   -  person PQW    schedule 09.06.2009
comment
PUT и DELTE являются фундаментальными для действительно RESTful API.   -  person Nick Katsivelos    schedule 03.12.2009
comment
@Р. Bemrose: У вас 23k репутации, а вы говорите, что PUT/DELETE устарели? Что в мире заставляет тебя так говорить? Я мог бы сказать, что какое-то время они действительно не использовались на www, но в наши дни их снова становится все больше и больше (из-за XHR).   -  person Robert Koritnik    schedule 10.02.2011
comment
Ах, старые добрые времена, когда я был новичком в HTTP.   -  person Ronnie Overby    schedule 11.12.2013


Ответы (11)


Вот пример C# с использованием HttpWebRequest:

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);
    }
}
person Jason DeFontes    schedule 01.05.2009
comment
Это выглядит очень многообещающе. Я попробую это. Спасибо - person Ronnie Overby; 02.05.2009
comment
HttpWebRequest не поддерживает команды, кроме GET или POST. Установка метода PUT вызовет исключение NotSupportedException (отстой, я знаю!) — msdn.microsoft.com/en-us/library/ - person user141682; 10.02.2010
comment
@Luke PUT не поддерживается только в Silverlight (ваша ссылка на документы Silverlight). Приведенный выше код работает так, как написано в противном случае. - person Jason DeFontes; 12.02.2010
comment
Благодарность! Я этого не понимал. С тех пор я нашел класс HttpClient из набора WCF Rest Toolkit, который является фантастическим. - person user141682; 18.02.2010
comment
Это 2018 год, это все еще актуально, потому что вы сделали это так легко + понятно. Я думал, почему мы используем client.PutAsync() вместо PutAsXmlAsync(). - person Mese; 23.03.2018

PUT и DELETE, скорее всего, потребуют, чтобы вы использовали AJAX и делали XMLHttpRequests, поскольку тег FORM поддерживает только глаголы GET и POST, а ссылки делают только запросы GET.

С jQuery:

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

Примечание на странице параметров jQuery ajax предупреждает, что некоторые браузеры не поддерживают PUT. и DELETE для типа запроса. FWIW, я никогда не использовал PUT, но использовал DELETE в IE и FF. Не проверял в Safari или Opera.

person tvanfosson    schedule 01.05.2009
comment
Я, скорее всего, не буду писать код для решения этой проблемы для использования на веб-сервере/веб-браузере. Скорее всего, я напишу консольное/Windows-приложение, которое считывает данные из базы данных/электронной таблицы, а затем создает некоторый xml для PUT/POST/FART или что-то еще обратно на сервер в HTTP-запросе. Цель моего вопроса здесь - просто получить некоторую информацию о выполнении этих незнакомых глаголов. ХАХАХАХА - person Ronnie Overby; 01.05.2009
comment
Вы всегда можете просто иметь скрытое поле со скрытым полем метода при доступе к вашему API-интерфейсу через HTML-форму. - person brndnmg; 23.11.2009

Вот как это сделать в CURL: Как использовать cURL для тестирования RESTful Rails

Или... вы определенно можете использовать HTML-форму. Если приложение действительно RESTful, оно будет понимать действия REST и позволит вам выполнять только определенные действия на основе используемого вами метода.

person Tony    schedule 01.05.2009
comment
Если вы используете HTML-форму (которую я хотел бы попробовать только для обучения/доказательства концепции), как мне отправить XML обратно на сервер? - person Ronnie Overby; 01.05.2009
comment
Получите curl для Windows здесь: curl.haxx.se/download.html (не обращайте внимания пугающий haxx в URL!) - person cgp; 01.05.2009
comment
Посмотрите на комментарий tvanfosson. Это показывает хороший способ сделать запрос PUT. И тогда XML надо возвращать...? - person Tony; 01.05.2009

Вы не можете PUT использовать HTML-форму (в спецификации указано только GET/POST для форм).

Однако любой HTTP API должен позволять вам PUT так же, как он позволяет вам GET или POST. Например, вот документация Java HTTPClient, в которой подробно описывается PUT наряду со всеми другие глаголы HTTP.

Я не знаю, какой язык вы используете, но я думаю, что написать приложение для выполнения HTTP PUT будет довольно тривиально.

person Brian Agnew    schedule 01.05.2009

Я нашел действительно классную бесплатную программу под названием RESTClient.

Он позволяет вам взаимодействовать с HTTP-ресурсами, используя различные глаголы, вручную устанавливая заголовки и тело, устанавливая информацию для аутентификации, ssl, запуская тестовые сценарии и т. д.

Это поможет мне понять, как взаимодействовать с нашим программным обеспечением «веб-сервисов», которое на самом деле является просто RESTful API для базы данных программного обеспечения.

person Ronnie Overby    schedule 04.05.2009


Вот инструмент, позволяющий перетаскивать файлы PUT

person Yishai    schedule 01.05.2009
comment
Меня не интересует перетаскивание файлов для загрузки на сервер. Я хочу использовать метод HTTP put для отправки xml на сервер. - person Ronnie Overby; 01.05.2009
comment
Если бы файл был в формате XML, он бы сделал именно это. - person Yishai; 01.05.2009

«Теперь ко мне обратился администратор этой системы, который хочет импортировать данные в систему с помощью компонента веб-сервисов».

Веб-сервисы имеют мало общего с HTML-формами.

Запросы веб-сервисов выполняются либо из Javascript (например, как Ajax), либо из ваших прикладных программ.

Вы бы написали программу на C# или VB, которая использовала бы HTTP для выполнения запроса Put на указанный URL-адрес веб-службы с заданным набором данных.

Вот, например, пример кода VB: http://developer.yahoo.com/dotnet/howto-rest_vb.html#post

Замените строку метода «POST» на «PUT».

person S.Lott    schedule 01.05.2009

Как насчет того, чтобы попробовать libcurl.NET: http://sourceforge.net/projects/libcurl-net/

person user141682    schedule 10.02.2010

Просто хедз-ап некоторые сетевые админы блокируют по разным причинам. Поэтому вам, возможно, придется использовать POST вместо PUT. Проверьте с вашими операциями.

person Srikar Doddi    schedule 01.05.2009
comment
Все это будет происходить внутри нашей локальной сети. Мне не придется беспокоиться о том, что его заблокируют. - person Ronnie Overby; 01.05.2009
comment
Должен любить, как сетевые администраторы блокируют законный HTTP. Удивительно, как мы вообще можем заставить их разрешить использование Ajax! - person runako; 01.05.2009

PUT и DELETE не являются частью HTML4, но включены в спецификации HTML5. По этой причине большинство популярных браузеров не имеют для них хорошей поддержки, поскольку они ориентированы на HTML4. Однако они определенно являются частью HTTP и всегда им были. Вы выполняете PUT, используя какой-либо клиент, не являющийся браузером, или используя форму в браузере с поддержкой HTML5.

Обновление: PUT и DELETE больше не являются частью HTML5 для форм. См.: http://www.w3.org/TR/html5/association-of-controls-and-forms.html#attr-fs-method

person aehlke    schedule 20.07.2009
comment
PUT и DELETE больше не используются в HTML5. - person Julian Reschke; 11.03.2011