受支援的網頁服務
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
當每個成員被指定地址時,它將被自動建立。因此,Name、Phone 和 Address 成員現在將作為員工變數的屬性。
動態變數成員區分大小寫。因此,employee.Name 與 employee.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)。
以下是 Studio 的 Snippet 屬性編輯器中的「偵測器」標籤。它顯示帶有頂級陣列的動態變數:
透過將元素移動到名為 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
要檢查的 2 個變數是 x 和 y。第一個 x 是一個包含動態變數陣列的普通指令碼變數。第二個 y 是一個動態變數,它是一個頂級陣列。在「偵測器」中兩者看起來相似:
雖然它們看起來很相似,但它們並不相同。下一節討論動態變數的序列化概念。重要的一點是,在上面的示例中,X 不能像 Y 那樣用於與遙距系統進行交互操作。X 不可序列化,但 Y 可序列化。
序列化
在討論序列化之前,與普通指令碼變數相比,說明如何與動態變數互動是很有幫助的。普通變數有一個很長的內建方法清單,用於進行字串剖析、轉換為日期、排序等操作。點擊下面的下拉式清單以檢視許多如何與動態變數互動的示例。

語法:
<variable>.method(<parameters>) Examples: name = " sam " g = name.length() h = name.trim() i = name.mid(2,3) j = name.contains("sam") k = name.indexof("sam")
當使用動態變數時,只要引用一個不存在的成員,就會自動建立該成員。如果 Y 是一個動態變數,表達式 y.length 將引用一個名為「length」的成員並自動建立它(因為它還不存在),從而阻止您使用 length 方法。為了進行管理,使用了一個名為 $value 的特殊動態變數成員。$value 成員將不會建立新的動態成員。相反,它將返回使用 $value 的成員的字串常值。從 $value,您可以使用常規的方法集,如下所示:
DYNAMIC name name.First = "sam " g = name.First.$value.length() h = name.First.$value.trim() i = name.First.$value.mid(2,3) j = name.First.$value.contains("sam") k = name.First.$value.indexof("sam")
注意,不能有一個只包含簡單值的動態變數(name = “ sam “ 將把 name 變成一個常規指令碼變數)。同樣,您不能指派 $value 成員。它是動態變數的唯讀屬性。如果您試圖指派 name.$value = “sam”,您會得到一個錯誤。$Value 成員還有另一個重要目的。當將動態變數成員複製到常規指令碼變數時,不使用 $value,只需建立一個新的動態變數:
DYNAMIC name name.First = "Sam" x = name.First
因為 First 是一個動態變數的成員,所以 x 會自動成為一個動態變數(如果您計劃用額外的成員擴展 x,或者更常見的情況是,如果您正在對其進行指派的成員有自己的子成員,這可能會很有用)。下面的示例說明了這個問題:
c = x.indexof("a") // Fails to compile!c = x.$value.indexof("a") // works
但如果用 name.First.$value 代替,新變數將是正常的:
DYNAMIC name name.First = "Sam" x = name.First.$value c = x.indexof("a") // Works!c = x.$value.indexof("a") // Fails to compile
使用動態變數的優點之一是序列化的強大功能。這是將對象轉換為適合在網絡上傳輸的文字格式的能力。目前支援 2 種格式:XML 和 JSON。如果使用 RestProxy(本節前面討論過),序列化過程將自動發生。如果您需要手動產生序列化字串,有 2 個字串方法提供:
<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()
然後在新一行中,輸入代理,後跟句號 (.):
Intelli-Prompt 系統會自動顯示一個包含可用成員的清單方塊。一旦選擇了一個方法,輸入左括號將再次啟用 Intelli-Prompt 系統,以顯示參數:
屬性
屬性 | 詳細資訊 |
---|---|
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 所要求的特殊授權權標。 |