返回 POST 请求的 Alamofire 路由器

Posted

技术标签:

【中文标题】返回 POST 请求的 Alamofire 路由器【英文标题】:Alamofire Router that returns POST request 【发布时间】:2015-06-03 22:13:40 【问题描述】:

阅读RAYWENDERLICH Alamofire tutorial后,我决定自己构建路由器,除了一些细节,它工作正常。它返回GET 请求,但我需要POST 请求。我花了一些时间尝试在路由器中设置HTTPMethod = "POST",但可能是因为缺乏经验,我做错了并且出现了一些错误。那么我究竟需要在路由器中进行哪些更改才能使其返回POST 请求?

她是我的密码

enum Router: URLRequestConvertible

    static let baseURLString = "http://www.com"
    case Friends(Int)
    var URLRequest: NSURLRequest
    
        let (path: String, parameters: [String: AnyObject]) = 
            switch self
            
            case .Friends (let ID):
                let params = ["userID": "\(ID)"]
                return ("/getFriends.php", params) 
            
        ()
        let URL = NSURL(string: Router.baseURLString)
        let URLRequest = NSURLRequest(URL: URL!.URLByAppendingPathComponent(path))
        let encoding = Alamofire.ParameterEncoding.URL
        return encoding.encode(URLRequest, parameters: parameters).0
    

【问题讨论】:

对我来说一切都很好,尝试将 let URLRequest 重命名为其他名称(resultRequest 等),因为您已经在外部范围上有一个名为 URLRequest 的变量,您还必须添加行 resultRequest.HTTPMethod = “发布” 编辑帖子并输入教程的链接,我将文本加粗,以便人们更容易理解您的尝试。 @Kaan Dedeoglu 我尝试在 let URLRequest = NSURLRequest(URL: URL!.URLByAppendingPathComponent(path)) 之后添加 URLRequest.HTTPMethod = "POST" 但它给了我以下错误“无法分配给'URLRequest' 中的'HTTPMethod' " 使用 NSMutableURLRequest 代替 NSURLRequest @Kaan Dedeoglu 非常感谢,问题解决了,我知道有一个简单的解决方案 【参考方案1】:

简单的解决方案swift 3+Alamofire 4+

import Foundation
import Alamofire

public enum mRouter: URLRequestConvertible 
  static let baseURLString = "baseURL"
  static let token = "token"

  case profile
  case timeline

  public func asURLRequest() throws -> URLRequest 
    var method: HTTPMethod 
      switch self 
      case .profile:
        return .get
      case .timeline:
        return .post
      
    

    let params: ([String: Any]?) = 
      switch self 
      case .profile(let Id):
        return (["id": Id])
      case .timeline:
        return nil
      
    ()

    let url: URL = 
      let relativePath: String?
      switch self 
      case .profile:
        relativePath = "profile"
      case .timeline:
        relativePath = "timeline"
      
      var url = URL(string: mRouter.baseURLString)!
      if let relativePath = relativePath 
        url = url.appendingPathComponent(relativePath)
      
      return url
    ()

    var urlRequest = URLRequest(url: url)
    urlRequest.httpMethod = method.rawValue
    urlRequest.setValue(mRouter.token, forHTTPHeaderField: "Authorization")

    let encoding = JSONEncoding.default
    return try encoding.encode(urlRequest, with: params)
  

【讨论】:

【参考方案2】:

完美地遵循代码 :) 感谢@Kaan Dedeoglu

  enum Router: URLRequestConvertible
  
    static let baseURLString = "http://www.com"
    case Friends(Int)
    var URLRequest: NSURLRequest
      
        let (path: String, parameters: [String: AnyObject]) = 
          switch self
          
          case .Friends (let ID):
            let params = ["userID": "\(ID)"]
            return ("/getFriends.php", params)
          
          ()
        let URL = NSURL(string: Router.baseURLString)
        let URLRequest = NSMutableURLRequest(URL: URL!.URLByAppendingPathComponent(path))
        URLRequest.HTTPMethod = "POST"
        let encoding = Alamofire.ParameterEncoding.URL
        return encoding.encode(URLRequest, parameters: parameters).0
    
  

【讨论】:

@iMemon 我已经弄明白了,反正谢谢你的好回答

以上是关于返回 POST 请求的 Alamofire 路由器的主要内容,如果未能解决你的问题,请参考以下文章

带有 Swift 3 的 Alamofire 4.3,POST 请求不适用于 URL 参数

带有嵌套参数的 Alamofire POST 请求不返回任何内容

如何编写返回响应的alamofire请求函数?

请求 REST POST API 在 Postman 中工作,但在 Alamofire 中不起作用

Alamofire 4 请求返回 NSArray,无法弄清楚如何在 Swift 3 中使用 SwiftyJSON 进行解析

alamofire:带有标头的 POST 请求