2015-06-03 5 views
1

после прочтения RAYWENDERLICH Alamofire tutorial Я решил построить собственный маршрутизатор, он отлично работает, за исключением небольшой детали. Он возвращает GET запросов, но мне нужен POST запрос в моем случае. Я потратил некоторое время, пытаясь установить HTTPMethod = "POST" в Router, но, вероятно, из-за отсутствия опыта я делал это неправильно и получал некоторые ошибки. Итак, что именно мне нужно изменить в маршрутизаторе, чтобы он возвращал запросы POST?Alamofire Router, который возвращает 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 
    } 
} 
+0

Все выглядит хорошо для меня, попробуйте переименовать let URLRequest на что-то другое (resultRequest и т. Д.), Так как у вас уже есть переменная с именем URLRequest во внешней области, вы также должны добавить строку resultRequest.HTTPMethod = "POST" –

+0

Редактировать и введите ссылку учебника, где я полужирный текст, чтобы людям было легче понять, что вы пытаетесь. – Icaro

+0

@ Kaan Dedeoglu Я попытался добавить URLRequest.HTTPMethod = "POST" сразу после URL URL-адреса = NSURLRequest (URL: URL! .URLByAppendingPathComponent (путь)), но он дает мне следующую ошибку: «не могу назначить« HTTPMethod »в« URLRequest » '" –

ответ

1

После кода отлично :) Спасибо @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 
    } 
    } 
+0

@ iMemon Я уже понял это, во всяком случае Спасибо за хороший ответ –

2

простое решение с быстры 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) 
    } 
} 
Смежные вопросы