欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

如何在iOS中使用Moya網(wǎng)絡請求-創(chuàng)新互聯(lián)

如何在iOS 中使用Moya網(wǎng)絡請求?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

新樂ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!

Moya簡介

Moya是你的 app 中缺失的網(wǎng)絡層。不用再去想在哪兒(或者如何)安放網(wǎng)絡請求,Moya 替你管理。

Moya有幾個比較好的特性:

  • 編譯時檢查正確的API端點訪問.

  • 使你定義不同端點枚舉值對應相應的用途更加明晰.

  • 提高測試地位從而使單元測試更加容易.

Swift我們用Alamofire來做網(wǎng)絡庫.而 Moya 在Alamofire的基礎上又封裝了一層,如下流程圖說明Moya的簡單工作流程圖:

如何在iOS 中使用Moya網(wǎng)絡請求

Moya的官方下載地址點我強大的Moya ,有具體的使用方法在demo里面有說明。

本文主要介紹一下Moya的用法

  • 設置請求頭部信息 設

  • 置超時時間

  • 自定義插件

  • 自簽名證書

注意:以下所出現(xiàn)的NetAPIManager跟官網(wǎng)上demo的** GitHub**是一樣類型的文件,都是這個enum實現(xiàn)一個協(xié)議TargetType,點進去可以看到TargetType定義了我們發(fā)送一個網(wǎng)絡請求所需要的東西,什么baseURL,parameter,method等一些計算性屬性,我們要做的就是去實現(xiàn)這些東西,當然有帶默認值的我們可以不去實現(xiàn),但是設置頭部信息跟超時時間就要修改這些系統(tǒng)默認設置了。

為了看得更加清楚,貼上NetAPIManager文件的內(nèi)容

//
// NetAPIManager.swift
// NN110
//
// Created by 陳亦海 on 2017/5/12.
// Copyright © 2017年 陳亦海. All rights reserved.
//

import Foundation
import Moya


enum NetAPIManager {
 case Show
 case upload(bodyData: Data)
 case download
 case request(isTouch: Bool, body: Dictionary<String, Any>? ,isShow: Bool)
}


extension NetAPIManager: TargetType {
 var baseURL: URL {//服務器地址
  
  switch self {
  case .request( _, _, _):
   return URL(string: "https://www.pmphmall.com")!
  default:
   return URL(string: "https://httpbin.org")!
  }
  
  
 }
 
 var path: String {//具體某個方法的路徑
  switch self {
  case .Show:
   return ""
  case .upload(_):
   return ""
  case .request(_, _, _):
   return "/app/json.do"
  case .download:
   return ""
  }
 }
 
 var method: Moya.Method {//請求的方法 get或者post之類的
  switch self {
  case .Show:
   return .get
  case .request(_, _, _):
   return .post
  default:
   return .post
  }
 }
 
 var parameters: [String: Any]? {//請求的get post給服務器的參數(shù)
  switch self {
  case .Show:
   return nil
  case .request(_, _, _):
   return ["msg":"H4sIAAAAAAAAA11SSZJFIQi7EqPAEgTvf6TP62W7sMoSQhKSWDrs6ZUKVWogLwYV7RjHFBZJlNlzloN6LVqID4a+puxqRdUKVNLwE1TRcZIC/fjF2rPotuXmb84r1gMXbiASZIZbhQdKEewJlz41znDkujCHuQU3dU7G4/PmVRnwArMLXukBv0J23XVahNO3VX35wlgce6TLUzzgPQJFuHngAczl6VhaNXpmRLxJBlMml6gdLWiXxTdO7I+iEyC7XuTirCQXOk4dotgArgkH/InxVjfNTnE/uY46++hyAiLFuFL4cv1Z8WH5DgB2GnvFXMh6gm53Tr13vqqrEYtcdXfkNsMwKB+9sAQ77grNJmquFWOhfXA/DELlMB0KKFtHOc/ronj1ml+Z7qas82L3VWiCVQ+HEitjTVzoFw8RisFN/jJxBY4awvq427McXqnyrfCsl7oeEU6wYgW9yJtj1lOkx0ELL5Fw4z071NaVzRA9ebxWXkFyothgbB445cpRmTC+//F73r1kOyQ3lTpec12XNDR00nnq5/YmJItW3+w1z27lSOLqgVctrxG4xdL9WVPdkH1tkiZ/pUKBGhADAAA="]
  default:
   return nil
  
  }
 }
 
