2009-06-26 117 views
112

我想知道是否可以通过java.net.HttpURLConnection发送PUT,DELETE请求(实际上)到基于HTTP的URL。如何在HttpURLConnection中发送PUT,DELETE HTTP请求?

我已经阅读了很多文章描述如何发送GET,POST,TRACE,OPTIONS请求,但是我仍然没有找到任何成功执行PUT和DELETE请求的示例代码。

+2

您能告诉我们您尝试使用的代码吗? – akarnokd 2009-06-26 20:07:54

回答

1

我会推荐Apache HTTPClient。

+9

你为什么会推荐HTTPClient?它超大。我的意思是 - 大小。 – jayarjo 2011-03-01 17:48:00

+1

@jayarjo,它是Android SDK的一部分。 – Zamel 2011-08-30 12:31:56

+9

@Zamel:Android在哪里输入图片? – talonx 2012-01-24 08:28:12

150

要执行HTTP PUT:

URL url = new URL("http://www.example.com/resource"); 
HttpURLConnection httpCon = (HttpURLConnection) url.openConnection(); 
httpCon.setDoOutput(true); 
httpCon.setRequestMethod("PUT"); 
OutputStreamWriter out = new OutputStreamWriter(
    httpCon.getOutputStream()); 
out.write("Resource content"); 
out.close(); 
httpCon.getInputStream(); 

要执行HTTP DELETE:

URL url = new URL("http://www.example.com/resource"); 
HttpURLConnection httpCon = (HttpURLConnection) url.openConnection(); 
httpCon.setDoOutput(true); 
httpCon.setRequestProperty(
    "Content-Type", "application/x-www-form-urlencoded"); 
httpCon.setRequestMethod("DELETE"); 
httpCon.connect(); 
19

这是如何活像ked对我来说:

HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
connection.setRequestMethod("DELETE"); 
int responseCode = connection.getResponseCode(); 
3

UrlConnection是一个尴尬的API工作。 HttpClient是目前为止最好的API,它可以让你免除时间寻找如何完成某些东西,比如这个stackoverflow问题。我在几个REST客户端中使用jdk HttpUrlConnection后写这个。 此外,当涉及到可伸缩性功能(如线程池,连接池等)时,HttpClient更优越

7

我同意@adietisheim和其他人的建议HttpClient。

我花了很多时间尝试使用HttpURLConnection进行一个简单的调用来休息服务,它并没有让我相信我,之后我尝试了使用HttpClient,它确实更容易,更易于理解和更好。

的代码示例,使认沽HTTP调用如下:

DefaultHttpClient httpClient = new DefaultHttpClient(); 

HttpPut putRequest = new HttpPut(URI); 

StringEntity input = new StringEntity(XML); 
input.setContentType(CONTENT_TYPE); 

putRequest.setEntity(input); 
HttpResponse response = httpClient.execute(putRequest); 
在你的代码
7
public HttpURLConnection getHttpConnection(String url, String type){ 
     URL uri = null; 
     HttpURLConnection con = null; 
     try{ 
      uri = new URL(url); 
      con = (HttpURLConnection) uri.openConnection(); 
      con.setRequestMethod(type); //type: POST, PUT, DELETE, GET 
      con.setDoOutput(true); 
      con.setDoInput(true); 
      con.setConnectTimeout(60000); //60 secs 
      con.setReadTimeout(60000); //60 secs 
      con.setRequestProperty("Accept-Encoding", "Your Encoding"); 
      con.setRequestProperty("Content-Type", "Your Encoding"); 
     }catch(Exception e){ 
      logger.info("connection i/o failed"); 
     } 
     return con; 
} 

然后:

public void yourmethod(String url, String type, String reqbody){ 
    HttpURLConnection con = null; 
    String result = null; 
    try { 
     con = conUtil.getHttpConnection(url , type); 
    //you can add any request body here if you want to post 
     if(reqbody != null){ 
       con.setDoInput(true); 
       con.setDoOutput(true); 
       DataOutputStream out = new DataOutputStream(con.getOutputStream()); 
       out.writeBytes(reqbody); 
       out.flush(); 
       out.close(); 
      } 
     con.connect(); 
     BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); 
     String temp = null; 
     StringBuilder sb = new StringBuilder(); 
     while((temp = in.readLine()) != null){ 
      sb.append(temp).append(" "); 
     } 
     result = sb.toString(); 
     in.close(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     logger.error(e.getMessage()); 
    } 
//result is the response you get from the remote side 
} 
3

对于做正确的HTML看跌期权,你会必须用try/catch围绕它:

try { 
    url = new URL("http://www.example.com/resource"); 
    HttpURLConnection httpCon = (HttpURLConnection) url.openConnection(); 
    httpCon.setDoOutput(true); 
    httpCon.setRequestMethod("PUT"); 
    OutputStreamWriter out = new OutputStreamWriter(
     httpCon.getOutputStream()); 
    out.write("Resource content"); 
    out.close(); 
    httpCon.getInputStream(); 
} catch (MalformedURLException e) { 
    e.printStackTrace(); 
} catch (ProtocolException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
0

甚至可以选择其他模板:

String payload = "<?xml version=\"1.0\" encoding=\"UTF-8\"?<CourierServiceabilityRequest>...."; 
    RestTemplate rest = new RestTemplate(); 

    HttpHeaders headers = new HttpHeaders(); 
    headers.add("Content-Type", "application/xml"); 
    headers.add("Accept", "*/*"); 
    HttpEntity<String> requestEntity = new HttpEntity<String>(payload, headers); 
    ResponseEntity<String> responseEntity = 
      rest.exchange(url, HttpMethod.PUT, requestEntity, String.class); 

    responseEntity.getBody().toString(); 
相关问题