2010-02-05 28 views
7

Tôi đang cố gắng giao tiếp với một API yêu cầu dữ liệu XML được chứa trong phần thân của yêu cầu HTTP DELETE. Tôi đang sử dụng urlfetch trong AppEngine và tải trọng chỉ đơn giản là bỏ qua cho các yêu cầu DELETE.Có cách nào để cho phép Google App Engine gửi cơ thể hoặc tải trọng với yêu cầu DELETE không?

Sau khi đọc bài viết này: Is an entity body allowed for an HTTP DELETE request?, tôi nhận ra rằng tiêu chuẩn có lẽ không cho phép nội dung trên các yêu cầu DELETE và đó là lý do tại sao urlfetch đang loại bỏ phần thân.

Vì vậy, câu hỏi của tôi là: có một số loại công việc xung quanh để nối thêm nội dung cơ thể trong công cụ ứng dụng khi urlfetch bỏ qua tải trọng không?

Trả lời

6

mỗi the docs,

URL lấy dịch vụ hỗ trợ lăm phương thức HTTP: GET, POST, HEAD, PUT và DELETE . Yêu cầu có thể bao gồm tiêu đề HTTP và nội dung cho yêu cầu POST hoặc PUT.

Do thời gian chạy GAE Python có nhiều hộp cát, nên bạn sẽ không thể vượt qua giới hạn này. Tôi cho rằng đó là một lỗi, và bạn có lẽ nên nộp báo cáo lỗi here.

+1

Đồng ý, có vẻ như là lỗi. –

+0

Tôi đồng ý, tôi đã gắn dấu sao và nhận xét về vấn đề này tại đây: http://code.google.com/p/googleappengine/issues/detail?id=601&q=post%20delete&colspec=ID%20Type%20Status%20Priority%20Stars% 20Owner% 20Summary% 20Log% 20Component – elkelk

+0

elkelk, lỗi đó không liên quan đến câu hỏi ở đây. –

0

Bạn có thể làm được việc này bằng cách sử dụng API App Engine Socket, ở đây là làm thế nào mà trông ở Gò:

client := http.Client{ 
     Transport: &http.Transport{ 
      Dial: func(network, addr string) (net.Conn, error) { 
       return socket.Dial(c, network, addr) 
      }, 
     }, 
    } 
2

Bạn có thể làm DELETE yêu cầu với cơ thể thông qua ổ cắm, mã Java mẫu để kiểm tra HttpRequest và làm khác nhau yêu cầu DELETE với nội dung:

public static HTTPResponse execute(HTTPRequest request) throws ExecutionException, InterruptedException { 

    if (request == null) { 
     throw new IllegalArgumentException("Missing request!"); 
    } 

    if (request.getMethod() == HTTPMethod.DELETE && request.getPayload() != null && request.getPayload().length > 0) { 
     URL obj = request.getURL(); 
     SSLSocketFactory socketFactory = (SSLSocketFactory) SSLSocketFactory.getDefault(); 
     try { 
      HttpsURLConnection con = (HttpsURLConnection) obj.openConnection(); 

      HttpsURLConnection.setDefaultSSLSocketFactory(socketFactory); 

      con.setRequestMethod("DELETE"); 
      for (HTTPHeader httpHeader : request.getHeaders()) { 
       con.setRequestProperty(httpHeader.getName(), httpHeader.getValue()); 
      } 
      con.setDoOutput(true); 
      con.setDoInput(true); 

      OutputStream out = con.getOutputStream(); 
      out.write(request.getPayload()); 
      out.flush(); 
      out.close(); 
      List<HTTPHeader> responseHeaders = new ArrayList<>(); 
      for (Map.Entry<String, List<String>> stringListEntry : con.getHeaderFields().entrySet()) { 
       for (String value : stringListEntry.getValue()) { 
        responseHeaders.add(new HTTPHeader(stringListEntry.getKey(), value)); 
       } 
      } 
      return new HTTPResponse(con.getResponseCode(), StreamUtils.getBytes(con.getInputStream()), con.getURL(), responseHeaders); 
     } catch (IOException e) { 
      log.severe(e.getMessage()); 
     } 
    } else { 
     Future<HTTPResponse> future = URLFetchServiceFactory.getURLFetchService().fetchAsync(request); 
     return future.get(); 
    } 
    return null; 
} 
Các vấn đề liên quan