Có cách giải thích khác nhau trong câu hỏi liệu nội dung có được phép hay không trong yêu cầu HTTP DELETE
. Xem ví dụ this. Trong các HTTP 1.1 specification nó không phải là nghiêm cấm. Theo ý kiến của tôi, bạn không được sử dụng nội dung trong HTTP DELETE
.
Nevertherless Tôi nghĩ rằng bạn nên sử dụng URL như mysite/myobject/objectId
(shop.com/order/1234
) nơi objectId
(một phần của url) là những thông tin bổ sung. Thay vào đó, bạn có thể sử dụng các thông số URL : mysite/myobject?objectName=table&color=red
để gửi thông tin bổ sung cho máy chủ trong yêu cầu HTTP DELETE
. Phần bắt đầu bằng '?' là các thông số urlencoded bị lệch dy '&'.
Nếu bạn muốn gửi thông tin phức tạp hơn, bạn có thể chuyển đổi các dữ liệu để JSON đối với DataContractJsonSerializer hoặc JavaScriptSerializer với và sau đó gửi dữ liệu chuyển đổi (một chuỗi mà tôi đặt tên myJsonData
sau) cũng như các thông số: mysite/myobject?objectInfo=myJsonData
.
Nếu bạn cần gửi quá nhiều dữ liệu bổ sung như một phần của yêu cầu HTTP DELETE
để bạn gặp sự cố với độ dài URL thì có thể bạn nên thay đổi thiết kế ứng dụng của mình tốt hơn.
CẬP NHẬT: Iy bạn muốn gửi một số cơ thể mỗi HTTP DELETE bạn có thể làm điều này ví dụ như sau
// 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
đầy đủ các mã có thể là một chút phức tạp hơn, nhưng điều này đã sẽ làm việc. Tuy nhiên tôi tiếp tục nói rằng dịch vụ Web cần thiết dữ liệu trong cơ thể của yêu cầu DELETE HTTP là xấu thiết kế.
Bạn đá dude! Cảm ơn bạn! –
Ugh! Điều này dường như không hoạt động với HttpURLConnection. Tôi nhận được "java.net.ProtocolException: DELETE không hỗ trợ viết". http://stackoverflow.com/questions/10338615/sending-http-delete-request-in-android –
Tôi với Scott ... làm cách nào để thực hiện việc này với HttpURLConnection? Tôi phải viết lại mã mạng của mình để sử dụng Apache HTTP? –