对于HttpPut和HttpPost,我调用setEntity方法并传递我的JSON。对于HttpDelete似乎没有这样的方法。
如果无法为HttpDelete对象设置消息体,请链接到使用HttpDelete的超类的资源,以便我可以设置方法(删除)并设置消息体。我知道这不是理想的,但此时我无法更改Web服务。
您尝试过按以下方式覆盖HttpEntityEnclosingRequestBase
吗:
import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
import java.net.URI;
import org.apache.http.annotation.NotThreadSafe;
@NotThreadSafe
class HttpDeleteWithBody extends HttpEntityEnclosingRequestBase {
public static final String METHOD_NAME = "DELETE";
public String getMethod() { return METHOD_NAME; }
public HttpDeleteWithBody(final String uri) {
super();
setURI(URI.create(uri));
}
public HttpDeleteWithBody(final URI uri) {
super();
setURI(uri);
}
public HttpDeleteWithBody() { super(); }
}
这将创建一个类似于HttpDelete
的东西,它有一个setEntity
方法。 我认为这个抽象类已经几乎为您完成了所有工作,所以可能只需要这些。
顺便说一句,该代码基于谷歌找到的HttpPost
的源代码。
按照Walter Mudnt的建议,您可以使用以下代码。 它能够正常工作,我在测试REST webservice时创建了它。
try {
HttpEntity entity = new StringEntity(jsonArray.toString());
HttpClient httpClient = new DefaultHttpClient();
HttpDeleteWithBody httpDeleteWithBody = new HttpDeleteWithBody("http://10.17.1.72:8080/contacts");
httpDeleteWithBody.setEntity(entity);
HttpResponse response = httpClient.execute(httpDeleteWithBody);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
response.getStatusLine();
尽管如此,我认为您应该使用类似于mysite/myobject/objectId
(shop.com/order/1234
)的URL,其中objectId
(URL的一部分)是附加信息。作为替代方案,您可以使用URL参数:mysite/myobject?objectName=table&color=red
,以在HTTP DELETE
请求中向服务器发送附加信息。以'?'开头的部分是用'&'分隔的urlencoded参数。
如果要发送更复杂的信息,则可以使用DataContractJsonSerializer或JavaScriptSerializer将数据转换为JSON,然后将转换后的数据(我称之为myJsonData
)作为参数发送:mysite/myobject?objectInfo=myJsonData
。
如果您需要在HTTP DELETE
请求中发送太多附加数据,以至于URL长度成为问题,则最好更改应用程序的设计。
更新:如果您确实想要通过HTTP DELETE发送一些正文,可以按以下方式执行。
// 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
WebClient
、Stream
、StreamWriter
和HttpWebRequest
来自System.Net
和System.IO
(请参见我的代码第一行)。 - Oleg使用这个:
class MyDelete extends HttpPost{
public MyDelete(String url){
super(url);
}
@Override
public String getMethod() {
return "DELETE";
}
}
在Retrofit中
import okhttp3.Request;
private final class ApiInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request oldRequest = chain.request();
Request.Builder builder = oldRequest.newBuilder();
if(condition) {
return chain.proceed(builder.build().newBuilder().delete(builder.build().body()).build());
}
return chain.proceed(builder.build());
}
}
你必须通过某些方式触发条件,并且可能需要对url/header/body进行一些过滤以去除触发器,
除非删除的url/body/header足够独特,不会与post或get请求冲突。