จะส่งคำขอ PUT, DELETE HTTP ใน HttpURLConnection ได้อย่างไร?


133

ฉันต้องการทราบว่าเป็นไปได้ไหมที่จะส่งคำขอ PUT, DELETE (ในทางปฏิบัติ) ผ่านjava.net.HttpURLConnectionไปยัง URL ที่ใช้ HTTP

ฉันได้อ่านบทความมากมายที่อธิบายถึงวิธีการส่งคำขอ GET, POST, TRACE, OPTIONS แต่ฉันยังไม่พบโค้ดตัวอย่างใดที่ดำเนินการตามคำขอ PUT และ DELETE ได้สำเร็จ


2
คุณช่วยแสดงรหัสที่คุณพยายามใช้ให้เราดูได้ไหม
akarnokd

คำตอบ:


179

ในการดำเนินการ 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 ที่ผู้ให้บริการอีเมล / บล็อกของคุณรองรับ
Matthew Murdoch

5
สวัสดีฉันมีปัญหากับไฟล์delete. เมื่อฉันเรียกใช้รหัสนี้ตามที่อยู่ที่นี่ไม่มีอะไรเกิดขึ้นจริงคำขอจะไม่ถูกส่ง สถานการณ์เดียวกันคือเมื่อฉันทำpostคำขอ แต่ฉันสามารถใช้ตัวอย่างhttpCon.getContent()ที่ทริกเกอร์คำขอได้ แต่httpCon.connect()ไม่ได้เรียกใช้อะไรในเครื่องของฉัน :-)
coubeatczech

7
ในตัวอย่างข้างต้นฉันเชื่อว่าคุณจะต้องเรียกใช้ httpCon.getInputStream () ในตอนท้ายเพื่อให้ส่งคำขอได้จริง
Eric Smith

3
ฉันได้รับ "java.net.ProtocolException: DELETE ไม่รองรับการเขียน"
Kimo_do

1
@edisusant สำหรับทรัพยากรที่ระบุชื่อ (ระบุโดย URL) คือข้อมูลที่จะถูกลบ
Matthew Murdoch

24

นี่คือวิธีการทำงานสำหรับฉัน:

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

12
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: unsupported method: put' inJ2me sdk logger
CodeToLife

9

ฉันเห็นด้วยกับ @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);

แค่อยากจะกล่าวขอบคุณสำหรับสิ่งนี้ ใช้เวลาหลายชั่วโมงพยายามที่จะได้รับรหัสของฉันใช้HttpURLConnectionในการทำงาน cannot retry due to server authentication, in streaming modeแต่ยังคงทำงานเป็นข้อผิดพลาดคี่โดยเฉพาะ: ทำตามคำแนะนำของคุณได้ผลสำหรับฉัน ฉันตระหนักดีว่านี่ไม่ได้ตอบคำถามที่ขอให้ใช้HttpURLConnectionแต่คำตอบของคุณช่วยฉันได้
Tom Catullo

@Deprecated ใช้ HttpClientBuilder แทน
Waldemar Wosiński

3

UrlConnection เป็น API ที่น่าใช้งาน HttpClient เป็น API ที่ดีกว่าและจะช่วยให้คุณไม่ต้องเสียเวลาค้นหาวิธีบรรลุบางสิ่งเช่นคำถาม stackoverflow นี้แสดงให้เห็นอย่างสมบูรณ์แบบ ฉันเขียนสิ่งนี้หลังจากใช้ jdk HttpUrlConnection ในไคลเอนต์ REST หลายตัว นอกจากนี้เมื่อพูดถึงคุณสมบัติการปรับขนาด (เช่นเธรดพูลพูลการเชื่อมต่อ ฯลฯ ) HttpClient นั้นเหนือกว่า


3

สำหรับการทำ PUT ใน 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();
}

1

แม้แต่ Rest Template ก็เป็นตัวเลือกได้:

String payload = "<?xml version=\"1.0\" encoding=\"UTF-8\"?<RequestDAO>....";
    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
thonnor

0

มีวิธีง่ายๆในการลบและใส่คำขอคุณสามารถทำได้โดยการเพิ่ม_methodพารามิเตอร์ "" ในคำขอโพสต์ของคุณและเขียน " PUT" หรือ " DELETE" สำหรับค่าของมัน!


-1

ฉันอยากจะแนะนำ Apache HTTPClient


9
ทำไมคุณถึงแนะนำ HTTPClient? มันใหญ่. ฉันหมายถึง - ขนาด
jayarjo

1
@jayarjo เป็นส่วนหนึ่งของ Android SDK
Zamel

9
@ Zamel: Android ใส่รูปภาพตรงไหน?
กรงเล็บ

1
@talonx: ฉันไม่รู้ ความผิดพลาดของฉัน. ฉันถูกฝังอยู่ในการพัฒนา Android ดังนั้นจึงเกิดความสับสน
Zamel

3
เมื่อ OP บอกชัดเจนว่าควรใช้ HttpUrlConnection แล้วทำไมต้องใช้ HttpClient?
รู้ไม่มาก
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.