coldfusion cloudflare cfml http-delete cfhttp

coldfusion - API CFHTTP y CloudFlare: ELIMINAR purge_everything no funciona



cfml http-delete (2)

Después de leer algunos documentos, parece que la API de CloudFlare está mezclando métodos de una manera que CFHTTP no lo hará.

La API de CloudFlare establece el uso del método DELETE y el encabezado de tipo de contenido de "application / json". Su ejemplo exacto es:

$ curl -X DELETE "https://api.cloudflare.com/client/v4/zones/023e105f4ecef8ad9ca31a8372d0c353/purge_cache" / -H "X-Auth-Email: [email protected]" / -H "X-Auth-Key: c2547eb745079dac9320b638f5e225cf483cc5cfdda41" / -H "Content-Type: application/json" / --data ''{"purge_everything":true}''

Sin embargo, cuando uno usa --data, curl POST con application-type application / x-www-form-urlencoded. https://curl.haxx.se/docs/manpage.html#-d

Sin embargo, CFHTTP sigue las especificaciones. POST se utiliza para enviar datos. ELIMINAR es para eliminar el URI.

Cuando CFHTTP con POST aparece un error, solo se acepta DELETE para el URI. Cuando uso CFHTTP con DELETE, no se está enviando contenido.

Mi solución, sin salirse de CFML estándar, era usar su API v1. Está funcionando como un campeón. https://www.cloudflare.com/docs/client-api.html

¿Alguien más ha podido BORRAR purge_everything con CFHTTP? Parece que no puedo obtener ColdFusion CFHTTP para purgar con éxito una caché de la zona CloudFlare. Pero puedo hacer otras cosas como zonas de lista, etc. Así que sé que puedo hacer CFHTTP con éxito en la API de CloudFlare.

Este es el comando curl, que funciona:

curl -svX DELETE -H ''X-Auth-Email: [email protected]'' -H ''X-Auth-Key: XYZ'' https://api.cloudflare.com/client/v4/zones/xxxxxxx/purge_cache -H ''Content-Type: application/json'' --data ''{"purge_everything":true}''

El error devuelto es:

