2010-08-09 39 views
5

¿Cómo se vería este código en ColdFusion?Traducir PHP PUT Solicitud de HTTP a ColdFusion

protected function httpPut($url, $params = null, $data = null) 
    { 
     $fh = fopen('php://memory', 'rw'); 
      fwrite($fh, $data); 
      rewind($fh); 

    $ch = curl_init($url); 
    $this->addOAuthHeaders($ch, $url, $params['oauth']); 
    curl_setopt($ch, CURLOPT_PUT, 1); 
    curl_setopt($ch, CURLOPT_INFILE, $fh); 
    curl_setopt($ch, CURLOPT_INFILESIZE, strlen($data)); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    $resp = $this->curl->addCurl($ch); 
    fclose($fh); 
    return $resp; 
    } 

Tengo algo como lo siguiente, pero parece que no funciona.

<cffile action="write" file="d:\my\directory\path\test.xml" output="#arguments.requestXML#"> 
<cfhttp url="#oaAccessTokenURL#" method="#arguments.requestType#" charset="UTF-8"> 
    <cfheader name="Authorization" value="#oauthheader#"> 
    <cfhttpparam type="file" name="Course" file="d:\my\directory\path\test.xml">  
</cfhttp> 

No sé lo suficiente sobre PHP para entender cómo la variable $ de datos (que es sólo una cadena de datos XML) se está puesto en la petición HTTP y la forma de duplicados que en ColdFusion.

+1

no soy gurú php tampoco. Pero mi suposición sería que está enviando el XML en el "cuerpo" de la solicitud. Intente usar cfhttpparam type = "body" y use # requestXML # como valor. – Leigh

+0

En la instalación de Coldfusion ya hay una biblioteca http de Apache, compruebe cómo se podría hacer en Java, probablemente la solución más rápida y personalizable que podría pensar en este momento. –

+0

@Leigh - Acabo de intentarlo y sigo recibiendo un error. Si ayuda alguno, el error que obtengo es: Tipo de medio no compatible 'application/octet-stream' – Jason

Respuesta

0

Aquí es Java chispa (de documentos de Java), es necesario trabajar hacia fuera:

PutMethod put = new PutMethod("http://jakarta.apache.org"); 
     put.setRequestBody(new FileInputStream("UploadMe.gif")); 

se traduce en la FQ como esto:

<cfset myPut = createObject("java", "org.apache.commons.httpclient.methods.PutMethod") /> 
<cfset myPut.init("http://example.com") /> 
<cfset myInputStream = createObject("java", "java.io.FileInputStream") /> 
<cfset myInputStream.init("myxml.xml") /> 
<cfset myPut.setRequestBody(myInputStream) /> 

Y así sucesivamente ...

En el enlace que pegué arriba puede ver algo así:

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

Encuentra una solución Java en funcionamiento y tradúcela en CF.

EDIT:

Ver comentarios a continuación para una solución.

+0

¿hay una solución pura de CFML que crea? – Henry

+2

Así es como ha hecho en cfrest grupo de Google: http://cfrest.googlegroups.com/web/apiUtilities.cfc?gda=GD5yz0IAAABIZNuY_A2GQeIp6iDWbK7VaStTUa30d_821IbfLDQgDohJfanwNHy4DV68OGE7zINV4u3aa4iAIyYQIqbG9naPgh6o8ccLBvP6Chud5KMzIQ –

+0

Y aquí es cómo "adjuntar" archivo a cfhttp http://www.bennadel.com/blog /619-Throwing-And-Catching-A-File-Using-CFHttp-For-Both-Actions.htm –

1

Intentaría agregar method = "put" a su llamada cfhttp. Eso hará que CFHTTP envíe el verbo HTTP correcto (PUT en este caso).

0

Suponiendo que está haciendo un método PUT, puede utilizar la función GetHttpRequestData() de ColdFusion para obtener los datos XHR.

continuación, se puede guardar por hacer algo como esto:

<cfset xhr_data = GetHttpRequestData() /> 
<cffile action="write" file="PATH/FILENAME" output="#xhr_data.content#">