 var sampleData: Data { //編碼轉義
  return "{}".data(using: String.Encoding.utf8)!
 }
 
 var task: Task { //一個請求任務事件
  
  switch self {

  
  case let .upload(data):
  return .upload(.multipart([MultipartFormData(provider: .data(data), name: "file", fileName: "gif.gif", mimeType: "image/gif")]))
   
  default:
   return .request

  }

  }
 
 var parameterEncoding: ParameterEncoding {//編碼的格式
  switch self {
  case .request(_, _, _):
   return URLEncoding.default
  default:
   return URLEncoding.default
  }
  
 }
 //以下兩個參數(shù)是我自己寫,用來控制網(wǎng)絡加載的時候是否允許操作,跟是否要顯示加載提示,這兩個參數(shù)在自定義插件的時候會用到
 var touch: Bool { //是否可以操作
  
  switch self {
  case .request(let isTouch, _, _):
   return isTouch
  default:
   return false
  }
  
 }
 
 var show: Bool { //是否顯示轉圈提示
  
  switch self {
  case .request( _, _,let isShow):
   return isShow
  default:
   return false
  }
  
 }
 
 
}

如何設置Moya請求頭部信息

頭部信息的設置在開發(fā)過程中很重要,如服務器生成的token,用戶唯一標識等 我們直接上代碼,不說那么多理論的東西,哈哈

// MARK: - 設置請求頭部信息
let myEndpointClosure = { (target: NetAPIManager) -> Endpoint<NetAPIManager> in
 
 
 let url = target.baseURL.appendingPathComponent(target.path).absoluteString
 let endpoint = Endpoint<NetAPIManager>(
  url: url,
  sampleResponseClosure: { .networkResponse(200, target.sampleData) },
  method: target.method,
  parameters: target.parameters,
  parameterEncoding: target.parameterEncoding
 )

 //在這里設置你的HTTP頭部信息
 return endpoint.adding(newHTTPHeaderFields: [
  "Content-Type" : "application/x-www-form-urlencoded",
  "ECP-COOKIE" : ""
  ])
 
}

如何設置請求超時時間

// MARK: - 設置請求超時時間
let requestClosure = { (endpoint: Endpoint<NetAPIManager>, done: @escaping MoyaProvider<NetAPIManager>.RequestResultClosure) in
 
 guard var request = endpoint.urlRequest else { return }
 
 request.timeoutInterval = 30 //設置請求超時時間
 done(.success(request))
}

自定義插件

自定義插件必須PluginType協(xié)議的兩個方法willSend與didReceive

//
// MyNetworkActivityPlugin.swift
// NN110
//
// Created by 陳亦海 on 2017/5/10.
// Copyright &copy; 2017年 CocoaPods. All rights reserved.
//

import Foundation
import Result
import Moya


/// Network activity change notification type.
public enum MyNetworkActivityChangeType {
 case began, ended
}

/// Notify a request's network activity changes (request begins or ends).
public final class MyNetworkActivityPlugin: PluginType {
 
 
 
 public typealias MyNetworkActivityClosure = (_ change: MyNetworkActivityChangeType, _ target: TargetType) -> Void
 let myNetworkActivityClosure: MyNetworkActivityClosure
 
 public init(newNetworkActivityClosure: @escaping MyNetworkActivityClosure) {
  self.myNetworkActivityClosure = newNetworkActivityClosure
 }
 
 // MARK: Plugin
 
 /// Called by the provider as soon as the request is about to start
 public func willSend(_ request: RequestType, target: TargetType) {
  myNetworkActivityClosure(.began,target)
 }
 
 /// Called by the provider as soon as a response arrives, even if the request is cancelled.
 public func didReceive(_ result: Result<Moya.Response, MoyaError>, target: TargetType) {
  myNetworkActivityClosure(.ended,target)
 }
}

使用自定義插件方法

// MARK: - 自定義的網(wǎng)絡提示請求插件
let myNetworkPlugin = MyNetworkActivityPlugin { (state,target) in
 if state == .began {
  //  SwiftSpinner.show("Connecting...")
  
  let api = target as! NetAPIManager
  if api.show {
   print("我可以在這里寫加載提示")
  }
  
  if !api.touch {
   print("我可以在這里寫禁止用戶操作,等待請求結束")
  }

  print("我開始請求\(api.touch)")
  
  UIApplication.shared.isNetworkActivityIndicatorVisible = true
 } else {
  //  SwiftSpinner.show("request finish...")
  //  SwiftSpinner.hide()
  print("我結束請求")
  UIApplication.shared.isNetworkActivityIndicatorVisible = false
  
 }
}

