Làm cách nào để gửi yêu cầu PUT, XÓA HTTP trong HTTPURLCconnectection?


132

Tôi muốn biết liệu có thể gửi yêu cầu PUT, DELETE (thực tế) thông qua java.net.HttpURLConnectionURL dựa trên HTTP hay không.

Tôi đã đọc rất nhiều bài viết mô tả rằng làm thế nào để gửi các yêu cầu GET, POST, TRACE, OPTION nhưng tôi vẫn không tìm thấy bất kỳ mã mẫu nào thực hiện thành công các yêu cầu PUT và DELETE.


2
Bạn có thể chỉ cho chúng tôi mã bạn đã thử sử dụng không?
akarnokd

Câu trả lời:


177

Để thực hiện PUT HTTP:

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

Để thực hiện XÓA HTTP:

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
Đúng. Tất cả những điều này đều có thể nhưng thực sự phụ thuộc vào API được nhà cung cấp thư / blog của bạn hỗ trợ.
Matthew Murdoch

5
xin chào, tôi đang gặp rắc rối với delete. Khi tôi chạy mã này như ở đây, không có gì thực sự xảy ra, yêu cầu không được gửi. Tình huống tương tự là khi tôi đang thực hiện postcác yêu cầu, nhưng ở đó tôi có thể sử dụng ví dụ httpCon.getContent()kích hoạt yêu cầu đó. Nhưng httpCon.connect()không kích hoạt bất cứ thứ gì trong máy của tôi :-)
coubeatc817

7
Trong các ví dụ ở trên, tôi tin rằng bạn sẽ cần gọi httpCon.getInputStream () ở cuối để khiến yêu cầu thực sự được gửi.
Eric Smith

3
Tôi đã nhận được "java.net.ProtocolException: DELETE không hỗ trợ viết"
Kimo_do

1
@edisusanto tài nguyên được đặt tên (được biểu thị bằng URL) là dữ liệu sẽ bị xóa.
Matthew Murdoch

24

Đây là cách nó làm việc cho tôi:

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

Sau đó, trong mã của bạn:

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
}

Bắt 'java.io.IOException: phương thức không được hỗ trợ: đặt' logJ inJ2me sdk
CodeToLife

8

Tôi đồng ý với @adietisheim và những người còn lại đề xuất HTTPClient.

Tôi đã dành thời gian cố gắng thực hiện một cuộc gọi đơn giản để phục vụ dịch vụ với HTTPURLConnection và nó đã không thuyết phục tôi và sau đó tôi đã thử với HttpClient và nó thực sự dễ dàng, dễ hiểu và tốt đẹp hơn.

Một ví dụ về mã để thực hiện cuộc gọi http như sau:

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

Chỉ muốn nói cảm ơn vì điều này. Đã dành nhiều giờ cố gắng để sử dụng mã của tôi HttpURLConnectionđể làm việc, nhưng tiếp tục gặp phải một lỗi kỳ lạ, cụ thể là : cannot retry due to server authentication, in streaming mode. Làm theo lời khuyên của bạn làm việc cho tôi. Tôi nhận ra điều này không trả lời chính xác câu hỏi, yêu cầu sử dụng HttpURLConnection, nhưng câu trả lời của bạn đã giúp tôi.
Tom Catullo

@ Được khuyến khích sử dụng HttpClientBuilder
Waldemar Wosiński

3

UrlConnection là một API khó xử để làm việc. Cho đến nay, httpClient là API tốt hơn và nó sẽ giúp bạn không mất thời gian tìm kiếm cách đạt được những điều nhất định như câu hỏi stackoverflow này minh họa hoàn hảo. Tôi viết điều này sau khi đã sử dụng jdk HttpUrlConnection trong một số máy khách REST. Hơn nữa, khi nói đến các tính năng khả năng mở rộng (như luồng dữ liệu, nhóm kết nối, v.v.), httpClient là ưu việt


3

Để thực hiện PUT trong HTML chính xác, bạn sẽ phải bao quanh nó bằng thử / bắt:

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

Ngay cả Mẫu còn lại có thể là một tùy chọn:

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

Đây là một trong những câu trả lời hay nhất tôi từng thấy trên SO.
nối

0

Có một cách đơn giản để xóa và đặt yêu cầu, bạn chỉ cần thực hiện bằng cách thêm _methodtham số "" vào yêu cầu bài đăng của mình và viết " PUT" hoặc " DELETE" cho giá trị của nó!


-1

9
Tại sao bạn muốn giới thiệu HTTPClient? Nó rất lớn. Ý tôi là - về kích thước.
jayarjo

1
@jayarjo, Đây là một phần của SDK Android.
Zamel

9
@Zamel: Chính xác thì Android nhập hình ảnh vào đâu?
Talonx

1
@talonx: Mình không có ý kiến. Lỗi của tôi. Tôi đã bị chôn vùi trong sự phát triển của Android do đó sự nhầm lẫn.
Zamel

3
Khi OP nói rõ ràng rằng nên sử dụng HttpUrlConnection, vậy tại sao nên sử dụng HttpClient?
Không biết nhiều
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.