Существуют различные толкования в вопросе, разрешено ли тело в запросе HTTP DELETE
.См. this например.В спецификации HTTP 1.1 это явно не запрещено.По моему мнению, вы не должны использовать тело в HTTP DELETE
.
Тем не менее я думаю, что вы должны использовать URL-адрес, такой как mysite/myobject/objectId
(shop.com/order/1234
), где objectId
( часть url ) является дополнительной информацией.В качестве альтернативы вы можете использовать параметры URL : mysite/myobject?objectName=table&color=red
для отправки дополнительной информации на сервер в запросе HTTP DELETE
.Часть, начинающаяся с '?'это urlencoded параметры, разделенные dy '&'.
Если вы хотите отправить более сложную информацию, вы можете преобразовать данные в JSON с учетом DataContractJsonSerializer или JavaScriptSerializer , а затем отправьте преобразованные данные (строку, которую я позже назову myJsonData
) также в качестве параметра: mysite/myobject?objectInfo=myJsonData
.
Если вам необходимо отправить слишком много дополнительных данных в составеHTTP DELETE
запросите, чтобы у вас были проблемы с длиной URL, тогда вам, вероятно, лучше изменить дизайн вашего приложения.
ОБНОВЛЕНО : То есть вы действительно хотите отправить какое-то тело за HTTP УДАЛИТЬ васнапример, можно выполнить, например, следующий
// somewhere above add: using System.Net; and using System.IO;
WebClient myWebClient = new WebClient ();
// 1) version: do simple request
string t= myWebClient.UploadString ("http://www.examples.com/", "DELETE", "bla bla");
// will be send following:
//
// DELETE http://www.examples.com/ HTTP/1.1
// Host: www.examples.com
// Content-Length: 7
// Expect: 100-continue
// Connection: Keep-Alive
//
//bla bla
// 2) version do complex request
Stream stream = myWebClient.OpenWrite ("http://www.examples.com/", "DELETE");
string postData = "bla bla";
byte[] myDataAsBytes = Encoding.UTF8.GetBytes (postData);
stream.Write (myDataAsBytes, 0, myDataAsBytes.Length);
stream.Close (); // it send the data
// will be send following:
//
// DELETE http://www.examples.com/ HTTP/1.1
// Host: www.examples.com
// Content-Length: 7
// Expect: 100-continue
//
// bla bla
// 3) version
// create web request
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create ("http://www.examples.com/");
webRequest.Method = "DELETE";
webRequest.ServicePoint.Expect100Continue = false;
// post data
Stream requestStream = webRequest.GetRequestStream ();
StreamWriter requestWriter = new StreamWriter (requestStream);
requestWriter.Write (postData);
requestWriter.Close ();
//wait for server response
HttpWebResponse response = (HttpWebResponse)webRequest.GetResponse ();
// send following:
// DELETE http://www.examples.com/ HTTP/1.1
// Host: www.examples.com
// Content-Length: 7
// Connection: Keep-Alive
//
// bla bla
полный код может быть немного сложнее, но этот уже будет работать.Тем не менее, я продолжаю говорить, что веб-сервису нужны данные в теле HTTP-запроса DELETE, он плохо спроектирован.