自簽名證書

在16年的WWDC中,Apple已表示將從2017年1月1日起,**所有新提交的App必須強制性應用HTTPS協(xié)議來進行網(wǎng)絡請求。**默認情況下非HTTPS的網(wǎng)絡訪問是禁止的并且不能再通過簡單粗暴的向Info.plist中添加NSAllowsArbitraryLoads 設置繞過ATS(App Transport Security)的限制(否則須在應用審核時進行說明并很可能會被拒)。所以還未進行相應配置的公司需要盡快將升級為HTTPS的事項提上進程了。本文將簡述HTTPS及配置數(shù)字證書的原理并以配置實例和出現(xiàn)的問題進行說明,希望能對你提供幫助。(比心~)

如何在iOS 中使用Moya網(wǎng)絡請求

HTTPS: 簡單來說,HTTPS就是HTTP協(xié)議上再加一層加密處理的SSL協(xié)議,即HTTP安全版。相比HTTP,HTTPS可以保證內(nèi)容在傳輸過程中不會被第三方查看、及時發(fā)現(xiàn)被第三方篡改的傳輸內(nèi)容、防止身份冒充,從而更有效的保證網(wǎng)絡數(shù)據(jù)的安全。 HTTPS客戶端與服務器交互過程: 1、 客戶端第一次請求時,服務器會返回一個包含公鑰的數(shù)字證書給客戶端; 2、 客戶端生成對稱加密密鑰并用其得到的公鑰對其加密后返回給服務器; 3、 服務器使用自己私鑰對收到的加密數(shù)據(jù)解密,得到對稱加密密鑰并保存; 4、 然后雙方通過對稱加密的數(shù)據(jù)進行傳輸。

如何在iOS 中使用Moya網(wǎng)絡請求

數(shù)字證書: 在HTTPS客戶端與服務器第一次交互時,服務端返回給客戶端的數(shù)字證書是讓客戶端驗證這個數(shù)字證書是不是服務端的,證書所有者是不是該服務器,確保數(shù)據(jù)由正確的服務端發(fā)來,沒有被第三方篡改。數(shù)字證書可以保證數(shù)字證書里的公鑰確實是這個證書的所有者(Subject)的,或者證書可以用來確認對方身份。證書由公鑰、證書主題(Subject)、數(shù)字簽名(digital signature)等內(nèi)容組成。其中數(shù)字簽名就是證書的防偽標簽,目前使用最廣泛的SHA-RSA加密。 證書一般分為兩種:

  1. 一種是向權威認證機構購買的證書,服務端使用該種證書時,因為蘋果系統(tǒng)內(nèi)置了其受信任的簽名根證書,所以客戶端不需額外的配置。為了證書安全,在證書發(fā)布機構公布證書時,證書的指紋算法都會加密后再和證書放到一起公布以防止他人偽造數(shù)字證書。而證書機構使用自己的私鑰對其指紋算法加密,可以用內(nèi)置在操作系統(tǒng)里的機構簽名根證書來解密,以此保證證書的安全。

  2. 另一種是自己制作的證書,即自簽名證書。好處是不需要花錢購2買,但使用這種證書是不會受信任的,所以需要我們在代碼中將該證書配置為信任證書.

自簽名證書具體實現(xiàn): 我們在使用自簽名證書來實現(xiàn)HTTPS請求時,因為不像機構頒發(fā)的證書一樣其簽名根證書在系統(tǒng)中已經(jīng)內(nèi)置了,所以我們需要在App中內(nèi)置自己服務器的簽名根證書來驗證數(shù)字證書。首先將服務端生成的.cer格式的根證書添加到項目中,注意在添加證書要一定要記得勾選要添加的targets。

這里有個地方要注意:蘋果的ATS要求服務端必須支持TLS 1.2或以上版本;必須使用支持前向保密的密碼;證書必須使用SHA-256或者更好的簽名hash算法來簽名,如果證書無效,則會導致連接失敗。由于我在生成的根證書時簽名hash算法低于其要求,在配置完請求時一直報NSURLErrorServerCertificateUntrusted= -1202錯誤,希望大家可以注意到這一點。

