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


132

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

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


2
您能告诉我们您尝试使用的代码吗?
akarnokd

Answers:


177

要执行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();

1
是。所有这些事情都是可能的,但实际上取决于您的邮件/博客提供商所支持的API。
马修·默多克

5
您好,我遇到了麻烦delete。当我按原样运行此代码时,什么也没有发生,因此不发送请求。同样的情况发生在我执行post请求时,但是在这里我可以使用例如httpCon.getContent()触发请求的方法。但是httpCon.connect()不会触发我的机器:-)
coubeatczech

7
在上面的示例中,我认为您需要在最后调用httpCon.getInputStream()才能使请求实际发送。
埃里克·史密斯

3
我得到了“ java.net.ProtocolException:DELETE不支持编写”
Kimo_do 2013年

1
@edisusanto命名资源(由URL指示)是将被删除的数据。
马修·默多克

24

这对我来说是这样的:

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

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;
}

然后在您的代码中:

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
}

获得“ java.io.IOException:不受支持的方法:放入” inJ2me SDK记录器
CodeToLife

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);

只是想对您说声谢谢。花了很多时间尝试使用我的代码HttpURLConnection来工作,但一直遇到一个奇怪的错误,特别是:cannot retry due to server authentication, in streaming mode。遵循您的建议对我有用。我意识到这并不能完全回答要使用的问题HttpURLConnection,但是您的回答对我有所帮助。
汤姆·卡图罗

@不建议使用HttpClientBuilder代替
WaldemarWosiński17年

3

UrlConnection是一个难以使用的API。到目前为止,HttpClient是更好的API,它将使您免于浪费时间搜索如何实现某些东西,例如stackoverflow问题完美地说明了这一点。我在几个REST客户端中使用了jdk HttpUrlConnection之后写了这篇文章。此外,在可伸缩性功能(例如线程池,连接池等)方面,HttpClient更为出色


3

为了正确地以HTML格式进行PUT,您必须使用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();
}

1

甚至Rest Template也是一个选择:

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();

这是我在SO上看到的最好的答案之一。
6


-1

我会推荐Apache HTTPClient。


9
为什么您会推荐HTTPClient?很大。我的意思是-大小。
jayarjo 2011年

1
@jayarjo,它是Android SDK的一部分。
Zamel 2011年

9
@Zamel:Android到底在哪里输入图片?
talonx 2012年

1
@talonx:我不知道。我的错。我被埋葬在Android开发中,因此感到困惑。
Zamel '02

3
当OP明确表示应使用HttpUrlConnection时,为什么要使用HttpClient?
知道不多,2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.