{"id":21373919,"url":"https://github.com/CodeWeaver13/HLNetworking","last_synced_at":"2025-07-13T08:31:37.610Z","repository":{"id":56913640,"uuid":"69481690","full_name":"CodeWeaver13/HLNetworking","owner":"CodeWeaver13","description":"基于AFNetworking的高阶网络请求管理器","archived":false,"fork":false,"pushed_at":"2017-03-30T13:26:30.000Z","size":1840,"stargazers_count":279,"open_issues_count":2,"forks_count":52,"subscribers_count":8,"default_branch":"master","last_synced_at":"2024-11-21T14:48:40.527Z","etag":null,"topics":["afnetworking","baseurl-domain","block-delegate","cocoapods","formdata"],"latest_commit_sha":null,"homepage":"","language":"Objective-C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/CodeWeaver13.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-09-28T16:19:47.000Z","updated_at":"2024-11-12T08:26:41.000Z","dependencies_parsed_at":"2022-08-20T20:50:27.872Z","dependency_job_id":null,"html_url":"https://github.com/CodeWeaver13/HLNetworking","commit_stats":null,"previous_names":["qiankun-hanlin/hlnetworking","codeweaver13/hlnetworking"],"tags_count":23,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CodeWeaver13%2FHLNetworking","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CodeWeaver13%2FHLNetworking/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CodeWeaver13%2FHLNetworking/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CodeWeaver13%2FHLNetworking/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/CodeWeaver13","download_url":"https://codeload.github.com/CodeWeaver13/HLNetworking/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":225868472,"owners_count":17537043,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["afnetworking","baseurl-domain","block-delegate","cocoapods","formdata"],"created_at":"2024-11-22T08:29:35.507Z","updated_at":"2024-11-22T08:29:56.812Z","avatar_url":"https://github.com/CodeWeaver13.png","language":"Objective-C","readme":"![HLNetworking: High-level network request manager based on AFNetworking](https://raw.githubusercontent.com/QianKun-HanLin/HLNetworking/master/loge.png)\n#### 基于AFNetworking的高阶网络请求管理器\n[![License MIT](https://img.shields.io/badge/license-MIT-green.svg?style=flat)](https://github.com/wangshiyu13/HLQRCodeScanner/blob/master/LICENSE)\n[![CI Status](https://img.shields.io/badge/build-2.0.2-brightgreen.svg)](https://travis-ci.org/wangshiyu13/HLNetworking)\n[![CocoaPods](https://img.shields.io/badge/platform-iOS-lightgrey.svg)](http://cocoapods.org/?q=HLNetworking)\n[![Support](https://img.shields.io/badge/support-iOS%208%2B-blue.svg)](https://www.apple.com/nl/ios/)\n\n## 简介\n![](http://p1.bqimg.com/4851/18e86cfdfaccc59c.png)\n\nHLNetworking整体结构如图所示，是一套基于[AFNetworking 3.1.0](https://github.com/AFNetworking/AFNetworking)封装的网络库，提供了更高层次的抽象和更方便的调用方式。\n\n如果您使用的是1.x.x版本，请查看[旧版本说明](https://github.com/QianKun-HanLin/HLNetworking/blob/master/README_old.md)\n\n## 特性\n - 离散式的请求设计，方便进行组件化\n - 支持全局配置请求的公共信息\n - 提供大多数网络访问方式和相应的序列化类型\n - 提供api请求结果映射接口，可以自行转换为相应的数据格式\n - api请求支持多种回调方式（block，delegate）\n - api配置简单，通过block链式调用组装api，配合APICenter中的宏可以极大减少离散式api的设置代码\n - 支持批量请求、链式请求等特殊需求\n - 可随时取消未完成的网络请求，支持断点续传\n - 提供常用的formData拼接方式，可自行扩展\n - 提供请求前网络状态检测，重复请求检测，避免不必要的请求\n - 提供debug回调用于调试\n\n##使用方法\n\n### 头文件的导入\n\n* 如果是通过 CocoaPods 安装，则:\n\n```objc\n#import \u003cHLNetworking/HLNetworking.h\u003e\n```\n\n* 如果是手动下载源码安装，则:\n\n```objc\n#import \"HLNetworking.h\"\n```\n\n### 全局网络配置\n\n```objc\n[HLNetworkManager setupConfig:^(HLNetworkConfig * _Nonnull config) {\n\tconfig.request.baseURL = @\"https://httpbin.org/\";\n\tconfig.request.apiVersion = nil;\n}];\n```\n\n通过调用`HLNetworkManager`的`+setupConfig:`方法，修改block中传入的`HLNetworkConfig`对象来配置全局网络请求信息，其中可修改的参数如下：\n\n- **tips**：提示相关参数\n\t- **generalErrorTypeStr**：出现网络请求时使用的错误提示文字，该文字在failure block中的NSError对象返回；默认为：`服务器连接错误，请稍候重试`\n\t- **frequentRequestErrorStr**：用户频繁发送同一个请求，使用的错误提示文字；默认为：`请求发送速度太快, 请稍候重试`\n\t- **networkNotReachableErrorStr**：网络请求开始时，会先检测相应网络域名的Reachability，如果不可达，则直接返回该错误提示；默认为：`网络不可用，请稍后重试`\n\t- **isNetworkingActivityIndicatorEnabled**：请求时是否显示网络指示器（状态栏），默认为 `YES`\n- **request**：请求相关参数\n\t- **apiCallbackQueue**：自定义的请求队列，如果不设置则自动使用HLNetworkManager默认的队列，该参数默认为 `nil`\n\t- **defaultParams**：默认的parameters，可以在HLAPI中选择是否使用，默认开启，该参数不会被覆盖，HLAPI中使用`setParams()`后，请求的params中依然会有该参数，默认为 `nil`\n\t- **defaultHeaders**：默认的header，可以在HLAPI中覆盖，默认为 `nil`\n\t- **baseURL**：全局的baseURL，HLAPI的baseURL会覆盖该参数，默认为 `nil`\n\t- **apiVersion**：api版本，用于拼接在请求的Path上，默认为infoPlist中的`CFBundleShortVersionString`，格式为`v{version}{r}`，审核版本为r，例：http://www.baidu.com/v5/s?ie=UTF-8\u0026wd=abc，默认为 `nil`\n\t- **isJudgeVersion**：是否为审核版本，作用于apiVersion，存储在NSUserDefaults中，key为isR，默认为 `NO`\n\t- **userAgent**：UserAgent，request header中的UA，默认为 `nil`\n\t- **maxHttpConnectionPerHost**：每个Host的最大连接数，默认为 `5`\n\t- **requestTimeoutInterval**：请求超时时间，默认为 `15` 秒\n- **policy**：网络策略相关参数\t\n\t- **AppGroup**：后台模式所用的GroupID，该选项只对Task有影响，默认为 `nil`\n\t- **isBackgroundSession**：是否为后台模式，该选项只对Task有影响，默认为 `NO`\n\t- **isErrorCodeDisplayEnabled**：出现网络请求错误时，是否在请求错误的文字后加上`{code}`，默认为YES\n\t- **cachePolicy**：请求缓存策略，默认为 `NSURLRequestUseProtocolCachePolicy`\n\t- **URLCache**：URLCache设置，默认为 `[NSURLCache sharedURLCache]`\n- **defaultSecurityPolicy**：默认的安全策略配置，该配置在debug模式下默认为`HLSSLPinningModeNone`，release模式下默认为`HLSSLPinningModePublicKey`，其中详细参数如下：\n\t- **SSLPinningMode**：SSL Pinning证书的校验模式，默认为 `HLSSLPinningModeNone`\n\t- **allowInvalidCertificates**：是否允许使用Invalid 证书，默认为 `NO`\n\t- **validatesDomainName**：是否校验在证书 CN 字段中的 domain name，默认为 `YES`\n\t- **cerFilePath**：cer证书文件路径，默认为 `nil`\n- **enableReachability**：是否启用reachability，baseURL为domain，默认为 `NO`\n- **enableGlobalLog**：是否开启网络debug日志，该选项会在控制台输出所有网络回调日志，并且在Release模式下无效\n\n### Request相关\n`HLNetworking`通过Request发送请求，Request分为`HLURLRequest`、`HLAPIRequest`、`HLTaskRequest`，`HLURLRequest`为基类，`HLAPIRequest`为RestfulAPI参数类、`HLTaskRequest`为用于上传下载任务类\n\n#### 组装api\n\n```objc\n// 组装请求\nHLAPIRequest *get = [HLAPIRequest request].setMethod(GET)\n    \t\t\t\t\t\t\t.setPath(@\"get\")\n    \t\t\t\t\t\t\t.setParams(@{@\"user_id\": @1})\n    \t\t\t\t\t\t\t.setDelegate(self);\n\n// 手动拼接formData上传\nHLAPIRequest *formDataRequest = [HLAPIRequest request].formData(^(id\u003cHLMultipartFormDataProtocol\u003e formData) {\n    [formData appendPartWithHeaders:@{@\"contentType\": @\"html/text\"} body:[NSData data]];\n});\n\n// 使用HLFormDataConfig对象拼接上传\n[HLAPIRequest request].formData([HLFormDataConfig configWithData:imageData\n                                                 name:@\"avatar\"\n                                             fileName:@\"fileName\"\n                                             mimeType:@\"type\"]);\n```\n\n#### 组装task\n\n```objc\nHLTaskRequest *task = [[HLTaskRequest request].setDelegate(self)\n\t // 设置Task类型，Upload/Download\n\t .setTaskType(Upload)\n\t // 设置下载或者上传的本地文件路径\n    .setFilePath([[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@\"Boom2.dmg\"])\n    // 设置下载或者上传的地址\n    .setCustomURL(@\"https://dl.devmate.com/com.globaldelight.Boom2/Boom2.dmg\") start];\n```\n\n#### block方式接收请求\n\n```objc\n// block接收请求\n[get.success(^(id result) {\n    NSLog(@\"\\napi 1 --- 已回调 \\n----\");\n})\n .progress(^(NSProgress *proc){\n    NSLog(@\"当前进度：%@\", proc);\n})\n .failure(^(NSError *error){\n    NSLog(@\"\\napi1 --- 错误：%@\", error);\n})\n .debug(^(HLDebugMessage *message){\n    NSLog(@\"\\n debug参数：\\n \\\n          sessionTask = %@\\n \\\n          api = %@\\n \\\n          error = %@\\n \\\n          originRequest = %@\\n \\\n          currentRequest = %@\\n \\\n          response = %@\\n\",\n          message.sessionTask,\n          message.api,\n          message.error,\n          message.originRequest,\n          message.currentRequest,\n          message.response);\n}) start];\n```\n\n#### delegate方式接收请求\n\n```objc\n// 当前类遵守HLAPIResponseDelegate协议\n// 在初始化方法中设置当前类为回调监听\n[HLNetworkManager registerResponseObserver:self];\n\n// 在这个宏中写入需要监听的api\nHLObserverRequests(self.api1, self.api2)\n// 或者用-requestAPIs这个代理方法，这两个完全等效\n- (NSArray \u003c__kindof HLURLRequest *\u003e*)observerRequests {\n    return [NSArray arrayWithObjects:self.api1, self.api2, self.api3, self.api4, nil];\n}\n\n// 在下面三个代理方法中获取回调结果\n// 进度的回调\n- (void)requestProgress:(nullable NSProgress *)progress atRequest:(nullable HLURLRequest *)request {\n    NSLog(@\"\\n%@------RequestProgress--------%@\\n\", request.hashKey, progress);\n    NSLog(@\"%@\", [NSThread currentThread]);\n}\n// 请求成功的回调\n- (void)requestSucess:(nullable id)responseObject atRequest:(nullable HLURLRequest *)request {\n    NSLog(@\"\\n%@------RequestSuccessDelegate\\n\", request.hashKey);\n    NSLog(@\"%@\", [NSThread currentThread]);\n}\n// 请求失败的回调\n- (void)requestFailure:(nullable NSError *)error atRequest:(nullable HLURLRequest *)request {\n    NSLog(@\"\\n%@------RequestFailureDelegate------%@\\n\", request.hashKey, error);\n    NSLog(@\"%@\", [NSThread currentThread]);\n}\n\n// 切记在dealloc中释放当前控制器\n- (void)dealloc {\n    [HLNetworkManager removeResponseObserver:self];\n}\n```\n\n**注意1：**设置请求URL时，`setCustomURL`的优先级最高，其次是API中的`setBaseURL`，最后才是全局config中的`baseURL`，另无论是哪种`baseURL`都需要配合`setPath`使用。\n\n**注意2：**一次请求必须有`{customURL}`或者`{config.baseURL | api.baseURL}``{api.path}`，如果`{customURL}`的参数错写成`{api.path}`中的无host urlString，也会被自动识别成`{api.path}`。\n\n**注意3：**一个请求对象的回调 block (success/failure/progress/debug) 是非必需的（默认为 `nil`）。另外，需要注意的是，success/failure/debug等回调 Block 会在 config 设置的 `apiCallbackQueue ` 队列中被执行，但 progress 回调 Block 将在 NSURLSession 自己的队列中执行，而不是 `apiCallbackQueue `，但是所有的回调结果都会回落到主线程。\n\n**注意4：**请求的delegate回调之所以这样设置，是为了可以跨类获取请求回调，因此使用起来稍微麻烦一些，如果只需要在当前类拿到回调，使用block方式即可。\n\n**注意5：**HLAPIRequest 同样支持其他 HTTP 方法，比如：`HEAD`, `DELETE`, `PUT`, `PATCH` 等，使用方式与上述类似，不再赘述。\n\n**注意6：**HLTaskRequest目前支持上传下载功能，下载已支持断点续传，其中上传是指使用AFNetworking的`uploadTaskWithRequest:fromFile:progress:completionHandler`的方法；如果需要使用POST中的formData拼接方式上传，请参考API相关的formData设置\n\n详见 `HLNetworkConfig`、`HLSecurityPolicyConfig`、`HLAPIRequest`、`HLAPIType` 、`HLNetworkManager` 、`HLFormDataConfig`、`HLDebugMessage` 等几个文件中的代码和注释，可选参数基本可以覆盖大多数需求。\n\n#### 请求的生命周期方法\n```objc\n// 在api组装时设置当前类为代理\n[HLAPIRequest request].setDelegate(self)\n[HLTaskRequest request].setDelegate(self)\n\n// 请求即将发出的代理方法\n- (void)requestWillBeSent:(HLURLRequest *)request {\n    NSLog(@\"\\n%@---willBeSent---\", request.hashKey);\n}\n\n// 请求已经发出的代理方法\n- (void)requestDidSent:(HLURLRequest *)request {\n    NSLog(@\"\\n%@---didSent---\", request.hashKey);\n}\n```\n\n#### 自定义请求结果处理逻辑\n```objc\n// 指定的类需要遵守HLObjReformerProtocol协议\n[HLAPIRequest request].setObjReformerDelegate(self);\n\n/**\n 一般用来进行JSON -\u003e Model 数据的转换工作。返回的id，如果没有error，则为转换成功后的Model数据。如果有error， 则直接返回传参中的responseObject\n\n @param api 调用的api\n @param responseObject 请求的返回\n @param error 请求的错误\n @return 整理过后的请求数据\n */\n- (id)reformerObject:(id)responseObject \n\t\t\t  andError:(NSError *)error\n\t\t\t atRequest:(HLAPIRequest *)request \n{\n\tif (responseObject) {\n\t\t// 在这里处理获得的数据\n\t\t// 自定义reformer方法\n    \tMyModel *model = [MyReformer reformerWithResponse:responseObject];\n    \treturn model;\n\t} else {\n\t\t// 在这里处理异常\n\t\treturn nil;\n\t}\n}\n\n```\n\n#### 取消一个网络请求\n\n```objc\n// 通过api取消网络请求\n[self.api1 cancel];\n\n// 通过HLNetworkManager取消网络请求\n[HLNetworkManager cancel: self.api1];\n\n```\n\n**注意：**如果请求已经发出，将无法取消，取消可以注销对应的回调block，但是delegate不会被注销。\n\n### 批量请求\n\n#### 无序请求\nHLNetworking 支持同时发一组批量请求，这组请求在业务逻辑上相关，但请求本身是互相独立的，请求时并行执行，`- requestGroupAllDidFinished` 会在所有请求都结束时才执行，每个请求的结果由API自身管理。注：`HLRequestGroup `类做了特殊处理，自身即为`HLURLRequest`及其子类的容器，因此直接`group[index]`即可获取相应的`HLURLRequest`对象，也可以直接遍历；回调中的 `group `中元素的顺序与每个无序请求 `HLURLRequest` 对象的先后顺序不保证一致。\n\n```obc\nHLRequestGroup *group = [HLRequestGroup groupWithMode:HLRequestGroupModeBatch];\n// 添加单个api\n[group add:[HLAPI API]];\n// 添加apis集合\n[group addRequests:@[api1, api2, api3, nil]];\n\n[group start];\n\ngroup.delegate = self;\n\ndispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.5), dispatch_get_main_queue(), ^{\n\t// 使用cancel取消\n\t[group cancel];\n});\n\n// group全部完成之后调用 \n- (void)requestGroupAllDidFinished:(HLRequestGroup *)group {\n    NSLog(@\"%@\", group);\n}\n```\n\n#### 链式请求\nHLNetworking 同样支持发一组链式请求，这组请求之间互相依赖，下一请求是否发送以及请求的参数可以取决于上一个请求的结果，请求时串行执行，`- chainRequestsAllDidFinished` 会在所有请求都结束时才执行，每个请求的结果由API自身管理。注：`HLRequestGroup`类做了特殊处理，自身即为`HLURLRequest`及其子类的容器，因此直接`group[index]`即可获取相应的`HLURLRequest`对象，也可以直接遍历；回调中的 `group `中元素的顺序与每个链式请求 `HLURLRequest` 对象的先后顺序一致。\n\n```objc\nHLRequestGroup *group = [HLRequestGroup groupWithMode:HLRequestGroupModeChian];\ngroup.delegate = self;\n// 设置每次发送几个请求，每次发出的请求之间无依赖\ngroup.maxRequestCount = 1;\n[group addRequests:@[self.api1, self.api2, self.api3, self.api4, self.api5]];\n\n[group start];\n\nfor (id obj in group) {\n\tNSLog(@\"%@\", obj);\n}\n\nHLAPIRequest *api = group[0];\n\n// group[0] == self.api1\nNSLog(@\"%@\", api);\n\ndispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.5), dispatch_get_main_queue(), ^{\n\t// 使用cancel取消\n\t[group cancel];\n});\n\n// group全部完成之后调用 \n- (void)requestGroupAllDidFinished:(HLRequestGroup *)group {\n    NSLog(@\"%@\", group);\n}\n```\n\n### 网络可连接性检查\n\n```objc\nHLNetworkManager提供了八个方法和四个属性用于获取网络的状态，分别如下：\n\n// reachability的状态\ntypedef NS_ENUM(NSUInteger, HLReachabilityStatus) {\n    HLReachabilityStatusUnknown,\n    HLReachabilityStatusNotReachable,\n    HLReachabilityStatusReachableViaWWAN,\n    HLReachabilityStatusReachableViaWiFi\n};\n\n// 通过sharedMager单例，获取当前reachability状态\n+ (HLReachabilityStatus)reachabilityStatus;\n// 通过sharedMager单例，获取当前是否可访问网络\n+ (BOOL)isReachable;\n// 通过sharedMager单例，获取当前是否使用数据流量访问网络\n+ (BOOL)isReachableViaWWAN;\n// 通过sharedMager单例，获取当前是否使用WiFi访问网络\n+ (BOOL)isReachableViaWiFi;\n\n// 通过sharedMager单例，开启默认reachability监视器，block返回状态\n+ (void)listening:(void(^)(HLReachabilityStatus status))listener;\n\n// 通过sharedMager单例，停止reachability监视器监听domain\n+ (void)stopListening;\n\n// 监听给定的域名是否可以访问，block内返回状态\n- (void)listeningWithDomain:(NSString *)domain listeningBlock:(void (^)(HLReachabilityStatus))listener;\n\n// 停止给定域名的网络状态监听\n- (void)stopListeningWithDomain:(NSString *)domain;\t\n```\n**注意：**reachability的监听domain默认为[HLNetworking sharedManager].config.baseURL，当然你也可以通过对象方法自定义domain。\n\n### HTTPS 请求的本地证书校验（SSL Pinning）\n\n在你的应用程序包里添加 (pinned) 相应的 SSL 证书做校验有助于防止中间人攻击和其他安全漏洞。`HLNetworking`的`config`属性和`HLAPI`里有对AFNetworking 的 `AFSecurityPolicy` 安全模块的封装，你可以通过配置`config`内`defaultSecurityPolicy`属性，用于校验本地保存的证书或公钥可信任。\n\n```objc\n// SSL Pinning\ntypedef NS_ENUM(NSUInteger, HLSSLPinningMode) {\n    // 不校验Pinning证书\n    HLSSLPinningModeNone,\n    // 校验Pinning证书中的PublicKey\n    HLSSLPinningModePublicKey,\n    // 校验整个Pinning证书\n    HLSSLPinningModeCertificate\n};\n\n// 生成策略\nHLSecurityPolicyConfig *securityPolicy = [HLSecurityPolicyConfig policyWithPinningMode:HLSSLPinningModePublicKey];\n    // 是否允许使用Invalid 证书，默认为 NO\n    securityPolicy.allowInvalidCertificates = NO;\n    // 是否校验在证书 CN 字段中的 domain name，默认为 YES\n    securityPolicy.validatesDomainName = YES;\n    //cer证书文件路径\n    securityPolicy.cerFilePath = [[NSBundle mainBundle] pathForResource:@\"myCer\" ofType:@\"cer\"];\n\n// 设置默认的安全策略\n[HLNetworkManager setupConfig:^(HLNetworkConfig * _Nonnull config) {\n    config.defaultSecurityPolicy = securityPolicy;\n}];\n\n// 针对特定API的安全策略\nself.api1.setSecurityPolicy(securityPolicy);\n```\n**注意：**Request中的安全策略会在此request请求时覆盖默认安全策略，并且与request相同baseURL的安全策略都会被覆盖。\n\n**注意1：**Task的resume信息记录在沙盒中`Cache/com.qkhl.HLNetworking/downloadDict中`。\n\n### Center相关\n\n- ``HLAPICenter``提供一种离散式API的组织模版，其核心理念是通过category分散APICenter内的API对象；\n- ``HLBaseObjReformer``提供了基于YYModel的JSON-\u003eModel的模版；\n- 通过``HLAPIMacro``中定义的宏，可以快速设置模块所需的API\n\n#### 范例\n- 根据API相关中的设置，配置HLNetworkManager的相关Config\n- 根据模块创建``HLAPICenter``的category，例如``HLAPICenter+home``\n- 在HLAPICenter+home.h中使用HLStrongProperty(name)宏，name为方法名，形如：\n\n```objc\n#import \"HLAPICenter.h\"\n\n@interface HLAPICenter (home)\nHLStrongProperty(home)\n@end\n```\n\n- 在HLAPICenter+home.m中使用HLStrongSynthesize(name, api)宏，name为方法名，api为API对象，形如：\n\n```objc\n#import \"HLAPICenter+home.h\"\n\n@implementation HLAPICenter (home)\nHLStrongSynthesize(home, [HLAPIRequest request]\n                   .setMethod(GET)\n                   // 根据需要设置Path、BaseURL、CustomURL\n                   .setPath(@\"index.php?r=home\")\n                   // 如果该api对应的model可以直接通过yymodel转换的话，则指定需转换的模型类型名\n                   .setResponseClass(@\"HLHomeModel\")\n                   // 这里使用self.defaultReformer即通过yymodel转换\n                   .setObjReformerDelegate(self.defaultReformer))\n@end\n```\n\n- 然后就可以愉快的使用了，在控制器中```#import \"HLAPICenter+home.h\"```，按如下方法使用即可：\n\n```objc\n- (void)testHome {\n    [HLAPICenter.home.setParams(@{@\"user_id\": @self.myUserID})\n    .success(^(HLHomeModel *model) {\n        self.model = model;\n    }).failure(^(NSError *obj){\n        NSLog(@\"----%@\", obj);\n    }) start];\n}\n```\n\n### Logger相关\n\n- `HLNetworkLogger`提供了记录网络请求信息日志的功能，可自定义日志结构，日志头部信息，日志存储类型等\n\n#### 配置Logger\n可选参数如下：\n\n- **channelID**：渠道ID\n- **appKey**：app标志\n- **appName**：app名字\n- **appVersion**：app版本\n- **serviceType**：服务名\n- **enableLocalLog**：是否开启本地日志\n- **logAutoSaveCount**：日志自动保存数，默认为50次保存一次\n- **loggerLevel**：日志等级，该选项暂时无效\n- **loggerType**：日志保存类型，可选JSON或者Plist\n- **logFilePath**：只读，默认为`sandbox/Library/Cache/com.qkhl.HLNetworking/log/{timestamp}.log`\n\n- 范例\n\n```objc\n[HLNetworkLogger setupConfig:^(HLNetworkLoggerConfig *config) {\n    config.enableLocalLog = YES;\n    config.logAutoSaveCount = 50;\n    config.loggerType = HLNetworkLoggerTypeJSON;\n}];\n[HLNetworkLogger startLogging];\n\n```\n\n#### 默认Logger信息\n\n- `HLNetworkLogger`默认提供的log信息为`HLDebugMessage`对象，包括:\n\t- `requestObject` api/task请求对象,\n\t- `sessionTask` NSURLSessionTask对象,\n\t- `response` HLURLResponse对象,\n\t- `queue` dispatch_queue_t对象，\n\t- 具体信息请参考`HLDebugMessage`，`HLURLResponse `，`HLURLResult`这三个文件中的注释\n- `HLNetworkLogger`通过管理`debugInfoArray`数组来存储信息，该数组的首元素为当前APP信息，默认如下：\n\t- @{@\"AppInfo\": @{@\"OSVersion\": [UIDevice currentDevice].systemVersion,\n\t\t- @\"DeviceType\": [UIDevice currentDevice].hl_machineType,\n\t\t- @\"UDID\": [UIDevice currentDevice].hl_udid,\n\t\t- @\"UUID\": [UIDevice currentDevice].hl_uuid,\n\t\t- @\"MacAddressMD5\": [UIDevice currentDevice].hl_macaddressMD5,\n\t\t- @\"ChannelID\": _config.channelID,\n\t\t- @\"AppKey\": _config.appKey,\n\t\t- @\"AppName\": _config.appName,\n\t\t- @\"AppVersion\": _config.appVersion,\n\t\t- @\"ServiceType\": _config.serviceType}}\n\n\n#### 自定义Logger信息\n\n- `HLNetworkLogger`提供自定义log信息内容的方法，该方法每发一次请求，回调时都会调用一次:\n\n```objc\n// 设置当前类为logger代理，并将当前类遵守HLNetworkCustomLoggerDelegate协议\n[HLNetworkLogger setDelegate:self];\n\n// 根据传入的message信息和其他信息组装字典数据\n- (NSDictionary *)customInfoWithMessage:(HLDebugMessage *)message {\n    return [message toDictionary];\n}\n\n// 根据传入的config信息和其他信息组装字典\n- (NSDictionary *)customHeaderWithMessage:(HLNetworkLoggerConfig *)config {\n    return @{@\"AppInfo\": @{@\"OSVersion\": [UIDevice currentDevice].systemVersion,\n                           @\"DeviceType\": [UIDevice currentDevice].hl_machineType,\n                           @\"UDID\": [UIDevice currentDevice].hl_udid,\n                           @\"UUID\": [UIDevice currentDevice].hl_uuid,\n                           @\"MacAddressMD5\": [UIDevice currentDevice].hl_macaddressMD5,\n                           @\"ChannelID\": config.channelID,\n                           @\"AppKey\": config.appKey,\n                           @\"AppName\": config.appName,\n                           @\"AppVersion\": config.appVersion,\n                           @\"ServiceType\": config.serviceType}};\n}\n```\n\n### 更新日志\n\n\n**2.0.2**\n\n```\n新增：\n1. Request组装在线程安全状态\n修复：\n1. 修复了请求结束时progressBlock没有释放的问题\n```\n\n## 环境要求\n\n该库需运行在 iOS 8.0 和 Xcode 7.0以上环境.\n\n## 集成方法\n\nHLNetworking 可以在[CocoaPods](http://cocoapods.org)中获取，将以下内容添加进你的Podfile中后，运行`pod install`即可安装:\n\n```ruby\npod \"HLNetworking\"\n```\n\n如果你只需要用到网络相关，可以这样：\n```ruby\npod \"HLNetworking/Core\"\n```\n\n目前有两个模块可供选择：\n\n     - HLNetworking/Core\n     - HLNetworking/Center\n\n其中`Core`包含网络请求相关的所有代码，`Center`依赖于`Core`\n\n\n## 作者\n\nwangshiyu13, wangshiyu13@163.com\n\n## 开源协议\n\nHLNetworking is available under the MIT license. See the LICENSE file for more info.\n","funding_links":[],"categories":["OOM-Leaks-Crash"],"sub_categories":["Networks"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FCodeWeaver13%2FHLNetworking","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FCodeWeaver13%2FHLNetworking","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FCodeWeaver13%2FHLNetworking/lists"}