如何使用 Alamofire 发布 SwiftyJSON?
Posted
技术标签:
【中文标题】如何使用 Alamofire 发布 SwiftyJSON?【英文标题】:How to post SwiftyJSON with Alamofire? 【发布时间】:2017-07-19 04:26:37 【问题描述】:我想通过 Alamofire 发布 JSON。
但我不太确定我该如何处理它。
我的swiftyJSON
在一个数组中作为我的
如何将 JSON 数组编码为字典对象?适合
Alamofire's Parameters?
urlRequest = try JSONEncoding.default.encode(urlRequest, with: location)
我的 JSON 示例如下所示:
"[\n acc = accuracy;\n lat = lat;\n long = long;\n type = type;\n, \n acc = accuracy;\n lat = lat;\n long = long;\n type = type;\n, \n acc = accuracy;\n lat = lat;\n long = long;\n type = type;\n, \n acc = accuracy;\n lat = lat;\n long = long;\n type = type;\n, \n acc = accuracy;\n lat = lat;\n long = long;\n type = type;\n]"
【问题讨论】:
你试过了吗,Alamofire.request("httpbin.org/post", method: .post, parameters: parameters, encoding: JSONEncoding.default)? 【参考方案1】:诀窍是您需要将其转换为字典。 示例 sn-p 如下:
```
// let assume swiftyJSON is a SwiftyJSON object (JSON)
if let data = swiftyJSON.rawString()!.data(using: .utf8)
do
let json = try JSONSerialization.jsonObject(with: data, options: []) as! [String: Any]
Alamofire.request(url, method: .post, parameters: json, encoding: JSONEncoding.default, headers: headers).responseJSON response in
debugPrint(response)
catch
print("JSONSerialization error")
```
【讨论】:
【参考方案2】:First add SwiftJSON to your project then
class func requestPOSTURL(serviceName:String,parameters: [String:Any]?, completionHandler: @escaping (JSON?, NSError?) -> ())
let headersSet: HTTPHeaders = [
"Authorization":GlobalAccesstoken,
"Accept": "application/json"
]
Alamofire.request(serviceName, method: .post, parameters: parameters, encoding: URLEncoding.default, headers: headersSet).responseJSON
(response:DataResponse<Any>) in
switch(response.result)
case .success(_):
if let data = response.result.value
let json = JSON(data)
completionHandler(json,nil)
break
case .failure(_):
completionHandler(nil,response.result.error as NSError?)
break
AFWrapper.requestPOSTURL(serviceName: LapiUrl+"get_profile", parameters: params) (response:JSON?, error:NSError?) in
if error != nil
print(error!)
return
if response == nil
return
print(response!)
var distRespoce = response!.dictionary?["response"]?.array?[0]
if (distRespoce?["status"].string == "true")
let distuserData = distRespoce!.dictionary?["user_data"]
else
print("no")
Try above code ..
【讨论】:
【参考方案3】:你可以这样做:-
Alamofire.request(urlString, method: .post, parameters: paramData, encoding:JSONEncoding.default, headers: nil).responseJSON (response:DataResponse<Any>) in
switch(response.result)
case .success(_):
if response.result.value != nil
do
var dict : NSDictionary = try JSONSerialization.jsonObject(with: response.data!, options: JSONSerialization.ReadingOptions.mutableContainers) as! NSDictionary
print(dict)
dict = UtilityClass.removeNullFromResponse(response: response.result.value! as! NSDictionary)
self.dataBlock(dict,nil)
catch
UtilityClass.hideHudLoading()
break
case .failure(_):
if response.result.error != nil
print(response.result.error!)
UtilityClass.hideHudLoading()
break
【讨论】:
嗨 @user2537789 我正在尝试发布:)【参考方案4】:简单获取邮政编码,易于使用、维护和理解
下面是pod,需要用到我的json解析代码。
#Network manager related
pod 'Alamofire', :git => 'https://github.com/Alamofire/Alamofire.git', :tag => ‘4.0.1’
pod 'AlamofireNetworkActivityIndicator', '~> 2.0'
pod 'AlamofireObjectMapper', '~> 4.0.0'
pod 'SVProgressHUD', :git => 'https://github.com/SVProgressHUD/SVProgressHUD.git'
pod 'Reachability', '~> 3.2'
pod 'SwiftyJSON', '~> 3.0.0'
pod 'ObjectMapper', '~> 2.0'
pod 'SDWebImage', '~> 3.8'
在这里,您可以在视图控制器中调用 API。
RegistrationService().login(email: (txtEmail.text)!.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines), password: self.txtPassword.text!, success: (response) in
//Save data to user default
) (error) in
print(error as Any)
RegistrationService.swift //Service类,可以在里面添加api的
//
// RegistrationService.swift
// hotelBids
//
// Created by Mehul Parmar on 27/05/16.
// Copyright © 2017 Sooryen Innovation labs. All rights reserved.
//
import Foundation
import Alamofire
import SwiftyJSON
import ObjectMapper
import AlamofireObjectMapper
open class RegistrationService
enum listOfApi : String
case
login,
country
func country(_ success:@escaping (_ responseObject:JSON) -> Void , failure:@escaping (_ errorResponse:JSON?) -> Void)
// create post request
NetworkManager().Get(listOfApi.country.rawValue,
paramaters: [:],
showLoader: true,
success: responseObject in
success(responseObject)
) error in
failure(error)
func login(email: String, password: String, success:@escaping (_ responseObject:JSON) -> Void , failure:@escaping (_ errorResponse:JSON?) -> Void)
// create request parameter
let requestParameters = ["email" : email,
"password" : password,
"user_role" : "customer"
]
// create post request
NetworkManager().POST(listOfApi.login.rawValue,
paramaters: requestParameters as [String : AnyObject]?,
showLoader: true,
success: responseObject in
success(responseObject)
) error in
failure(error)
NetworkManager.swift
//
// NetworkManager.swift
// Constants.kAppName.localized()
//
// Created by Mehul Parmar on 08/06/16.
// Copyright © 2016 . All rights reserved.
//
import Foundation
import Alamofire
import SVProgressHUD
import SwiftyJSON
//import AMSmoothAlert
import ObjectMapper
import AlamofireObjectMapper
//used for facebook logour while invalid session
import FacebookLogin
//MARK : - Errors
enum NetworkConnection
case available
case notAvailable
class NetworkManager
let baseUrlDev_OLD : String = "https://hotelbids.com/" + "dev/" + "hb-app/" + "v3/" + "user/"
let baseUrlDev : String = "http://184.73.131.211/api/v1/"
//MARK : - Shared Manager
let sharedManager = SessionManager()
func getHeaders(_ urlString: String) -> [String: String]
var headerDictionary = [String: String]()
if UserDetail.rememberToken != nil
if (UserDetail.rememberToken?.length)! > 0
headerDictionary[Constants.KEY_remember_token] = "\(UserDetail.rememberToken!)"
/*
if let xapi = UserDefault.getXapi()
headerDictionary[Constants.KEY_Xapi] = xapi
if let accessLanguage = UserDefault.getLanguage()
headerDictionary[Constants.KEY_Language] = accessLanguage
if let userId = UserDefault.getUserId()
headerDictionary[Constants.KEY_USER_ID] = userId
if let accessToken = UserDefault.getAccessToken()
headerDictionary[Constants.KEY_AccessToken] = accessToken
*/
print("urlString: \(urlString)\nheaderDictionary : \(headerDictionary)")
return headerDictionary
func printResponse(urlString: String, paramaters: [String: AnyObject]?, response: AnyObject)
let dictResponce = self.getValidatedData(response as AnyObject)
// if dictResponce.boolValue
if let paramatersTemp = paramaters
if paramatersTemp.values.count > 0
let jsonParameters = JSON(paramatersTemp)
print("\n\n\nurlString : \(urlString) ,\n\n paramaters: \(jsonParameters) ,\n\n Response: \(String(describing: dictResponce))\n\n\n")
else
print("\n\n\nurlString : \(urlString) ,\n\n Response: \(String(describing: dictResponce))\n\n\n")
else
print("\n\n\nurlString : \(urlString) ,\n\n Response: \(String(describing: dictResponce))\n\n\n")
// else
// print("urlString : \(urlString) ,\n Response: \(String(describing: dictResponce))")
//
func getValidatedData(_ response: AnyObject?) -> JSON
//Removing null and <null>, and replacing number or integer to string
guard var dictResponse = response as? NSDictionary else
return nil
dictResponse = (dictResponse.replacingNullsWithStrings() as NSDictionary).convertingNumbersToStrings()! as NSDictionary
let jsonResponce = JSON(dictResponse)
return jsonResponce
// MARK: - Get Method
func Get(_ urlString: String, paramaters: [String: AnyObject]? = nil, showLoader: Bool? = nil, success:@escaping (_ responseObject:JSON) -> Void , failure:@escaping (_ errorResponse:JSON?) -> Void)
switch checkInternetConnection()
case .available:
if let showLoader = showLoader
if showLoader
DispatchQueue.main.async
// update some UI
UIApplication.shared.keyWindow?.showLoader()
Alamofire.request(baseUrlDev.add(urlString: urlString), method: .get, parameters: paramaters, encoding: URLEncoding.default, headers: self.getHeaders(urlString)).responseJSON (completionHandler: response in
DispatchQueue.main.async
if UIApplication.shared.isIgnoringInteractionEvents
UIApplication.shared.endIgnoringInteractionEvents()
if let showLoader = showLoader
if showLoader
if SVProgressHUD.isVisible()
SVProgressHUD.dismiss()
//Success
if response.result.isSuccess
if let value = response.result.value
let dictResponce = self.isValidated(value as AnyObject)
//Print response using below method
self.printResponse(urlString: urlString, paramaters: paramaters, response: (value as AnyObject))
if dictResponce.0 == true
success(dictResponce.1)
else
failure(dictResponce.1)
else
//Check response error using status code
if let strErrorReasonCode : Int = response.response?.statusCode
if let data = response.data
let jsonResponce = JSON(data: data)
if strErrorReasonCode == 500
print("\n\n\n\n server error :\(AppAlertMsg.kErrorMsg) \n\n URL:\(urlString) \n\n paramaters:\(JSON(paramaters as Any))\n\n\n\n")
UIApplication.shared.keyWindow?.makeToast(message: AppAlertMsg.kErrorMsg, duration: 3.0, position: "bottom" as AnyObject)
failure(jsonResponce)
return
if let dictionary : NSDictionary = jsonResponce.dictionaryObject as NSDictionary?
let responce : ResponseDataModel = ModelManager.sharedInstance.getResponseDataModel(dictionary)
let authentication_Errors = 401
let authentication_Errors_Range = 400..<500
let Alamofire_Error = -1005
if authentication_Errors == strErrorReasonCode
print("\n\n\n\nauthentication_Errors :\(strErrorReasonCode) \n\nmessage: \(responce.message) \n\nparamaters: \(String(describing: paramaters)) \n\nresponse: \(jsonResponce)\n\n\n\n")
self.isUnAuthotized()
failure(jsonResponce)
else if authentication_Errors_Range.contains(strErrorReasonCode)
print("\n\n\n\nauthentication_Errors_Range :\(strErrorReasonCode) \n\nmessage: \(responce.message) \n\nparamaters: \(String(describing: paramaters)) \n\nresponse: \(jsonResponce)\n\n\n\n")
CustomAlert().ShowAlert(responce.message)
failure(jsonResponce)
else if authentication_Errors_Range.contains(Alamofire_Error)
self.POST(urlString, paramaters: paramaters, showLoader: showLoader, success: (responseObject) in
if response.result.isSuccess
if let value = response.result.value
let dictResponce = self.isValidated(value as AnyObject)
if dictResponce.0 == true
success(dictResponce.1)
else
failure(dictResponce.1)
, failure: _ in
failure(jsonResponce)
)
else
print("\n\n\n\n server error :\(AppAlertMsg.kErrorMsg) \n\n URL:\(urlString) \n\n paramaters:\(JSON(paramaters as Any))\n\n\n\n")
UIApplication.shared.keyWindow?.makeToast(message: AppAlertMsg.kErrorMsg, duration: 3.0, position: "bottom" as AnyObject)
failure(jsonResponce)
else
failure(nil)
)
case .notAvailable:
if let _ = showLoader
UIApplication.shared.keyWindow?.makeToast(message: AppAlertMsg.kNoInternet, duration: 3.0, position: "bottom" as AnyObject)
failure(JSON(AppAlertMsg.kNoInternet))
print("No internet")
// MARK: - POST Method
func POST(_ urlString: String, paramaters: [String: AnyObject]? = nil, showLoader: Bool? = nil, success:@escaping (_ responseObject:JSON) -> Void , failure:@escaping (_ errorResponse:JSON?) -> Void)
switch checkInternetConnection()
case .available:
if let showLoader = showLoader
if showLoader
DispatchQueue.main.async(execute:
if !UIApplication.shared.isIgnoringInteractionEvents
UIApplication.shared.beginIgnoringInteractionEvents()
SVProgressHUD.show(withStatus: AppAlertMsg.kPleaseWait)
)
sharedManager.request(baseUrlDev.add(urlString: urlString), method: .post, parameters: paramaters, encoding: JSONEncoding.default, headers: self.getHeaders(urlString)).validate().responseJSON(completionHandler: response in
DispatchQueue.main.async
if UIApplication.shared.isIgnoringInteractionEvents
UIApplication.shared.endIgnoringInteractionEvents()
if let showLoader = showLoader
if showLoader
if SVProgressHUD.isVisible()
SVProgressHUD.dismiss()
//Success
if response.result.isSuccess
if let value = response.result.value
let dictResponce = self.isValidated(value as AnyObject)
//Print response using below method
self.printResponse(urlString: urlString, paramaters: paramaters, response: (value as AnyObject))
if dictResponce.0 == true
success(dictResponce.1)
else
failure(dictResponce.1)
else
//Check response error using status code
if let strErrorReasonCode : Int = response.response?.statusCode
if let data = response.data
let jsonResponce = JSON(data: data)
if strErrorReasonCode == 500
print("\n\n\n\n server error :\(AppAlertMsg.kErrorMsg) \n\n URL:\(urlString) \n\n paramaters:\(JSON(paramaters as Any))\n\n\n\n")
UIApplication.shared.keyWindow?.makeToast(message: AppAlertMsg.kErrorMsg, duration: 3.0, position: "bottom" as AnyObject)
failure(jsonResponce)
return
if let dictionary : NSDictionary = jsonResponce.dictionaryObject as NSDictionary?
let responce : ResponseDataModel = ModelManager.sharedInstance.getResponseDataModel(dictionary)
let authentication_Errors = 401
let authentication_Errors_Range = 400..<500
let Alamofire_Error = -1005
if authentication_Errors == strErrorReasonCode
print("\n\n\n\nauthentication_Errors (jsonResponce)\n\n\n\n")
self.isUnAuthotized()
failure(jsonResponce)
else if authentication_Errors_Range.contains(strErrorReasonCode)
print("\n\n\n\nauthentication_Errors_Range :\(strErrorReasonCode) \n\nmessage: \(responce.message) \n\nparamaters: \(String(describing: paramaters)) \n\nresponse: \(jsonResponce)\n\n\n\n")
CustomAlert().ShowAlert(responce.message)
failure(jsonResponce)
else if authentication_Errors_Range.contains(Alamofire_Error)
self.POST(urlString, paramaters: paramaters, showLoader: showLoader, success: (responseObject) in
if response.result.isSuccess
if let value = response.result.value
let dictResponce = self.isValidated(value as AnyObject)
if dictResponce.0 == true
success(dictResponce.1)
else
failure(dictResponce.1)
, failure: _ in
failure(jsonResponce)
)
else
print("\n\n\n\n server error :\(AppAlertMsg.kErrorMsg) \n\n URL:\(urlString) \n\n paramaters:\(JSON(paramaters as Any))\n\n\n\n")
UIApplication.shared.keyWindow?.makeToast(message: AppAlertMsg.kErrorMsg, duration: 3.0, position: "bottom" as AnyObject)
failure(jsonResponce)
else
failure(nil)
)
case .notAvailable:
if let _ = showLoader
UIApplication.shared.keyWindow?.makeToast(message: AppAlertMsg.kNoInternet, duration: 3.0, position: "bottom" as AnyObject)
failure(JSON(AppAlertMsg.kNoInternet))
print("No internet")
// MARK: - No Internet Connection
func checkInternetConnection() -> NetworkConnection
if isNetworkAvailable()
return .available
return .notAvailable
// MARK: - Check Status
func isValidated(_ response: AnyObject?) -> (Bool, JSON)
//Removing null and <null>, and replacing number or integer to string
guard var dictResponse = response as? NSDictionary else
return (false,nil)
dictResponse = (dictResponse.replacingNullsWithStrings() as NSDictionary).convertingNumbersToStrings()! as NSDictionary
let jsonResponce = JSON(dictResponse)
let responseModel : ResponseDataModel = ModelManager.sharedInstance.getResponseDataModel(dictResponse)
/* //
HTTP Status Code
200 – Success/OK
4xx – Authentication Errors
5xx – Service Errors
*/ //
guard let statusCodeInt = responseModel.code.toInt() else
print("code is not proper")
return (false,jsonResponce)
let success_Range = 200..<300
let authentication_Errors = 401
let authentication_Errors_Range = 400..<500
let service_Errors_Range = 500..<600
if success_Range.contains(statusCodeInt)
// all okey
return (true, jsonResponce)
else if authentication_Errors == statusCodeInt
print("service_Errors_Range :\(statusCodeInt)")
self.isUnAuthotized()
return (false,jsonResponce)
else if authentication_Errors_Range.contains(statusCodeInt)
print("authentication_Errors_Range :\(statusCodeInt)")
CustomAlert().ShowAlert(responseModel.message)
return (false,jsonResponce)
else if service_Errors_Range.contains(statusCodeInt)
print("service_Errors_Range :\(statusCodeInt)")
CustomAlert().ShowAlert(responseModel.message)
return (false,jsonResponce)
else
return (false,nil)
func isUnAuthotized()
// we have to logout, bcos session expired , or user unauthorized
CustomAlert().ShowAlert(isCancelButton: false, strMessage: AppAlertMsg.kUnAuthotized) (isYESClicked) in
if isYESClicked
//Delete all data from user default
//Set sign in as Home screen
print("set to Login view controller ")
GmailClass.sharedInstance().signOut()
LoginManager().logOut()
UserStatus = UserType.Fresh.rawValue
let deviceTokenTemp = DeviceToken
if let bundle = Bundle.main.bundleIdentifier
UserDefaults.standard.removePersistentDomain(forName: bundle)
DeviceToken = deviceTokenTemp
Constants.appDelegate.logoutSuccess()
// MARK: - Loader method
class func ShowActivityIndicatorInStatusBar()
UIApplication.shared.isNetworkActivityIndicatorVisible = true
class func HideActivityIndicatorInStatusBar()
UIApplication.shared.isNetworkActivityIndicatorVisible = false
extension String
func add(urlString: String) -> URL
return URL(string: self + urlString)!
func EncodingText() -> Data
return self.data(using: String.Encoding.utf8, allowLossyConversion: false)!
【讨论】:
以上是关于如何使用 Alamofire 发布 SwiftyJSON?的主要内容,如果未能解决你的问题,请参考以下文章
Swift 4:如何使用 Alamofire 在参数中发布文件?
如何使用来自 Alamofire 发布请求的 SwiftyJSON 填充下拉列表?