【问题标题】:Using Freshdesk API from Swift 2.2使用 Swift 2.2 中的 Freshdesk API
【发布时间】:2016-09-15 10:44:40
【问题描述】:

我正在尝试使用来自 Swift 2.2 程序 (Here's the API) 的 API 从 FreshDesk 检索所有票证

以下 curl 有效:

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":"您必须登录才能执行此操作。"})

但我确信用户名/密码是正确的,因为 curl 有效

【问题讨论】:

    标签: http swift2 freshdesk


    【解决方案1】:

    this answer 的帮助下,我也可以在没有 Alamofire 的情况下使用它

    以下是 Swift 3

    如何取回工单

    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()
        }
    }
    

    如何发布票证

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

    【讨论】:

      【解决方案2】:

      好的,我自己想出来的,以防其他人也想这样做...... 我正在使用 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)
                  }
          }
      }
      

      这里是张贴票

      的方法
      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")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-09
        • 2016-10-16
        • 1970-01-01
        相关资源
        最近更新 更多