你能多快创建一个请求

59 阅读2分钟

你遇到过的请求有多奇怪?

{  
    "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…,比较早期的代码了,欢迎讨论