class HTTPRequest {
static func request(urlStr: String, parameters: [String: String], completion: @escaping (_ data: Data?,_ response: URLResponse?, _ error: Error?) -> ()) {
var url = OpenExchange.base_URL + urlStr
url += getParameters(param: parameters)
let request = URLRequest(url: URL(string: url)!)
let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
if error != nil {
print("URLSession Error: \(String(describing: error?.localizedDescription))")
completion(nil,nil,error)
} else {
completion(data,response,nil)
}
}
task.resume()
}
static func getParameters(param: [String: String]) -> String {
var data = [String]()
for (key,value) in param {
data.append(key + "=\(value)")
}
return data.map { String($0) }.joined(separator: "&")
}
}
static func networkOperation(urlStr: String, parameters: [String: String], completion: @escaping (ReturnedData) -> () ) {
var recieved = ReturnedData()
HTTPRequest.request(urlStr: urlStr, parameters: parameters) { (data, resp, err) in
if let data = data, let response = resp {
// TODO: try JSONDecoder() if data is API Error Struct; Moderate this section depending on results of decoding;
recieved.data = data
recieved.response = response
recieved.result = .Success
completion(recieved)
return
} else if err == nil {
recieved.result = .ErrorUnknown
completion(recieved)
return
}
recieved.error = err as NSError?
completion(recieved)
}
}
public struct ReturnedData {
public var data: Data?
public var response: URLResponse?
public var error: Error?
public var result: RequestResult = .ErrorHTTP
}
public enum RequestResult: String {
case Success
case ErrorAPI
case ErrorHTTP
case ErrorUnknown
}
{
"error": true,
"status": 401,
"message": "invalid_app_id",
"description": "Invalid App ID provided - please sign up at https://openexchangerates.org/signup, or contact support@openexchangerates.org."
}
您应该让API错误返回错误对象。
例如。你可以做:
enum NetworkRequestError: Error {
case api(_ status: Int, _ code: ApiResultCode, _ description: String)
}
其中,您将响应编码到名为apiResultCode
的枚举中,如下所示:
enum ApiResultCode {
case invalidAppId
case recordNotFound // just an example
...
case unknown(String)
}
extension ApiResultCode {
static func code(for string: String) -> ApiResultCode {
switch string {
case "invalid_app_id": return .invalidAppId
case "record_not_found": return .recordNotFound
...
default: return .unknown(string)
}
}
}
此枚举使您可以检查
消息
代码,而不会在代码中乱放字符串文本。
if responseObject.error {
let error = NetworkRequestError.api(responseObject.status, ApiResultCode.code(for: responseObject.message), responseObject.description)
... now pass this `error`, just like any other `Error` object
}
null
public enum Result {
case success(Data)
case failure(Error)
}
public enum Result<T, U> {
case success(T)
case failure(U)
}
enum NetworkRequestError: Error {
case api(_ status: Int, _ code: ApiResultCode, _ description: String)
case unknown(Data?, URLResponse?)
}
static func request(urlString: String, parameters: [String: String], completion: @escaping (Result<Data, Error>) -> ()) {
let request = URLRequest(url: URL(string: urlString)!)
let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let responseData = data, error == nil else {
completion(.failure(error ?? NetworkRequestError.unknown(data, response)))
return
}
completion(.success(responseData))
}
task.resume()
}
request(...) { result in
switch result {
case .failure(let error):
// do something with `error`
case .success(let data):
// do something with `data`
}
}
func retrieveFoo(completion: @escaping (Result<Foo, Error>) -> Void) {
request(...) { result in
switch result {
case .failure(let error):
completion(.failure(error))
case .success(let data):
do {
let responseObject = try JSONDecoder().decode(ResponseObject.self, from: data)
if responseObject.error {
completion(.failure(NetworkRequestError.api(responseObject.status, ApiResultCode.code(for: responseObject.message), responseObject.description)))
return
}
let foo = responseObject.foo
completion(.success(foo))
} catch {
completion(.failure(error))
}
}
}
}
retrieveFoo { result in
switch result {
case .failure(NetworkRequestError.api(_, .recordNotFound, _)):
// handle specific “record not found” error here
case .failure(let error):
// handle all other errors here
case .success(let foo):
// do something with `foo`
}
}
我的问题是,我在java iso客户端和测试服务器之间有ssl连接。连接正常,握手没有问题,但服务器接收到不正确的数据。 正如我在日志服务器中看到的,在一次读取操作期间只接收部分数据,并且输入流中也存在一些奇怪的数据-可能与证书信息有关。 请注意,如果没有ssl,此客户端和服务器工作时不会出现任何问题。而且,当我用java keyTool简单地创建jks标准证书时,一切都正常,问题也不会发生。 但
我们在我们的项目中使用连接池。我们在我们的项目中看到,在连接关闭后,语句也会关闭。我知道在连接池的情况下,连接关闭后,到数据库的物理连接不会关闭,而是返回到池进行重用。所以我的问题是: 如果在连接关闭后关闭语句会发生什么?语句是否会正确关闭/关闭连接是否会关闭所有语句,关闭语句是多余的/语句是打开的,尽管连接返回到池中,但由于打开语句,它是不可重用的?(我们同时使用Statement和Prepar
我有一些问题,因为文件不清楚… 如何设置WSO2 ESB环境,使其能够读写来自WSO2MessageBroker的消息。 我跟踪了ConfigurewithWSO2MessageBroker null 我的代理人 我的SOAP UI调用 根据doc,我应该在JMS message Broker中看到消息,但我得到了 第二:此错误是否与消息生成器和格式化程序有关???? 任何帮助都很好...但我被困
问题内容: 用RefluxJS异步初始化数据的正确方法是什么?是否有类似于AngularJS的解决方案,或者Flux的实现与此无关(路由器应该处理此职责)? 问题答案: 在应用程序的顶级组件中,使用方法(docs)触发获取数据的操作。最初渲染组件时将调用此方法。 例如:
本文向大家介绍浅谈PHP接收POST数据方式,包括了浅谈PHP接收POST数据方式的使用技巧和注意事项,需要的朋友参考一下 通常情况下用户使用浏览器网页表单向服务器post提交数据,我们使用PHP接收用户POST到服务器的数据,并进行适当的处理。但有些情况下,如用户使用客户端软件向服务端php程序发送post数据,而不能用$_POST来识别,那又该如何处理呢? $_POST方式接收数据 $_POS
本文向大家介绍php无法连接mysql数据库的正确解决方法,包括了php无法连接mysql数据库的正确解决方法的使用技巧和注意事项,需要的朋友参考一下 即使连接Mysql的语句正确,php也无法连接mysql数据库,出现如下图所示的结果: 首先是在Apache服务器的conf/httpd.conf下的任意位置都没有:PHPIniDir "php压缩目录"这一项。 如"C:/php-5.4.43-W