测试已测试 | ✗ |
语言语言 | SwiftSwift |
许可证 | MIT |
发布最后发布 | 2017年1月 |
SwiftSwift 版本 | 3.0 |
SPM支持 SPM | ✗ |
由 Phong Vu 维护。
官方客户端库,帮助调用 Haven OnDemand API http://havenondemand.com.
库包含 2 个包
库需要 Swift 3.0。
Haven OnDemand 是一套超过 60 个 API,用于处理各种非结构化数据。以下只是我们的一些 API 功能
要查看所有 API 的完整列表并尝试它们,请查看 https://www.havenondemand.com/developer/apis
创建并初始化 HODClient 对象。
HODClient(apiKey:String, version:String = "v1")
参数
apiKey
您的开发者 API 密钥。version
Haven OnDemand API 版本。目前它仅支持版本 1。因此,默认值是“v1”。示例代码
var hodClient:HODClient = HODClient(apiKey: "your-api-key")
发送 HTTP GET 请求以调用 Haven OnDemand API。
GetRequest(inout params:Dictionary<String, AnyObject>, hodApp:String, async:Bool)
参数
params
一个包含要发送到 Haven OnDemand API 的键/值对参数的字典对象,其中键是该 API 的参数。hodApp
是一个字符串,用于标识 Haven OnDemand API。例如:“extractentities”。当前支持的应用程序列表在 HODApps 对象中。async
指定 API 调用是异步还是同步。对于异步调用,默认值为 true。响应
示例代码
// Call the Entity Extraction API to find people and places from CNN website
var hodApp = hodClient.hodApps.ENTITY_EXTRACTION;
var entities = ["people_eng","places_eng"]
var params = Dictionary<String, AnyObject>()
params["url"] = "http://www.cnn.com"
params["entity_type"] = entities
hodClient.GetRequest(¶ms, hodApp:hodApp, async:false)
向 Haven OnDemand API 发送 HTTP POST 请求。
PostRequest(inout params:Dictionary<String, Object>, hodApp:String, async:Bool)
参数
params
一个包含要发送到 Haven OnDemand API 的键/值对参数的字典对象,其中键是该 API 的参数。hodApp
是一个字符串,用于标识 Haven OnDemand API。例如:“ocrdocument”。当前支持的应用程序列表在 HODApps 对象中。async
指定 API 调用是异步还是同步。对于异步调用,默认值为 true。响应
示例代码
// Call the OCR Document API to scan text from an image file
var hodApp = hodClient.hodApps.OCR_DOCUMENT
var params = Dictionary<String,Object>()
params["file"] = "full/path/filename.jpg"
params["mode"] = "document_photo"
hodClient.PostRequest(¶ms, hodApp:hodApp, async:true)
向组合 API 发送 HTTP GET 请求。
GetRequestCombination(inout params:Dictionary<String,AnyObject>, hodApp:String), async:Bool = true)
参数
params
是一个包含要发送到 Haven OnDemand 组合 API 的键/值对参数的 Dictionary 对象,其中键是该 API 的参数。hodApp
是一个字符串,用于标识 Haven OnDemand 组合 API。async
指定 API 调用是异步还是同步。对于异步调用,默认值为 true。示例代码
// Call a combination API named "ocrtoconcept", which recognizes text from an image and extract the concept of the text.
params["url"] = "http://www.some.domain/review.jpg" as AnyObject
hodClient.GetRequestCombination(¶ms, hodApp:"ocrtoconcept", async: false);
向组合 API 发送 HTTP POST 请求。
PostRequestCombination(inout params:Dictionary<String,AnyObject>, hodApp:String, async:Bool = true)
参数
params
是一个包含要发送到 Haven OnDemand 组合 API 的键/值对参数的 Dictionary 对象,其中键是该 API 的参数。hodApp
是一个字符串,用于标识 Haven OnDemand 组合 API。async
指定 API 调用是异步还是同步。对于异步调用,默认值为 true。响应
示例代码
// Call a combination API named "imagetosentiment", which recognizes text from an image and analyze the sentiment of the text.
var file = Dictionary<String,String>()
file["imageFile"] = "fullpath/image.jpg"
let files:NSMutableArray = []
files.add(file)
var params = Dictionary<String,AnyObject>()
params["file"] = files as AnyObject
hodClient.PostRequestCombination(¶ms, hodApp: "imagetosentiment")
向 Haven OnDemand 发送请求以检索由 jobID 标识的内容。
GetJobResult(jobID:String)
参数
jobID
是在异步调用 Haven OnDemand API 时返回的工作 ID。响应
向 Haven OnDemand 发送请求以检索由 job ID 标识的工作的状态。如果作业已完成,则响应将是该作业的结果。否则,响应将包含作业的当前状态。
GetJobStatus(jobID:String)
参数
jobID
是在异步调用 Haven OnDemand API 时返回的工作 ID。响应
在您的类中,您需要继承 HODClientDelegate 协议并实现委托函数以从服务器接收响应
class MyAppClass : HODClientDelegate {
hodClient.delegate = self
func requestCompletedWithJobID(_ response:String){ }
func requestCompletedWithContent(_ response:String){ }
func onErrorOccurred(_ errorMessage:String){ }
}
当您以 ASYNC 模式调用 GetRequest() 或 PostRequest() 时,响应将返回到此回调函数。响应是一个包含 jobID 的 JSON 字符串。
func requestCompletedWithJobID(_ response:String)
{
}
当您以 SYNC 模式调用 GetRequest() 或 PostRequest() 或调用 GetJobResult() 函数时,响应将返回到此回调函数。响应是一个包含服务实际结果的 JSON 字符串。
func requestCompletedWithContent(_ response:String)
{
}
如果发生错误,错误消息将返回到此回调函数。
func onErrorOccurred(_ errorMessage:String)
{
}
创建并初始化一个 HODResponseParser 对象。
HODResponseParser()
示例代码
var hodParser:HODResponseParser = HODResponseParser()
从一个异步 API 调用返回的 JSON 字符串中解析 jobID。
ParseJobID(jsonStr:String) -> String?
参数
jsonStr
是一个异步 API 调用返回的 JSON 字符串。返回值
示例代码
func requestCompletedWithJobID(_ response:String) {
let jobID : String? = hodParser.ParseJobID(response)
if jobID != nil {
hodClient.GetJobStatus(jobID!)
}
}
解析 Haven OnDemand 语音识别 API 的 JSON 响应,并返回一个 SpeechRegconitionResponse 对象。
ParseSpeechRecognitionResponse(jsonStr) -> SpeechRecognitionResponse?
注意:请参阅本文件末尾的“标准解析函数”部分的完整标准解析函数列表。
参数
jsonStr
是从同步 API 调用或 GetJobResult() 或 GetJobStatus() 函数返回的 JSON 字符串。返回值
示例代码
func requestCompletedWithContent(_ response:String) {
if let resp = (hodParser.ParseSentimentAnalysisResponse(response)) {
var result = "Positive:\n"
for item in resp.positive {
let i = item as! SentimentAnalysisResponse.Entity
result += "Sentiment: " + i.sentiment + "\n"
result += "Score: " + String(format:"%.6f",i.score) + "\n"
result += "Topic: " + i.topic + "\n"
result += "Statement: " + i.original_text + "\n"
result += "Length: " + String(format:"%d",i.original_length) + "\n"
result += "------\n"
}
result += "Negative:\n"
for item in resp.negative {
let i = item as! SentimentAnalysisResponse.Entity
result += "Sentiment: " + i.sentiment + "\n"
result += "Score: " + String(format:"%.6f",i.score) + "\n"
result += "Topic: " + i.topic + "\n"
result += "Statement: " + i.original_text + "\n"
result += "Length: " + String(format:"%d",i.original_length) + "\n"
result += "------\n"
}
result += "Aggregate:\n"
result += "Sentiment: " + resp.aggregate.sentiment + "\n"
result += "Score: " + String(format:"%.6f",resp.aggregate.score)
// print or consume result
} else {
let errors = hodParser.GetLastError()
var errorStr = ""
for error in errors {
let err = error as! HODErrorObject
errorMsg = String(format: "Error code: %d\n", err.error)
errorMsg += String(format: "Error reason: %@\n", err.reason)
errorMsg += String(format: "Error detail: %@\n", err.detail)
errorMsg += String(format: "JobID: %@\n", err.jobID)
print(errorMsg)
if err.error == HODErrorCode.QUEUED { // queues
// sleep for a few seconds then check the job status again
hodClient.GetJobStatus(err.jobID)
break
} else if err.error == HODErrorCode.IN_PROGRESS { // in progress
// sleep for for a while then check the job status again
hodClient.GetJobStatus(err.jobID)
break
}
}
}
}
解析 JSON 字符串,并将结果作为 NSDictionary 对象返回。您需要定义一个自定义类,并将结果解析到该类中。以下是更多详细信息的示例。
ParseCustomResponse(jsonStr: String) -> NSDictionary?
参数
jsonStr
是从同步 API 调用或 GetJobResult() 或 GetJobStatus() 函数返回的 JSON 字符串。返回值
示例代码
// Define a custom class to hold entity extraction API's response
public class EntityExtractionResponse:NSObject {
var entities:NSMutableArray = [];
init(json : NSDictionary) {
super.init()
for (key, value) in json {
let keyName:String = (key as? String)!
if let _ = value as? NSArray {
let keyValue:NSArray = (value as? NSArray)!
if keyName == "entities" {
for item in keyValue {
let p = Entity(json: item as! NSDictionary)
self.entities.addObject(p)
}
}
}
}
}
public class AdditionalInformation:NSObject {
var person_profession:NSMutableArray = []
var person_date_of_birth:String = ""
var wikidata_id:Int = 0
var wikipedia_eng:String = ""
var image:String = ""
var person_date_of_death:String = ""
var lon:Double = 0.0
var lat:Double = 0.0
var place_population:Int = 0
var place_country_code:String = ""
var place_region1:String = ""
var place_region2:String = ""
var place_elevation:Double = 0.0
init(json:NSDictionary) {
super.init()
for (key, value) in json {
let keyName:String = (key as? String)!
if let _ = value as? NSArray {
let keyValue:NSArray = (value as? NSArray)!
for item in keyValue {
if (self.respondsToSelector(NSSelectorFromString(keyName))) {
let c = item as! String
self.person_profession.addObject(c)
}
}
} else {
if (self.respondsToSelector(NSSelectorFromString(keyName))) {
self.setValue(value, forKey: keyName)
}
}
}
}
}
public class Components:NSObject {
var original_length: Int64 = 0
var original_text: String = ""
var type: String = ""
init(json:NSDictionary) {
super.init()
for (key, value) in json {
let keyName:String = (key as? String)!
if (self.respondsToSelector(NSSelectorFromString(keyName))) {
self.setValue(value, forKey: keyName)
}
}
}
}
public class Entity:NSObject {
var normalized_text:String = ""
var original_text:String = ""
var type:String = ""
var normalized_length:Int = 0
var original_length:Int = 0
var score:Double = 0.0
var additional_information:AdditionalInformation?
var components:NSMutableArray = []
init(json: NSDictionary) {
super.init()
for (key, value) in json {
let keyName:String = (key as? String)!
if let _ = value as? NSDictionary {
let keyValue:NSDictionary = (value as? NSDictionary)!
if (self.respondsToSelector(NSSelectorFromString(keyName))) {
self.additional_information = AdditionalInformation(json:keyValue)
}
} else if let _ = value as? NSArray {
let keyValue:NSArray = (value as? NSArray)!
for item in keyValue {
if (self.respondsToSelector(NSSelectorFromString(keyName))) {
let c = Components(json:item as! NSDictionary)
self.components.addObject(c)
}
}
} else {
if (self.respondsToSelector(NSSelectorFromString(keyName))) {
self.setValue(value, forKey: keyName)
}
}
}
}
}
}
// parse json string to a custom data object
func requestCompletedWithContent(_ response:String) {
if let dic = hodParser.ParseCustomResponse(jsonData) {
let obj = EntityExtractionResponse(json:dic)
var result: String = ""
for ent in obj.entities as NSArray as! [EntityExtractionResponse.Entity] {
result += ent.normalized_text + "\n"
result += ent.type + "\n"
// access any other fields
}
// print or consume result
} else {
let errors = hodParser.GetLastError()
var errorMsg = ""
for error in errors {
let err = error as! HODErrorObject
errorMsg = String(format: "Error code: %d\n", err.error)
errorMsg += String(format: "Error reason: %@\n", err.reason)
errorMsg += String(format: "Error detail: %@\n", err.detail)
errorMsg += String(format: "JobID: %@\n", err.jobID)
print(errorMsg)
if err.error == HODErrorCode.QUEUED { // queues
// sleep for a few seconds then check the job status again
hodClient.GetJobStatus(err.jobID)
break
} else if err.error == HODErrorCode.IN_PROGRESS { // in progress
// sleep for for a while then check the job status again
hodClient.GetJobStatus(err.jobID)
break
}
}
}
}
获取在解析 JSON 字符串或从 HOD 服务器返回的 HOD 错误过程中发生的最新错误(如有)。
GetLastError() -> NSMutableArray
注意:作业处于“排队”或“进行中”状态也被视为错误情况。以下示例说明了如何检测和处理错误状态。
返回值
示例代码
let errors = hodParser.GetLastError()
var errorMsg = ""
for error in errors {
let err = error as! HODErrorObject
errorMsg = String(format: "Error code: %d\n", err.error)
errorMsg += String(format: "Error reason: %@\n", err.reason)
errorMsg += String(format: "Error detail: %@\n", err.detail)
errorMsg += String(format: "JobID: %@\n", err.jobID)
print(errorMsg)
if err.error == HODErrorCode.QUEUED { // queues
// sleep for a few seconds then check the job status again
hodClient.GetJobStatus(err.jobID)
break
} else if err.error == HODErrorCode.IN_PROGRESS { // in progress
// sleep for for a while then check the job status again
hodClient.GetJobStatus(err.jobID)
break
}
}
使用实体抽取 API 通过同步 GET 请求从 cnn.com 网站提取人物和地点
class MyAppClass : HODClientDelegate {
var hodClient:HODClient = HODClient(apiKey: "your-api-key")
hodClient.delegate = self
var hodParser:HODResponseParser = HODResponseParser()
var hodApp = ""
func useHODClient() {
var hodApp = hodClient.hodApps.ENTITY_EXTRACTION
var params = Dictionary<String,Object>()
params["url"] = "http://www.cnn.com"
params["entity_type"] = ["people_eng","places_eng"]
params["unique_entities"] = "true"
hodClient.GetRequest(¶ms, hodApp:hodApp, async:false);
}
// implement delegated functions
func requestCompletedWithContent(_ response:String){
if let obj = (hodParser.ParseEntityExtractionResponse(response)) {
var people = ""
var places = ""
for ent in obj.entities as NSArray as! [EntityExtractionResponse.Entity] {
if ent.type == "people_eng" {
people += ent.normalized_text + "\n"
// parse any other interested information about this person ...
}
else if type == "places_eng" {
places += ent.normalized_text + "\n"
// parse any other interested information about this place ...
}
}
}else{
checkErrorInResponse()
}
}
func checkErrorInResponse() {
let errors = hodParser.GetLastError()
var errorStr = ""
for error in errors {
let err = error as! HODErrorObject
errorStr = "Error code: " + String(format: "%d", err.error) + "\n"
errorStr += "Error reason: " + err.reason + "\n"
errorStr += "Error detail: " + err.detail + "\n"
errorStr += "Error jobID: " + err.jobID + "\n"
}
println(errorStr)
}
func onErrorOccurred(errorMessage:String){
// handle error if any
}
}
使用 OCR 文档 API 使用异步 POST 请求从图像中扫描文本
class MyAppClass : HODClientDelegate {
var hodClient:HODClient = HODClient(apiKey: "your-api-key")
var hodParser:HODResponseParser = HODResponseParser()
hodClient.delegate = self
func useHODClient() {
var hodApp = hodClient.hodApps.OCR_DOCUMENT
var params = Dictionary<String,AnyObject>()
params["file"] = "full/path/filename.jpg"
params["mode"] = "document_photo"
hodClient.PostRequest(¶ms, hodApp:hodApp)
}
// implement delegated functions
/**************************************************************************************
* An async request will result in a response with a jobID. We parse the response to get
* the jobID and send a request for the actual content identified by the jobID.
**************************************************************************************/
func requestCompletedWithJobID(_ response:String){
let jobID:String? = hodParser.ParseJobID(response)
if jobID != nil {
hodClient.GetJobStatus(jobID!)
}
}
func requestCompletedWithContent(_ response:String){
if let resp = (hodParser.ParseOCRDocumentResponse(response)) {
var result = "Scanned text:\n"
for item in resp.text_block {
let i = item as! OCRDocumentResponse.TextBlock
result += "Text: " + i.text + "\n"
result += "Top/Left: " + String(format: "%d/%d", i.top, i.left) + "\n"
result += "------\n"
}
// print or consume result
}else{
let errors = hodParser.GetLastError()
var errorMsg = ""
for error in errors {
let err = error as! HODErrorObject
errorMsg = String(format: "Error code: %d\n", err.error)
errorMsg += String(format: "Error reason: %@\n", err.reason)
errorMsg += String(format: "Error detail: %@\n", err.detail)
errorMsg += String(format: "JobID: %@\n", err.jobID)
print(errorMsg)
if err.error == HODErrorCode.QUEUED { // queues
// sleep for a few seconds then check the job status again
hodClient.GetJobStatus(err.jobID)
break
}else if err.error == HODErrorCode.IN_PROGRESS { // in progress
// sleep for for a while then check the job status again
hodClient.GetJobStatus(err.jobID)
break
}
}
}
}
func onErrorOccurred(_ errorMessage:String){
// handle error if any
}
}
ParseSpeechRecognitionResponse(_ jsonStr:String) -> SpeechRecognitionResponse?
ParseDetectSceneChangesResponse(_ jsonStr:String) -> DetectSceneChangesResponse?
ParseLicensePlateRecognitionResponse(_ jsonStr:String) -> LicensePlateRecognitionResponse?
ParseCancelConnectorScheduleResponse(_ jsonStr:String) -> CancelConnectorScheduleResponse?
ParseConnectorHistoryResponse(_ jsonStr:String) -> ConnectorHistoryResponse?
ParseConnectorStatusResponse(_ jsonStr:String) -> ConnectorStatusResponse?
ParseCreateConnectorResponse(_ jsonStr:String) -> CreateConnectorResponse?
ParseDeleteConnectorResponse(_ jsonStr:String) -> DeleteConnectorResponse?
ParseRetrieveConnectorConfigurationFileResponse(_ jsonStr:String) -> RetrieveConnectorConfigurationFileResponse?
ParseRetrieveConnectorConfigurationAttrResponse(_ jsonStr:String) -> RetrieveConnectorConfigurationAttrResponse?
ParseStartConnectorResponse(_ jsonStr:String) -> StartConnectorResponse?
ParseStopConnectorResponse(_ jsonStr:String) -> StopConnectorResponse?
ParseUpdateConnectorResponse(_ jsonStr:String) -> ConnectorResponse?
ParseExpandContainerResponse(_ jsonStr:String) -> ExpandContainerResponse?
ParseStoreObjectResponse(_ jsonStr:String) -> StoreObjectResponse?
ParseViewDocumentResponse(_ jsonStr:String) -> ViewDocumentResponse?
ParseGetCommonNeighborsResponse(_ jsonStr:String) -> GetCommonNeighborsResponse?
ParseGetNeighborsResponse(_ jsonStr:String) -> GetNeighborsResponse?
ParseGetNodesResponse(_ jsonStr:String) -> GetNodesResponse?
ParseGetShortestPathResponse(_ jsonStr:String) -> GetShortestPathResponse?
ParseGetSubgraphResponse(_ jsonStr:String) -> GetSubgraphResponse?
ParseSuggestLinksResponse(_ jsonStr:String) -> SuggestLinksResponse?
ParseSummarizeGraphResponse(_ jsonStr:String) -> SummarizeGraphResponse?
ParseOCRDocumentResponse(_ jsonStr:String) -> OCRDocumentResponse?
ParseRecognizeBarcodesResponse(_ jsonStr:String) -> RecognizeBarcodesResponse?
ParseRecognizeImagesResponse(_ jsonStr:String) -> RecognizeImagesResponse?
ParseDetectFacesResponse(_ jsonStr:String) -> DetectFacesResponse?
ParsePredictResponse(_ jsonStr:String) -> PredictResponse?
ParsePredictV2Response(_ jsonStr:String) -> PredictV2Response?
ParseRecommendResponse(_ jsonStr:String) -> RecommendResponse?
ParseRecommendV2Response(_ jsonStr:String) -> RecommendV2Response?
ParseTrainPredictionResponse(_ jsonStr:String) -> TrainPredictionResponse?
ParseTrainPredictionV2Response(_ jsonStr:String) -> TrainPredictionV2Response?
ParseCreateQueryProfileResponse(_ jsonStr:String) -> CreateQueryProfileResponse?
ParseDeleteQueryProfileResponse(_ jsonStr:String) -> DeleteQueryProfileResponse?
ParseRetrieveQueryProfileResponse(_ jsonStr:String) -> RetrieveQueryProfileResponse?
ParseUpdateQueryProfileResponse(_ jsonStr:String) -> UpdateQueryProfileResponse?
ParseFindRelatedConceptsResponse(_ jsonStr:String) -> FindRelatedConceptsResponse?
ParseAutoCompleteResponse(_ jsonStr:String) -> AutoCompleteResponse?
ParseExtractConceptsResponse(_ jsonStr:String) -> ExtractConceptsResponse?
ParseEntityExtractionResponse(_ jsonStr:String) -> EntityExtractionResponse?
ParseEntityExtractionV2Response(_ jsonStr:String) -> EntityExtractionV2Response?
ParseExpandTermsResponse(_ jsonStr:String) -> ExpandTermsResponse?
ParseHighlightTextResponse(_ jsonStr:String) -> HighlightTextResponse?
ParseIdentifyLanguageResponse(_ jsonStr:String) -> IdentifyLanguageResponse?
ParseTokenizeTextResponse(_ jsonStr:String) -> TokenizeTextResponse?
ParseSentimentAnalysisResponse(_ jsonStr:String) -> SentimentAnalysisResponse?
ParseSentimentAnalysisV2Response(_ jsonStr:String) -> SentimentAnalysisV2Response?
ParseAddToTextIndexResponse(_ jsonStr:String) -> AddToTextIndexResponse?
ParseCreateTextIndexResponse(_ jsonStr:String) -> CreateTextIndexResponse?
ParseDeleteTextIndexResponse(_ jsonStr:String) -> DeleteTextIndexResponse?
ParseDeleteFromTextIndexResponse(_ jsonStr:String) -> DeleteFromTextIndexResponse?
ParseIndexStatusResponse(_ jsonStr:String) -> IndexStatusResponse?
ParseListResourcesResponse(_ jsonStr:String) -> ListResourcesResponse?
ParseRestoreTextIndexResponse(_ jsonStr:String) -> RestoreTextIndexResponse?
ParseAnomalyDetectionResponse(_ jsonStr:String) -> AnomalyDetectionResponse?
ParseTrendAnalysisResponse(_ jsonStr:String) -> TrendAnalysisResponse?
许可协议为 MIT 许可。