受支援的網頁服務

SOAP

Snippet 語言透過產生代理的過程支援基於 SOAP 的網頁服務。Studio 必須用於產生代理,然後將其作為 .NET DLL 儲存於 CXone 檔案系統中。所有網頁服務代理必須儲存到將使用它的業務單位的根資料夾中。系統管理員可以在業務單位 3 下建立一個代理以供共享使用,儘管到目前為止還沒有在生產中這樣做。

基於 SOAP 的網頁服務正在衰落,RESTful 網頁服務正在取代它們。我們的 SOAP 網頁服務代理產生過程可能會在某個時候停止。在可預見的未來沒有新的增強計劃。

在代理產生過程中,將某些功能新增到代理對象,以便其能夠很好地與 CXone 一起工作。其中一個新增功能是序列化成二進制流的能力。所有類型,包括代理,必須能夠序列化,以便 VC 冗餘和指令碼編組功能可以發揮作用。因此需要 Studio 代理產生過程。

除了序列化功能,還配置了代理,以便 VC 執行引擎在等待網頁服務調用完成時能夠正確地利用線程池。如缺乏這種功能,VC 線程池將不能正確使用,結果,客戶可能會受到負面影響。 使用正確的線程池非常關鍵。

Studio 流程新增的最後一項功能是追蹤網頁服務使用情況的能力。當調用代理進行外部網頁服務調用時,計數器和時間追蹤器被用來記錄使用情況和影響。這些指標在一天中會儲存幾次到資料庫表中,以供管理使用。

使用

在 Snippet 中,USES 命令允許 Snippet 包含網頁服務代理 DLL 以便在 Snippet 中使用。DLL 檔案必須位於檔案伺服器上當前業務單位的根資料夾中,或者位於業務單位 3 根資料夾中(供共享使用)。語法:

USES "<proxy>.dll"

示例:

