2016-02-10 16 views
5

Có ai khác có thể XÓA thanh lọc với CFHTTP không? Tôi dường như không thể làm cho ColdFusion CFHTTP thành công trong việc xóa bộ nhớ cache của vùng CloudFlare. Nhưng tôi có thể làm những việc khác như danh sách các khu vực, vv Vì vậy, tôi biết tôi có thể thành công CFHTTP API của CloudFlare.CFHTTP & CloudFlare API: DELETE purge_everything không hoạt động

Đây là lệnh curl, mà làm việc:

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

Lỗi được thông báo là:

{ "thành công": false, "lỗi": [{ "code": 1012 , "message": "Yêu cầu phải chứa một trong các \" purge_everything \ "hoặc \" files \ "hoặc \" tags "}]," messages ": []," result ": null}

Tôi đã thử rất nhiều sự kết hợp của mã ... đó là những biến số khác nhau tôi đã cố gắng:

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

... và đây là một số kết hợp khác nhau của các cuộc gọi tôi đã thực hiện ...

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

Tôi cũng đã cố gắng có và không có thuộc tính 'Được mã hóa' Nội dung, có và không có thuộc tính 'Bộ ký tự' ở mọi nơi.

Mọi trợ giúp đều được đánh giá cao.

+0

Bạn lấy mã định danh vùng từ đâu? Không có ý tưởng gì để thay thế nó bằng hoặc nơi tôi tìm thấy thông tin cho nó https://api.cloudflare.com/client/v4/zones/:identifier/purge_cache – Lion789

Trả lời

2

Không chắc bạn đang chạy phiên bản CF nào. Tuy nhiên, tôi nghi ngờ bạn không làm bất cứ điều gì sai, nhưng rằng <cfhttp> chỉ đơn giản là không gửi một cơ thể khi method="DELETE", mà sẽ có ý nghĩa cho các thông báo lỗi.

Một cách đơn giản để kiểm tra nó là trỏ cuộc gọi <cfhttp> của bạn đến trang thử nghiệm trên máy chủ CF cục bộ của bạn. Trên trang kết xuất thử nghiệm GetHttpRequestData() để bạn có thể xem tiêu đề thực tế và nội dung được gửi. (Một lựa chọn khác là sử dụng built in TCPMonitor trên một cổng mở, cung cấp chi tiết hơn về cả yêu cầu và trả lời. Tuy nhiên, cho kịch bản này, phương pháp đầu tiên là đơn giản nhất.)

Trang Kiểm tra

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

Yêu cầu

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

Thông báo nội dung, hoặc cơ thể, là trống rỗng khi method="DELETE"? Tuy nhiên, thay đổi nó thành method="POST" và nội dung kỳ diệu xuất hiện.

GetHttpRequestData() - Method=DELETE

Sending a body with a DELETE request nên có giá trị, vì vậy nó có vẻ giống như một lỗi. Nếu vậy, bạn sẽ cần phải tìm một công cụ khác để thực hiện yêu cầu http, chẳng hạn như gọi curl.exe từ cfexecute hoặc sử dụng thẻ tùy chỉnh như cfx_http5 hoặc sử dụng các lớp java như URLConnection hoặc Apache's HTTPClient.

+0

Tốt sleuthing, và cảm ơn bạn đã giải pháp được đề xuất. Sau khi đăng câu hỏi của tôi, tôi đã làm việc nhiều hơn về nó và đi đến kết luận tương tự như bạn - CFHTTP sẽ không đăng một cơ thể khi phương thức DELETE. – Jules

+1

Vâng, có vẻ như nó không phải là verboten một cách rõ ràng, vì vậy nó sẽ được tốt đẹp nếu có một số dấu hiệu cfhttp dự định chỉ cần bỏ qua cơ thể. Ít nhất thì mọi người sẽ không gãi đầu tự hỏi điều gì đã xảy ra ... – Leigh

0

Sau khi đọc trên một số tài liệu, có vẻ như CloudFlare API đang trộn các phương thức theo cách mà CFHTTP sẽ không.

Trạng thái API của CloudFlare sử dụng phương thức DELETE và tiêu đề loại nội dung của "application/json". ví dụ chính xác của họ là:

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

Tuy nhiên khi một người sử dụng --data, curl sẽ POST với content-type application/x-www-form-urlencoded. https://curl.haxx.se/docs/manpage.html#-d

Tuy nhiên, CFHTTP tuân theo thông số kỹ thuật. POST được sử dụng để gửi dữ liệu. DELETE là để xóa URI.

Khi tôi CFHTTP với POST tôi nhận được một lỗi mà chỉ xóa được chấp nhận cho URI. Khi tôi CFHTTP với DELETE, không có nội dung nào được đăng.

Giải pháp thay thế của tôi, mà không bị loại ra khỏi CFML chuẩn, là sử dụng API phiên bản 1 của họ. Nó hoạt động như một nhà vô địch. https://www.cloudflare.com/docs/client-api.html

+0

Bạn lấy mã định danh vùng từ đâu mà không biết phải tìm ở đâu? – Lion789

+0

Bạn trước tiên liệt kê tất cả các khu vực của mình: https://api.cloudflare.com/#zone-list-zones Từ đó bạn tìm thấy tên miền và đó là id khu vực. – Jules

Các vấn đề liên quan