{"success": false, "errors": [{"code": 1012, "message": "La solicitud debe contener uno de /" purge_everything / "o /" files / ", o /" tags "}]," mensajes ": []," resultado ": nulo}

He intentado tantas combinaciones de código ... estas son las diferentes variables que he probado:

<cfset stFields = ''{"purge_everything":true}''> <cfset stFieldsJson = {"purge_everything":true}> <cfset stFieldsJson2 = { "fields" : { "purge_everything" : true } }> <cfset stFieldsJson3 = { "purge_everything" : true, "fields" : { "purge_everything" : true } }> <cfset tmp = {} /> <cfset tmp[''purge_everything''] = true />

... y aquí hay algunas combinaciones diferentes de llamadas que hice ...

<cfhttp url="https://api.cloudflare.com/client/v4/zones/4da78b2707f9753eb79a93d505b4d0d3/purge_cache" method="DELETE" result="cFlare" charset="utf-8"> <cfhttpparam type="header" name="X-Auth-Email" value="[email protected]"> <cfhttpparam type="header" name="X-Auth-Key" value="XYZ"> <cfhttpparam type="header" name="Content-Type" value="application/json; charset=utf-8"> <cfhttpparam type="header" name="accept" value="*/*"> <cfhttpparam type="body" value="#serializeJson(stFieldsJson)#" encoded="false"> </cfhttp> <cfdump var="#cFlare#"><Cfflush> <cfhttp url="https://api.cloudflare.com/client/v4/zones/4da78b2707f9753eb79a93d505b4d0d3/purge_cache" method="DELETE" result="cFlare" charset="utf-8"> <cfhttpparam type="header" name="X-Auth-Email" value="[email protected]"> <cfhttpparam type="header" name="X-Auth-Key" value="XYZ"> <cfhttpparam type="header" name="Content-Type" value="application/json; charset=utf-8"> <cfhttpparam type="header" name="accept" value="*/*"> <cfhttpparam type="body" value="#serializeJson(stFieldsJson2)#" encoded="false"> </cfhttp> <cfdump var="#cFlare#"><Cfflush> <cfhttp url="https://api.cloudflare.com/client/v4/zones/4da78b2707f9753eb79a93d505b4d0d3/purge_cache" method="DELETE" result="cFlare"> <cfhttpparam type="header" name="X-Auth-Email" value="[email protected]"> <cfhttpparam type="header" name="X-Auth-Key" value="XYZ"> <cfhttpparam type="header" name="Content-Type" value="application/json"> <cfhttpparam type="header" name="accept" value="*/*"> <cfhttpparam type="body" value="#serializeJson(stFieldsJson3)#" encoded="false"> </cfhttp> <cfdump var="#cFlare#"><Cfflush> <cfhttp url="https://api.cloudflare.com/client/v4/zones/4da78b2707f9753eb79a93d505b4d0d3/purge_cache" method="DELETE" result="cFlare"> <cfhttpparam type="header" name="X-Auth-Email" value="[email protected]"> <cfhttpparam type="header" name="X-Auth-Key" value="XYZ"> <cfhttpparam type="header" name="Content-Type" value="application/json"> <cfhttpparam type="header" name="accept" value="*/*"> <cfhttpparam type="body" value="#serializeJson(tmp)#" encoded="false"> </cfhttp> <cfdump var="#cFlare#"><Cfflush> <cfhttp url="https://api.cloudflare.com/client/v4/zones/4da78b2707f9753eb79a93d505b4d0d3/purge_cache" method="DELETE" result="cFlare" charset="utf-8"> <cfhttpparam type="header" name="X-Auth-Email" value="[email protected]"> <cfhttpparam type="header" name="X-Auth-Key" value="XYZ"> <cfhttpparam type="header" name="Content-Type" value="application/json; charset=utf-8"> <cfhttpparam type="header" name="accept" value="*/*"> <cfhttpparam type="body" value=''{"purge_everything":true}'' encoded="false"> </cfhttp> <cfdump var="#cFlare#"><Cfflush> <cfhttp url="https://api.cloudflare.com/client/v4/zones/4da78b2707f9753eb79a93d505b4d0d3/purge_cache" method="DELETE" result="cFlare" charset="utf-8"> <cfhttpparam type="header" name="X-Auth-Email" value="[email protected]"> <cfhttpparam type="header" name="X-Auth-Key" value="XYZ"> <cfhttpparam type="header" name="Content-Type" value="application/json; charset=utf-8"> <cfhttpparam type="header" name="accept" value="*/*"> <cfhttpparam type="body" value=''"purge_everything":true'' encoded="false"> </cfhttp> <cfdump var="#cFlare#"><Cfflush> <cfhttp url="https://api.cloudflare.com/client/v4/zones/4da78b2707f9753eb79a93d505b4d0d3/purge_cache" method="DELETE" result="cFlare" charset="utf-8"> <cfhttpparam type="header" name="X-Auth-Email" value="[email protected]"> <cfhttpparam type="header" name="X-Auth-Key" value="XYZ"> <cfhttpparam type="header" name="Content-Type" value="application/json; charset=utf-8"> <cfhttpparam type="header" name="accept" value="*/*"> <cfhttpparam type="body" value=''purge_everything'' encoded="false"> </cfhttp> <cfdump var="#cFlare#"><Cfflush>

También he intentado con y sin el atributo ''Encoded'' Body, con y sin el atributo ''Charset'' en todos los lugares.

Cualquier ayuda es apreciada.


No estoy seguro de qué versión de CF está ejecutando. Sin embargo, sospecho que no estás haciendo nada mal, pero que <cfhttp> simplemente no está enviando un cuerpo cuando el method="DELETE" , lo que tendría sentido dado el mensaje de error.

Una manera simple de probarlo es señalar su llamada <cfhttp> a una página de prueba en su servidor CF local. En la página de prueba, GetHttpRequestData() para que pueda ver los encabezados y el contenido enviados. (Otra opción es usar el TCPMonitor integrado en un puerto abierto, que proporciona más detalles sobre la solicitud y la respuesta. Sin embargo, para este escenario, el primer método es el más simple).

Página de prueba

<!--- echo request headers and content ---> <cfdump var="#getHTTPRequestData()#">

Solicitud

<!--- simulate request ---> <cfset requestBody["purge_everything"] = true> <cfhttp url="http://localhost/testPage.cfm" method="DELETE" result="cFlare" charset="utf-8" > <cfhttpparam type="header" name="X-Auth-Email" value="[email protected]"> <cfhttpparam type="header" name="X-Auth-Key" value="XYZ"> <cfhttpparam type="header" name="Content-Type" value="application/json; charset=utf-8"> <cfhttpparam type="header" name="accept" value="*/*"> <cfhttpparam type="body" value="#serializeJson(requestBody)#" encoded="false"> </cfhttp> <!--- display request headers and content ---> <cfoutput>#cFlare.fileContent#</cfoutput>

Observe que el contenido, o cuerpo, está vacío cuando method="DELETE" ? Sin embargo, cámbielo a method="POST" y el contenido aparecerá mágicamente.

Enviar un cuerpo con una solicitud DELETE debe ser válido, por lo que parece un error. Si es así, deberá encontrar una herramienta diferente para realizar la solicitud http, como invocar curl.exe desde cfexecute , o usar una etiqueta personalizada como cfx_http5, o usar clases Java como URLConnection o HTTPClient de Apache .