CFHTTP и CloudFlare API: УДАЛИТЬ purge_everything не работает

Кто-нибудь еще смог УДАЛИТЬ purge_everything с помощью CFHTTP? Кажется, я не могу заставить ColdFusion CFHTTP успешно очистить кеш зоны CloudFlare. Но я могу делать другие вещи, такие как список зон и т. Д. Поэтому я знаю, что могу успешно использовать CFHTTP для API CloudFlare.

Это команда curl, которая работает:

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}'

Возвращаемая ошибка:

{"success":false,"errors":[{"code":1012,"message":"Запрос должен содержать один из \"purge_everything\" или \"files\", или \"tags"}]," сообщения":[],"результат":null}

Я пробовал так много комбинаций кода... это разные переменные, которые я пробовал:

<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 />

... и вот несколько разных комбинаций звонков, которые я сделал...

<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>

Я также пробовал с атрибутом «Кодировка» и без него, с атрибутом «Шарсет» и без него во всех местах.

Любая помощь приветствуется.


person Jules    schedule 10.02.2016    source источник
comment
Откуда вы взяли идентификатор зоны? Не знаю, чем его заменить или где я могу найти информацию для него api. cloudflare.com/client/v4/zones/:identifier/purge_cache   -  person Lion789    schedule 05.07.2016


Ответы (2)


Не уверен, какую версию CF вы используете. Однако я подозреваю, что вы не делаете ничего плохого, но <cfhttp> просто не отправляет тело при method="DELETE", что имело бы смысл, учитывая сообщение об ошибке.

Простой способ проверить это — направить ваш <cfhttp> вызов на тестовую страницу на вашем локальном сервере CF. На тестовой странице дамп GetHttpRequestData(), чтобы вы могли просмотреть фактические заголовки и отправленный контент. (Другой вариант — использовать встроенный в TCPMonitor. на открытом порту, который предоставляет более подробную информацию как о запросе, так и об ответе. Однако для этого сценария первый метод является самым простым.)

Тестовая страница

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

Запрос

<!--- 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>

Обратите внимание, что содержимое или тело пусто, когда method="DELETE"? Однако измените его на method="POST", и содержимое волшебным образом появится.

GetHttpRequestData() — Метод=DELETE

Отправка тела с запросом DELETE должна быть действительным, так что это звучит как ошибка. Если это так, вам нужно будет найти другой инструмент для выполнения HTTP-запроса, например, вызов curl.exe из cfexecute, или использование пользовательского тега, такого как cfx_http5, или использование классов Java, таких как URLConnection или HTTPClient Apache.

person Leigh    schedule 12.02.2016
comment
Хорошего расследования, и спасибо за предложенные обходные пути. После публикации моего вопроса я больше работал над ним и пришел к тому же выводу, что и вы: CFHTTP не будет публиковать тело, когда метод DELETE. - person Jules; 12.02.2016
comment
Да, похоже, что это явно не запрещено, поэтому было бы неплохо, если бы было какое-то указание, что cfhttp намерен просто игнорировать тело. По крайней мере, тогда люди не ломали голову над тем, что пошло не так... - person Leigh; 12.02.2016

После прочтения некоторых документов выяснилось, что CloudFlare API смешивает методы так, как CFHTTP не будет.

API CloudFlare указывает использовать метод DELETE и заголовок типа контента «application/json». Их точный пример:

$ 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}'

Однако, когда кто-то использует --data, curl будет POST с типом содержимого application/x-www-form-urlencoded. https://curl.haxx.se/docs/manpage.html#-d

Однако CFHTTP соответствует спецификациям. POST используется для отправки данных. DELETE предназначен для удаления URI.

Когда я выполняю CFHTTP с POST, я получаю сообщение об ошибке, что для URI принимается только DELETE. Когда я выполняю CFHTTP с помощью DELETE, содержимое не публикуется.

Мой обходной путь, не выходя за рамки стандартного CFML, состоял в том, чтобы использовать их v1 API. Он работает как чемпион. https://www.cloudflare.com/docs/client-api.html

person Jules    schedule 12.02.2016
comment
Откуда вы взяли идентификатор зоны, не зная, где искать? - person Lion789; 05.07.2016
comment
Сначала вы перечисляете все свои зоны: api.cloudflare.com/#zone-list-zones Оттуда вы найдете домен и его идентификатор зоны. - person Jules; 06.07.2016