如何在HttpURLConnection中发送PUT,DELETE HTTP请求?

Mat*_*rix 131 java put httpurlconnection http-delete

我想知道是否可以将PUT,DELETE请求(实际上)发送java.net.HttpURLConnection到基于HTTP的URL.

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

Mat*_*och 173

要执行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();
Run Code Online (Sandbox Code Playgroud)

要执行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();
Run Code Online (Sandbox Code Playgroud)

  • 在上面的示例中,我认为您需要在最后调用httpConget.getInputStream()以使请求实际发送. (7认同)
  • 你好,我在'删除'时遇到了麻烦.当我在这里运行此代码时,没有任何实际发生,请求不会被发送.同样的情况是当我做`post`请求时,但我可以使用例如`httpCon.getContent()`来触发请求.但是`httpCon.connect()`在我的机器中没有触发任何东西:-) (5认同)
  • 我得到"java.net.ProtocolException:DELETE不支持写" (3认同)

小智 24

这是它对我有用的方式:

HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("DELETE");
int responseCode = connection.getResponseCode();
Run Code Online (Sandbox Code Playgroud)


小智 11

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;
}
Run Code Online (Sandbox Code Playgroud)

然后在你的代码中:

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
}
Run Code Online (Sandbox Code Playgroud)


小智 8

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

我花了很多时间尝试使用HttpURLConnection进行简单的休息服务,并且它没有说服我,之后我尝试使用HttpClient,它真的更容易,可以理解和更好.

进行put 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);
Run Code Online (Sandbox Code Playgroud)