2016-02-10 3 views
5

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

Это завиток команда, которая работает: вернулась

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

Ошибки:

{ "успех": ложный, "ошибка": [{ "код": 1012 , "сообщение": "Запрос должен содержать один из \" purge_everything \»или \ "файлы \", или \ "метки"}], "сообщения": [], "результат": нулевой}

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

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

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

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

+0

Откуда у вас был идентификатор зоны? Нет идеи, что заменить его или где я нахожу информацию для него https://api.cloudflare.com/client/v4/zones/:identifier/purge_cache – Lion789

ответ

2

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

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

Test Page

<!--- 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() - Method=DELETE

Sending a body with a DELETE request должен быть действительным, так это звучит как ошибка. Если это так, вам нужно будет найти другой инструмент для запроса http, например, вызвать curl.exe с cfexecute или использовать специальный тег, например cfx_http5, или использовать классы java, такие как URLConnection или Apache's HTTPClient.

+0

Хорошее слежение, и спасибо за предложенные обходные пути. После публикации моего вопроса я больше работал над этим и пришел к тому же выводу, что и вы - CFHTTP не будет публиковать тело, когда метод DELETE. – Jules

+1

Да, похоже, что это явно не verboten, так что было бы неплохо, если бы было какое-то указание, что cfhttp намеревается просто игнорировать тело. По крайней мере, тогда люди не будут царапать головы, задаваясь вопросом, что пошло не так ... – Leigh

0

После ознакомления с некоторыми документами, кажется, что API CloudFlare смешивает методы таким образом, что 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, ротор будет POST с Content-Type применение/х-WWW-форм-urlencoded. https://curl.haxx.se/docs/manpage.html#-d

CFHTTP однако следующий характеристики. POST используется для отправки данных. DELETE предназначен для удаления URI.

Когда я CFHTTP с POST я получаю сообщение об ошибке, что только УДАЛЕНИЕ принимается для URI. Когда я CFHTTP с DELETE, контент не отправляется.

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

+0

Где вы получили идентификатор зоны, не представляя, где искать? – Lion789

+0

Вы сначала перечислите все свои зоны: https://api.cloudflare.com/#zone-list-zones Оттуда вы найдете домен и его идентификатор зоны. – Jules