如何从 API 发送错误

Posted

技术标签:

【中文标题】如何从 API 发送错误【英文标题】:How to send error from API 【发布时间】:2015-10-10 17:28:26 【问题描述】:

我正在编写一个 WEB API。

但是,即使有错误,在 swift 代码中,在 Alamofire 请求中,“isSuccess”始终等于 true。

我应该在 JSON 中发送什么来让 Alamofire 检测到有错误? (is.Failure = true)。

服务器向我发送错误代码 404,但它看起来总是成功:

      Alamofire.request(.GET, Constants.Path.rootUrl + "/api/users", parameters: ["username" : usernameString, "limit":3] , headers: ["tb-token" : userToken!])
            .responseJSON  _, _, result in


                print(result.value)

                switch result 
                case .Success(let JSON):
                    print("Success with JSON: \(JSON)")
                    self.tableView.hidden = false

                    self.resultsDict = result.value as! NSArray

                    let results = result.value
                    let resultsNumber = results!.count

                    self.numberOfResults.text = "Results(\(resultsNumber))"
                    self.numberOfResults.hidden = false

                    self.resultsN = resultsNumber
                    self.loadedMode = true


                    self.tableView.reloadData()
                    self.tableView.hidden = false
                case .Failure(let data, let error):
                    print((error as NSError).localizedDescription)
                

        

[编辑] 我已经上传到 Alamofire 3.0,但我仍然遇到同样的问题。 这是新代码:

         Alamofire.request(.GET, Constants.Path.rootUrl + "/api/users", parameters: ["username" : usernameString, "limit":3] , headers: ["tb-token" : userToken!])
            .responseJSON  response in


                print(response.request)  // original URL request
                print(response.response) // URL response
                print(response.data)     // server data
                print(response.result)   // result of response serialization


                let results = response.result

                if let JSON = response.result.value 

                    if response.result.isSuccess == true 
                        print("Success with JSON: \(JSON)")
                        self.tableView.hidden = false

                        self.resultsDict = results.value as! NSArray

                        let resultsNumber = results.value!.count

                        self.numberOfResults.text = "Results(\(resultsNumber))"
                        self.numberOfResults.hidden = false

                        self.resultsN = resultsNumber
                        self.loadedMode = true


                        self.tableView.reloadData()
                        self.tableView.hidden = false
                    
                
                    else print("error")

        

这里是 response.response:

Optional(<NSHTTPURLResponse: 0x7fa1bb216a50>  URL: http://teambuilding-adall.rhcloud.com/api/users?limit=3&username=adallo   status code: 404, headers 
"Access-Control-Allow-Origin" = "*";
Connection = "Keep-Alive";
"Content-Length" = 60;
"Content-Type" = "application/json; charset=utf-8";
Date = "Sat, 10 Oct 2015 23:32:13 GMT";
Etag = "W/\"3c-dR4AnAjVi0TRWls1iKAm7w\"";
"Keep-Alive" = "timeout=15, max=60";
"X-Powered-By" = Express;
 )

[最终编辑] 我通过添加这两行代码解决了这个问题:

.validate(statusCode: 200..<300)
.validate(contentType: ["application/json"])

【问题讨论】:

添加您的完整代码 添加了代码! @约翰尼 可以添加print(response.response)的输出吗? 添加到问题中! @EricD。 但我正在检查 isSuccess,它应该只取决于响应代码,而不管内容如何......@EricD。 【参考方案1】:

从浏览 Alamofire GitHub 页面以及一般实践中,您应该发送一个非 200 状态代码来指示失败。具体的状态码应该与错误的类型或原因相对应。

通常您会发送一个 4xx 状态码(例如 400、403、404、409)。阅读此处发送的状态码:http://www.restapitutorial.com/httpstatuscodes.html

【讨论】:

它不是那样工作的。反正我已经添加了代码。

以上是关于如何从 API 发送错误的主要内容,如果未能解决你的问题,请参考以下文章

如何从已发送的电子邮件中检索(google api)

向Tomcat发送POST请求时如何解决浏览器中的Javascript fetch API错误?

如何通过 JSON 向服务器发送 API 请求?不断收到 CORS 错误

如何从 API 发送 aspx 页面作为响应?

当 API 中未发送必填字段值时,如何在 swagger 中自定义错误消息?

你如何从和 api 获取信息并发送 discord.py