你遇到过的请求有多奇怪?
{
"code":"200",
"data":{
"list":[
{
"name":"名字",
"id":1,
"detail":"详情",
}
],
"total":1
},
"describe":"",
"errorData":{
},
"json":"",
"message":"",
"name":""
}
还算可以是吧,突然下个模块请求返回变化了
{
"code": "200",
"data": [
{
"reason": "原因",
"time": "时间"
}
],
"describe": "",
"errorData": {},
"json": "",
"message": "",
"name": ""
}
麻烦点也还能接受是不是?
然后发现随着后台人员变更越来越多妖魔鬼怪出来了,
1.成功的返回"code": "200" 或者 "code": 200 或者 "code": ""
2.错误信息 message 和 msg 混着用
3.翻页list数组 下个人就起名叫 records 了
又或者post请求需要把参数拼接在地址后,等等等。
曾经我也因为这些问题把代码写的奇形怪状,各种奇怪的判断终于让以前的网络框架呆的就像个木头。为什么不能将这些问题隔离,把清爽的请求留给自己使用?
Neptune
Neptune是我封装的一个自己使用的网络层,你将得到什么?
API.home.getProductList(by: HomeController.ProductListParam(page: 1, sortFlag: 1)).onSuccess { result in
}.onError { error in
}
是不是很难想象这样的代码可以接收上述的所有奇葩问题?是不是我做了很多处理?让我们看看getProductList的创建步骤,看看有多简单。
第一步,起个请求的总名
class API {
}
or
随便
第二步,创建模块给API使用
extension API {
typealias home = HomeController
}
class HomeController {
...
}
第三步,创建getProductList到home模块里
struct ProductListParam: Codable {
var page: Int
var sortFlag: Int
}
static func getProductList(by param: ProductListParam) -> NPRequest<PageResult<Product>> {
return NPRequest("indexController/getProducts", payload: param).isEncodedURLRequest(false).method(.get)
}
//面对奇葩的返回数据可以通过自定义PageResult来处理data返回中字段不统一问题
public struct LivePageResultType<T: Codable>: Codable {
public var records: [T] = [T]()
public var total: Int
}
//使用直接替换就可以 从list到records
static func getProductList(by param: ProductListParam) -> NPRequest<LivePageResultType<Product>> {
return NPRequest("indexController/getProducts", payload: param).isEncodedURLRequest(false).method(.get)
}
//data返回数组时,只需更改返回类型NPRequest<[Product]>
static func getProductList(by param: ProductListParam) -> NPRequest<[Product]> {
return NPRequest("huamulanappshop/indexController/getProducts", payload: param).isEncodedURLRequest(false).method(.get)
}
调用时就可以像之前说的那样简单清晰的调用。
提供一种实现思路,感兴趣可以看看
项目地址github.com/Benzoudeliu…,比较早期的代码了,欢迎讨论