2010-02-05 14 views
7

Estoy intentando hacer interfaz con una API que requiere que los datos XML estén contenidos en el cuerpo de una solicitud HTTP DELETE. Estoy usando urlfetch en AppEngine y la carga útil simplemente se ignora para las solicitudes DELETE.¿Hay alguna manera de permitir que Google App Engine envíe cuerpo o carga con una solicitud DELETE?

Después de leer este artículo: Is an entity body allowed for an HTTP DELETE request?, me doy cuenta de que el estándar probablemente no permite el contenido del cuerpo en las solicitudes DELETE y es por eso que urlfetch está quitando el cuerpo.

Así que mi pregunta es: ¿hay algún tipo de reparación para agregar el contenido del cuerpo en el motor de la aplicación cuando urlfetch ignora la carga útil?

Respuesta

6

por the docs,

La extracción de URL de servicios admite cinco métodos HTTP: GET, POST, HEAD, PUT y eliminar. La solicitud puede incluir encabezados HTTP y contenido del cuerpo para una solicitud POST o PUT.

Dado que el tiempo de ejecución de GAE Python es muy limitado, es muy poco probable que pueda sortear esta restricción. Considero que es un error, y probablemente deba presentar un informe de error here.

+1

De acuerdo, parece un error. –

+0

Acepto, he destacado y comentado el problema aquí: http://code.google.com/p/googleappengine/issues/detail?id=601&q=post%20delete&colspec=ID%20Type%20Status%20Priority%20Stars% 20Propietario% 20Summary% 20Log% 20Component – elkelk

+0

elkelk, ese error no está relacionado con la pregunta aquí. –

0

Usted puede evitar esto usando la API de App Engine zócalo, aquí es como que se ve en movimiento:

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

Usted puede hacer solicitud DELETE con el cuerpo a través de tomas de corriente, el código Java de ejemplo que comprueba HTTPRequest y lo hace diferente solicitud para ELIMINAR con cuerpo:

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