那么如何在Moya中使用自簽名的證書來實現(xiàn)HTTPS網(wǎng)絡請求呢,請期待下回我專門分享......需要自定義一個Manager管理

綜合使用的方法如下

定義一個公用的Moya請求服務對象

let MyAPIProvider = MoyaProvider<NetAPIManager>(endpointClosure: myEndpointClosure,requestClosure: requestClosure, plugins: [NetworkLoggerPlugin(verbose: true, responseDataFormatter: JSONResponseDataFormatter),myNetworkPlugin])

// MARK: -創(chuàng)建一個Moya請求
func sendRequest(_ postDict: Dictionary<String, Any>? = nil,
     success:@escaping (Dictionary<String, Any>)->(),
     failure:@escaping (MoyaError)->()) -> Cancellable? {
 
 let request = MyAPIProvider.request(.Show) { result in 
  switch result {
  case let .success(moyaResponse):
   
   
   do {
    let any = try moyaResponse.mapJSON()
    let data = moyaResponse.data
    let statusCode = moyaResponse.statusCode
    MyLog("\(data) --- \(statusCode) ----- \(any)")
    
    success(["":""])
    

   } catch {
    
   }
   
   
   
  case let .failure(error):
   
   print(error)
   failure(error)
  }
 }
 
 return request
}

取消所有的Moya請求

// MARK: -取消所有請求
func cancelAllRequest() {
// MyAPIProvider.manager.session.invalidateAndCancel() //取消所有請求
 MyAPIProvider.manager.session.getTasksWithCompletionHandler { dataTasks, uploadTasks, downloadTasks in
  dataTasks.forEach { $0.cancel() }
  uploadTasks.forEach { $0.cancel() }
  downloadTasks.forEach { $0.cancel() }
 }
 
 //let sessionManager = Alamofire.SessionManager.default
 //sessionManager.session.getTasksWithCompletionHandler { dataTasks, uploadTasks, downloadTasks in
 // dataTasks.forEach { $0.cancel() }
 // uploadTasks.forEach { $0.cancel() }
 // downloadTasks.forEach { $0.cancel() }
 //}

}

關于如何在iOS 中使用Moya網(wǎng)絡請求問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注創(chuàng)新互聯(lián)網(wǎng)站建設公司行業(yè)資訊頻道了解更多相關知識。

另外有需要云服務器可以了解下創(chuàng)新互聯(lián)建站aaarwkj.com,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

本文題目:如何在iOS中使用Moya網(wǎng)絡請求-創(chuàng)新互聯(lián)
本文鏈接:http://aaarwkj.com/article30/ddooso.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供營銷型網(wǎng)站建設、標簽優(yōu)化、移動網(wǎng)站建設企業(yè)網(wǎng)站制作、域名注冊軟件開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)
亚洲精品免费福利视频| 成人短篇在线视频夫妻刺激自拍| 熟女aaa一区二区午夜| 国产精品国产三级国产专播精品| 久视频这里只有精品99| 欧美欧美欧美欧美一区| 午夜影院网站在线看黄| 欧美一区二区三区免费精品| 亚洲亚洲精品av在线动| 最美是你免费视频观看| 蜜桃视频在线视频免费观看| 成人免费激情在线观看| 免费高清视频一区二区在线观看| 国产91高清在线观看| 日本免费在线不卡一区二区| 伊人久久亚洲福利精品| 18禁的视频在线观看| 亚洲天堂中文字幕麻豆| 天天躁日日躁夜夜躁夜夜| 国产成人av在线观看| 成人看片亚欧大片在线观看| av天天堂网在线播放| 丰满人妻被猛烈进入中| 青青草日韩视频在线观看| 91黄色国产在线播放| 亚洲美女国产精选999| 92午夜福利在线视频| 国产福利三级在线观看| 国产美女口爆吞精久久| 91精品国产高清91久久久久久| 国产毛毛片一区二区三区| 亚洲国产成人久久综合区| 国产三级在线观看91| 蜜桃av在线播放视频| 欧美亚洲国产日韩在线高清| 中文字幕乱码高清欧美日韩| 午夜激情视频福利在线观看| 婷婷五激情五月激情片| 欧美在线观看黄片视频| 91超碰这里只有精品国产| 在线观看日韩三级av|