使用 Swift 2.2 中的 Freshdesk API
Using Freshdesk API from Swift 2.2
我正在尝试使用 Swift 2.2 程序 (Here's the API)
中的 API 从 FreshDesk 检索所有票证
以下卷曲有效:
curl -v -u myEmail@example.com:myPassword -X GET 'https://mydomain.freshdesk.com/api/v2/tickets'
并且我创建了这个函数来检索门票:
func getAllTickets() {
let username = "myEmail@example.com"
let password = "myPassword"
let loginString = "\(username):\(password)"
let loginData = loginString.data(using: .utf8)
let base64LoginString = loginData?.base64EncodedString(options: [])
if let url = NSURL(string: "https://mydomain.freshdesk.com/api/v2/tickets"){
let request = NSMutableURLRequest(url: url as URL)
request.httpMethod = "GET"
request.setValue("Basic \(base64LoginString)", forHTTPHeaderField: "Authorization")
let session = URLSession.shared
session.dataTask(with: request as URLRequest, completionHandler: { (returnData, response, error) -> Void in
if let error = error {
// couldn't even make the call - probably no network...
// maybe save it in the DB for next time?
print("Error connecting to Freshdesk API - error is: \(error.localizedDescription)")
if error.localizedDescription == "The Internet connection appears to be offline" {
// TODO - save error up until next time
}
return
}
let strData = NSString(data: returnData!, encoding: String.Encoding.utf8.rawValue)
print("GOT RESULT: \(strData)")
}).resume()
}
}
我得到的输出是:
GOT RESULT: Optional({"code":"invalid_credentials","message":"您必须登录才能执行此操作。"})
但我确信 username/password 是正确的,因为 curl 有效
好吧,我自己想出来了,以防万一其他人也在尝试这样做...
我正在使用 Alamofire 进行联网。它是 Alamofire (3.4.???) 的稍旧版本,因为 cocoapods 认为这是 OSX 的最新版本。因此,如果使用 4.x,您可能需要稍微更新 Alamofire 调用 - 虽然
应该不难
请注意,使用 Alamofire 身份验证对我不起作用,这就是我自己构建 base64Credentials 的原因
下面是如何取票
func retrieveFreshdeskTickets() {
let user = "yourFreshDeskEmail@whatever.com"
let password = "yourFreshDeskPassword"
let credentialData = "\(user):\(password)".dataUsingEncoding(NSUTF8StringEncoding)!
let base64Credentials = credentialData.base64EncodedStringWithOptions([])
let headers = ["Authorization": "Basic \(base64Credentials)"]
let freshDeskEndPoint: String = "https://yourDomainName.freshdesk.com/api/v2/tickets"
Alamofire.request(.GET, freshDeskEndPoint, headers: headers)
.responseJSON { response in
guard response.result.error == nil else {
print("error retrieving freshdesk tickets")
print(response.result.error!)
return
}
if let value = response.result.value {
// print the tickets
print(value)
}
}
}
下面是如何post买票
func raiseFreshdeskTicket(description: String,
subject: String,
usersEmail: String,
priority: Int,
status: Int,
ccEmails: [String],
type: String ) {
let user = "yourFreshDeskEmail@whatever.com"
let password = "yourFreshDeskPassword"
let credentialData = "\(user):\(password)".dataUsingEncoding(NSUTF8StringEncoding)!
let base64Credentials = credentialData.base64EncodedStringWithOptions([])
let headers = ["Authorization": "Basic \(base64Credentials)"]
let parameters = [
"description": description,
"subject": subject,
"email": usersEmail,
"priority": priority ,
"status": status,
"cc_emails": ccEmails,
"type": type
] as [String : AnyObject]
let freshDeskEndPoint: String = "https://yourDomainName.freshdesk.com/api/v2/tickets"
Alamofire.request(.POST, freshDeskEndPoint, headers: headers, parameters: parameters, encoding: .JSON)
.responseJSON { response in
guard response.result.error == nil else {
print("error calling adding freshdesk ticket")
print(response.result.error!)
return
}
if let value = response.result.value {
print(value)
}
}
}
下面是调用 post 函数的示例
let errorDescription = "Log from program - this is what went wrong"
raiseFreshdeskTicket(errorDescription, subject: "Automated Error report from <your program name>", usersEmail: "yourAppUser@zing.com", priority: 1, status: 2, ccEmails: [], type: "Problem")
在 this answer
的帮助下,我在没有 Alamofire 的情况下也能正常工作
以下是Swift3
如何检索票证
func getAllTickets() {
let user = "yourFreshDeskEmail.example.com"
let password = "yourFreshDeskPassword"
let credentialData = "\(user):\(password)".data(using: String.Encoding.utf8)!
let base64Credentials = credentialData.base64EncodedString(options: [])
if let url = NSURL(string: "https://yourdomainname.freshdesk.com/api/v2/tickets"){
let request = NSMutableURLRequest(url: url as URL)
request.httpMethod = "GET"
request.setValue("Basic \(base64Credentials)", forHTTPHeaderField: "Authorization")
let session = URLSession.shared
session.dataTask(with: request as URLRequest, completionHandler: { (returnData, response, error) -> Void in
if let error = error {
print("Error connecting to Freshdesk API - error is: \(error.localizedDescription)")
if error.localizedDescription == "The Internet connection appears to be offline" {
// Handle error
}
return
}
let strData = NSString(data: returnData!, encoding: String.Encoding.utf8.rawValue)
print("GOT RESULT: \(strData)")
}).resume()
}
}
如何Post买票
func raiseFreshdeskTicket(description: String,
subject: String,
usersEmail: String,
priority: Int,
status: Int,
ccEmails: [String],
type: String ) {
let json = [ "description" : description, "subject" : subject, "email" : usersEmail,"priority" : priority, "status" : status, "cc_emails" : ccEmails, "type": type ] as [String : Any]
do {
let user = "yourFreshDeskEmail.example.com"
let password = "yourFreshDeskPassword"
let credentialData = "\(user):\(password)".data(using: String.Encoding.utf8)!
let base64Credentials = credentialData.base64EncodedString(options: [])
let jsonData = try JSONSerialization.data(withJSONObject: json, options: .prettyPrinted)
// create post request
let url = NSURL(string: "https://yourdomainname.freshdesk.com/api/v2/tickets")!
let request = NSMutableURLRequest(url: url as URL)
request.httpMethod = "POST"
// insert json data to the request
request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")
request.setValue("Basic \(base64Credentials)", forHTTPHeaderField: "Authorization")
request.httpBody = jsonData
let task = URLSession.shared.dataTask(with: request as URLRequest){ data, response, error in
if error != nil{
print("Error -> \(error)")
return
}
do {
let result = try JSONSerialization.jsonObject(with: data!, options: []) as? [String:AnyObject]
print("Result -> \(result)")
} catch {
print("Error -> \(error)")
}
}
task.resume()
// return task
} catch {
print(error)
}
}
我正在尝试使用 Swift 2.2 程序 (Here's the API)
中的 API 从 FreshDesk 检索所有票证以下卷曲有效:
curl -v -u myEmail@example.com:myPassword -X GET 'https://mydomain.freshdesk.com/api/v2/tickets'
并且我创建了这个函数来检索门票:
func getAllTickets() {
let username = "myEmail@example.com"
let password = "myPassword"
let loginString = "\(username):\(password)"
let loginData = loginString.data(using: .utf8)
let base64LoginString = loginData?.base64EncodedString(options: [])
if let url = NSURL(string: "https://mydomain.freshdesk.com/api/v2/tickets"){
let request = NSMutableURLRequest(url: url as URL)
request.httpMethod = "GET"
request.setValue("Basic \(base64LoginString)", forHTTPHeaderField: "Authorization")
let session = URLSession.shared
session.dataTask(with: request as URLRequest, completionHandler: { (returnData, response, error) -> Void in
if let error = error {
// couldn't even make the call - probably no network...
// maybe save it in the DB for next time?
print("Error connecting to Freshdesk API - error is: \(error.localizedDescription)")
if error.localizedDescription == "The Internet connection appears to be offline" {
// TODO - save error up until next time
}
return
}
let strData = NSString(data: returnData!, encoding: String.Encoding.utf8.rawValue)
print("GOT RESULT: \(strData)")
}).resume()
}
}
我得到的输出是: GOT RESULT: Optional({"code":"invalid_credentials","message":"您必须登录才能执行此操作。"})
但我确信 username/password 是正确的,因为 curl 有效
好吧,我自己想出来了,以防万一其他人也在尝试这样做... 我正在使用 Alamofire 进行联网。它是 Alamofire (3.4.???) 的稍旧版本,因为 cocoapods 认为这是 OSX 的最新版本。因此,如果使用 4.x,您可能需要稍微更新 Alamofire 调用 - 虽然
应该不难请注意,使用 Alamofire 身份验证对我不起作用,这就是我自己构建 base64Credentials 的原因
下面是如何取票
func retrieveFreshdeskTickets() {
let user = "yourFreshDeskEmail@whatever.com"
let password = "yourFreshDeskPassword"
let credentialData = "\(user):\(password)".dataUsingEncoding(NSUTF8StringEncoding)!
let base64Credentials = credentialData.base64EncodedStringWithOptions([])
let headers = ["Authorization": "Basic \(base64Credentials)"]
let freshDeskEndPoint: String = "https://yourDomainName.freshdesk.com/api/v2/tickets"
Alamofire.request(.GET, freshDeskEndPoint, headers: headers)
.responseJSON { response in
guard response.result.error == nil else {
print("error retrieving freshdesk tickets")
print(response.result.error!)
return
}
if let value = response.result.value {
// print the tickets
print(value)
}
}
}
下面是如何post买票
func raiseFreshdeskTicket(description: String,
subject: String,
usersEmail: String,
priority: Int,
status: Int,
ccEmails: [String],
type: String ) {
let user = "yourFreshDeskEmail@whatever.com"
let password = "yourFreshDeskPassword"
let credentialData = "\(user):\(password)".dataUsingEncoding(NSUTF8StringEncoding)!
let base64Credentials = credentialData.base64EncodedStringWithOptions([])
let headers = ["Authorization": "Basic \(base64Credentials)"]
let parameters = [
"description": description,
"subject": subject,
"email": usersEmail,
"priority": priority ,
"status": status,
"cc_emails": ccEmails,
"type": type
] as [String : AnyObject]
let freshDeskEndPoint: String = "https://yourDomainName.freshdesk.com/api/v2/tickets"
Alamofire.request(.POST, freshDeskEndPoint, headers: headers, parameters: parameters, encoding: .JSON)
.responseJSON { response in
guard response.result.error == nil else {
print("error calling adding freshdesk ticket")
print(response.result.error!)
return
}
if let value = response.result.value {
print(value)
}
}
}
下面是调用 post 函数的示例
let errorDescription = "Log from program - this is what went wrong"
raiseFreshdeskTicket(errorDescription, subject: "Automated Error report from <your program name>", usersEmail: "yourAppUser@zing.com", priority: 1, status: 2, ccEmails: [], type: "Problem")
在 this answer
的帮助下,我在没有 Alamofire 的情况下也能正常工作以下是Swift3
如何检索票证
func getAllTickets() {
let user = "yourFreshDeskEmail.example.com"
let password = "yourFreshDeskPassword"
let credentialData = "\(user):\(password)".data(using: String.Encoding.utf8)!
let base64Credentials = credentialData.base64EncodedString(options: [])
if let url = NSURL(string: "https://yourdomainname.freshdesk.com/api/v2/tickets"){
let request = NSMutableURLRequest(url: url as URL)
request.httpMethod = "GET"
request.setValue("Basic \(base64Credentials)", forHTTPHeaderField: "Authorization")
let session = URLSession.shared
session.dataTask(with: request as URLRequest, completionHandler: { (returnData, response, error) -> Void in
if let error = error {
print("Error connecting to Freshdesk API - error is: \(error.localizedDescription)")
if error.localizedDescription == "The Internet connection appears to be offline" {
// Handle error
}
return
}
let strData = NSString(data: returnData!, encoding: String.Encoding.utf8.rawValue)
print("GOT RESULT: \(strData)")
}).resume()
}
}
如何Post买票
func raiseFreshdeskTicket(description: String,
subject: String,
usersEmail: String,
priority: Int,
status: Int,
ccEmails: [String],
type: String ) {
let json = [ "description" : description, "subject" : subject, "email" : usersEmail,"priority" : priority, "status" : status, "cc_emails" : ccEmails, "type": type ] as [String : Any]
do {
let user = "yourFreshDeskEmail.example.com"
let password = "yourFreshDeskPassword"
let credentialData = "\(user):\(password)".data(using: String.Encoding.utf8)!
let base64Credentials = credentialData.base64EncodedString(options: [])
let jsonData = try JSONSerialization.data(withJSONObject: json, options: .prettyPrinted)
// create post request
let url = NSURL(string: "https://yourdomainname.freshdesk.com/api/v2/tickets")!
let request = NSMutableURLRequest(url: url as URL)
request.httpMethod = "POST"
// insert json data to the request
request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")
request.setValue("Basic \(base64Credentials)", forHTTPHeaderField: "Authorization")
request.httpBody = jsonData
let task = URLSession.shared.dataTask(with: request as URLRequest){ data, response, error in
if error != nil{
print("Error -> \(error)")
return
}
do {
let result = try JSONSerialization.jsonObject(with: data!, options: []) as? [String:AnyObject]
print("Result -> \(result)")
} catch {
print("Error -> \(error)")
}
}
task.resume()
// return task
} catch {
print(error)
}
}