2015-10-09 77 views
0

免责声明:我是iOS新手,因此这个问题可能看起来很简单。这不是一个狡猾的问题!如何向Almofire请求添加参数

我有一个使用Almofire发送HTTP请求的Swift项目。我想为查询字符串中的每个请求添加一个参数。

因此,我想为每个请求添加mykey=myval

  • EG:http://example.com/index -> http://example.com/index?mykey=myval
  • EG:http://example.com/index?key=val -> http://example.com/index?key=val&mykey=myval

我发现,所有的请求似乎在一个名为Almofire.swift

和文件要经过

public func request(URLRequest: URLRequestConvertible) -> Request { 
    return Manager.sharedInstance.request(URLRequest.URLRequest) 
} 

也通过

public func request(URLRequest: URLRequestConvertible) -> Request { 
    var dataTask: NSURLSessionDataTask? 
    dispatch_sync(queue) { 
     dataTask = self.session.dataTaskWithRequest(URLRequest.URLRequest) 
    } 

    let request = Request(session: session, task: dataTask!) 
    delegate[request.delegate.task] = request.delegate 

    if startRequestsImmediately { 
     request.resume() 
    } 

    return request 
} 

在一个名为Manager.swift的文件中,所以我假设我需要在这里添加一些代码。由于我缺乏斯威夫特的知识,我花了数小时试验,但没有喜悦 - 只有例外。

有谁知道我可以如何向所有请求添加参数?

回答

2

您无需更改Alamofire代码中的任何内容。相反,你可以使用URLRequestConvertible协议封装的URL和参数的枚举:

enum Router: URLRequestConvertible { 
    static let baseURLString = "https://example.com" // define your base URL here 
    static var defaultParams = ["myKey": "myValue"] // set the default params here 

    // define a case for every request you need 
    case Index 
    case Endpoint1(param: String) 
    case Endpoint2(param1: String, param2: String) 

    var URLRequest: NSMutableURLRequest { 
     let result: (path: String, parameters: [String: AnyObject]) = { 
      // set the path and params for each request 
      switch self { 
      case .Index: 
       return ("/index", Router.defaultParams) 
      case .Endpoint1(let param): 
       var params = Router.defaultParams 
       params.updateValue(param, forKey: "key") 
       return ("/endpoint", params) 
      case .Endpoint2(let param1, let param2): 
       var params = Router.defaultParams 
       params.updateValue(param1, forKey: "key1") 
       params.updateValue(param2, forKey: "key2") 
       return ("/endpoint2", params) 
      } 
     }() 

     // create the URL and the request 
     let URL = NSURL(string: Router.baseURLString)! 
     let URLRequest = NSURLRequest(URL: URL.URLByAppendingPathComponent(result.path)) 
     let encoding = Alamofire.ParameterEncoding.URL 

     return encoding.encode(URLRequest, parameters: result.parameters).0 
    } 
} 

然后,您可以拨打以下不管你的请求:

// sends a request to 'https://example.com/index?myKey=myValue' 
Alamofire.request(Router.Index).response { (request, urlResponse, data, error) -> Void in 
    // handle response 
} 

// sends a request to 'https://example.com/endpoint?key=value&myKey=myValue' 
Alamofire.request(Router.Endpoint1(param: "value")).response { (request, urlResponse, data, error) -> Void in 
    // handle response 
} 

// sends a request to 'https://example.com/endpoint2?key1=value1&key2=value2&myKey=myValue' 
Alamofire.request(Router.Endpoint2(param1: "value1", param2: "value2")).response { (request, urlResponse, data, error) -> Void in 
    // handle response 
} 
+0

谢谢你。我知道如果文件被覆盖,我将会丢失我的更改。我可以在Almofire上创建一个具有相同方法签名的包装器,并将其更改放在那里。但是我仍然需要知道如何在创建请求后添加到请求中。 –

+0

请参阅我更新的答案,以解决您的问题。 – joern

0

简单的请求 - >

func someFunction() 
{ 
    Alamofire.request(.GET, "apiName", parameters:["Key":"Value"]) 
     .response { request, response, data, error in 
      if error == nil { 
       print(request) 
       print(response) 
      } 
      else { 
       //Display Error Message 
       print(error) 
      } 

    } 
}