USES "sf.dll" cStart="{now}" sforce=new SforceService() session=new SessionHeader() loginResult=sforce.login("demo@ucn.net",password6") sforce.sessionheadervalue=session session.sessionid=loginResult.sessionid sforce.url=loginresult.serverUrl t=new Task() t.ActivityDate=#"8/20/2050" t.Description="Call placed by {first }{Last}."t.Subject="Call @{cStart}" t.Status="Completed" t.CallType="Outbound" t.OwnerId=SF_Agent_ID t.ReminderDateTime="{cStart}" SWITCH Type { CASE "CON" { t.WhoId=SF_Obj_ID } CASE "LEA" { t.WhoId=SF_Obj_ID } CASE "ACC" { t.WhatId=SF_Obj_ID } CASE "OPP" { t.WhatId=SF_Obj_ID } CASE "CAS" { t.WhatId=SF_Obj_ID } } SaveResult=sforce.create(t)

注意︰在平台上(Studio 測試之外)使用任何網頁服務代理 DLL 之前,必須對其進行授權。如今的授權過程涉及到將 DLL 名稱新增到位於 COR 伺服器(VC 運行的地方)上的授權文字檔案。使用「網頁管理摘要」頁面並檢查 AuthorizedAssemblies 配置設定以驗證位置。條目的格式為 BUS<busno>\<proxy>.dll。例如:BUS4\LCWS.dll。每個不同的 DLL 必須在新的一行上。如果一個 DLL 在指令碼中被使用後進行了更新,獲得更新後 DLL 的唯一方法是重新啟動 VC。

RESTful

Snippet 語言透過幾個內建服務與 RESTful 網頁服務一起工作。第一個是 RestProxy 服務,該服務可以透過以下方式建立一個新執行個體來使用︰

proxy = GetRESTProxy()

RestProxy 提供了一些與遙距網頁伺服器互動的屬性和方法。提出請求的關鍵方法稱為 MakeRestRequest。下面將提供所有屬性和方法的完整描述。當與 RESTful 網頁服務交換資訊時,RestProxy 支援稱為 DynamicData 類型的動態結構化資料定義格式。DynamicData 類型可以接收 XML 和 JSON 格式的資料,並提供面向對象的存取模式來讀取資料。它還允許動態產生可以轉換為 XML 或 JSON 的對象。

如需建立新的 DynamicData 對象,使用 DYNAMIC 命令︰

DYNAMIC <name> [FROM'<string>' | <var>]

<name> 是一個新指令碼變數的名稱,必須與 inControl 指令碼編寫規格相容(沒有前置數字或特殊字元,除了下劃線「_」,可以選擇以美元符號「$」結尾)。如果使用可選的 FROM 子句,文字可以是顯式的 JSON 或 XML 字串(用單引號括起來)或包含 JSON 或 XML 的指令碼變數的名稱。提供初始化只是為了簡化測試,而不是作為初始化動態變數的一般方法。僅允許一行文字。如果在結束單引號之前遇到換行,將引發錯誤。

成員與子成員

這種語言中的動態變數是專門設計的實體,具有廣泛的有用功能。從表面上看,它們是可以動態建立成員的對象。例如,在 Snippet 中,可以聲明一個動態變數並建立幾個成員︰

DYNAMIC employee employee.Name = "John Smith" employee.Phone = "8005551212" employee.Address = "1234 Clay Street

當每個成員被指定地址時,它將被自動建立。因此,NamePhoneAddress 成員現在將作為員工變數的屬性。

動態變數成員區分大小寫。因此,employee.Nameemployee.name 不同。這與 CXone 平台的正常行為不同。然而,由於需要與外部系統進行交互操作(大多數依賴於正確的情況),我們做出了這個決定,並且只適用於動態變數。

子成員也可以即時建立︰

employee.Department.Code = 942 employee.Department.Location = "Olive City"

同樣地,當子成員被指定地址時,它們會被自動新增到結構中。現在,使用一個表達式,對該結構的引用可以被指派給另一個動態指令碼變數︰

John = employee

需要注意的一點是,員工和「John」將引用相同的物理資料。如果您變更其中一個成員,您將同時變更兩個成員。如需複製資料,請使用內建函數複製。以下 Snippet 示例說明了這一點︰

DYNAMIC x x.Name = "John" y = x y.Name = "Sam"

其結果如下圖所示︰

內建複製功能的示例。

透過複製函數,y 獲得一個唯一複製,並且可以在不影響 x 的情況下進行變更︰

DYNAMIC x x.Name = "John" y = copy(x) y.Name = "Sam"

顯示複製函數示例的圖像。

您亦可以複製子成員︰

DYNAMIC x x.Name.First = "John" x.Name.Last = "Smith" y = copy(x.Name) y.First = "Sam"

顯示子成員示例的圖像。

關於複製函數︰它透過將對象轉換為文字表示,然後再轉換回對象來執行深度複製。在平台資源上,這比簡單地複製引用要昂貴得多。非常大的對象可能會產生大量花費時間,並可能降低執行指令碼的速度。必要時可以使用,但不要濫用。

動態變數亦可以處理陣列。對象本身可以被視為頂級陣列,成員也可以被視為陣列︰

DYNAMIC employees employees[1] = john 或 employees.Person[1] = john

重要提示!! 所有陣列都從索引 1 開始。如果您引用一個不存在的陣列索引,它會建立該索引。如果新引用索引下面的元素不存在,也將建立該元素。因此,要小心,因為不小心指定索引 100 將為索引 1 到 99 建立空元素。要獲取陣列中的元素個數,請使用 count() 函數︰x = count(employees.Person)。

以下是 StudioSnippet 屬性編輯器中的「偵測器」標籤。它顯示帶有頂級陣列的動態變數︰

顯示帶有頂級陣列的動態變數的圖像。

透過將元素移動到名為 Name 的子成員中,如下所示︰

顯示子元素示例的圖像。

頂級陣列的動態變數與動態變數陣列的常規指令碼變數是不同的。下面的示例說明了這一點︰

DYNAMIC a DYNAMIC b DYNAMIC c a.Name = "John" b.Name = "Sam" c.Name = "Arnold" x[1] = a x[2] = b x[3] = c DYNAMIC y y[1] = a y[2] = b y[3] = c

要檢查的兩個變數是 x 和 y。第一個 x 是一個包含動態變數陣列的普通指令碼變數。第二個 y 是一個動態變數,它是一個頂級陣列。在「偵測器」中兩者看起來相似︰

顯示動態變數示例的圖像。

雖然它們看起來很相似,但它們並不相同。下一節討論動態變數的序列化概念。重要的一點是,在上面的示例中,X 不能像 Y 那樣用於與遙距系統進行交互操作。X 不可序列化,但 Y 可序列化。

序列化

在討論序列化之前,與普通指令碼變數相比,說明如何與動態變數互動是很有幫助的。普通變數有一個很長的內建方法清單,用於進行字串剖析、轉換為日期、排序等操作。點擊下面的下拉式清單以檢視許多如何與動態變數互動的示例。

使用動態變數的優點之一是序列化的強大功能。這是將對象轉換為適合在網絡上傳輸的文字格式的能力。目前支援 2 種格式︰XML 和 JSON。如果使用 RestProxy(本節前面討論過),序列化過程將自動發生。如果您需要手動產生序列化字串,有兩個字串方法提供︰

<var>.asjson() <var>.asxml()

在字串內文中使用,以產生對象的序列化版本︰

text = "{y.asjson()}"

假設 y 的值類似於前面的示例,下面是 text 可能包含的內容︰

{"Name":[{"First":"Sam","Last":"Smith"},{"First":"Bill","Last":"Smith"}]}

同樣,.asxml 方法產生如下輸出︰

<?xml version="1.0" encoding="utf-16" standalone="yes"?> <DynamicDataObject><Name><First>Sam</First<Last>Smith</Last></Name> <Name><First>Bill</First><Last>Smith</Last></Name></DynamicDataObject>

RestProxy 成員

透過調用 GetRestProxy() 獲得的 RestProxy 提供使用 RESTful 網頁服務慣例與遙距網絡伺服器通訊的服務。使用 Studio Snippet Editor 時,可以在輸入時檢視可用的屬性和方法。只需聲明一個新的代理執行個體︰

proxy = GetRESTProxy()

然後在新一行中,輸入代理,後跟句號 (.)︰

顯示 RESTProxy 示例的圖像。

Intelli-Prompt 系統會自動顯示一個包含可用成員的清單方塊。一旦選擇了一個方法,輸入左括號將再次啟用 Intelli-Prompt 系統,以顯示參數︰

顯示 Intelli-Prompt 系統的圖像,顯示一個包含可用成員的 litbox。

屬性

屬性 詳細資訊
StatusCode 包含調用 MakeRestRequest() 後的 HTTP 狀態代碼。
StatusDescription 包含調用 MakeRestRequest() 後的 HTTP 狀態描述。
ContentType 允許覆寫預設的內容類型標題。預設為「Form-urlencoded」。例如,如果傳送 JSON,您需要將其變更為「application/json」。
ProxyTimeoutSeconds 允許變更預設請求超時。預設為 10 秒。

方法

方法 詳細資訊
string urlencode(字串值)
描述 將字串編碼為 Url 編碼格式的輔助方法。
MakeRestRequest 對指定的 URL 執行 HTTP 請求。
ClearHeaders 清除使用 AddHeader 新增的任何自訂標題。
AddHeader 向 HTTP 請求新增自訂標題。
MakeTwitterOauthRequest 構造一個與 Twitter 通訊的特殊請求。
GetSalesForceOAuthToken 產生 SalesForce.com 所要求的特殊授權權杖。