如何使用Alamofire发送字节?

时间:2015-03-23 10:48:12

标签: ios rest swift post alamofire

我正在创建一个下载我的大学时间表的应用程序。我先用Java完成了REST调用,演示了一个很好用的原型。现在我想在Swift中使用Alamofire(或其他任何有效的东西)来做。

以下是我正在尝试复制的Java中的REST调用。

Client client = Client.create();

String authString = "UID=XXXXX&PASS=XXXXX";
byte[] authBytes = authString.getBytes();

WebResource webResouce = client.resource("https://access.adelaide.edu.au/sa/login.asp");

ClientResponse response = webResource.post(ClientResponse.class, authBytes);

if (response.getStatus != 302) {
throw new RuntimeException("Failed: HTTP code: " + response.getStatus());
}

但是我无法正确发送字节。服务器实际上将接受任何字节数据(因此您可以看到它是否在没有UID或PASS的情况下工作)并以302响应,这表明它可以工作。否则它会发送200,这意味着它没有。

我有一些尝试在参数中发送UID和PASS,获取它们的字节然后将它们放入参数等等,但到目前为止似乎没有任何工作。

任何帮助都会很棒,谢谢!

3 个答案:

答案 0 :(得分:0)

如果您使用常规NSURLRequest,则只需设置请求正文:

let URL = NSURL(string: "https://access.adelaide.edu.au/sa/login.asp")!
let request = NSMutableURLRequest(URL: URL)
request.HTTPBody = // NSData you want as your body

修改

正如@mattt本人所指出的,你可以将NSURLRequest传递给Alamofire。我不需要首先回答自定义参数编码的麻烦。 (见下文)


我不知道如何使用Alamofire完成此操作,但似乎您可以使用带有闭包的Custom参数编码。我没有对此进行测试,但是从Alamofire单元测试源中获取了它:

let encodingClosure: (URLRequestConvertible, [String: AnyObject]?) -> (NSURLRequest, NSError?) = { (URLRequest, parameters) in
    let mutableURLRequest = URLRequest.URLRequest.mutableCopy() as NSMutableURLRequest
    mutableURLRequest.HTTPBody = parameters["data"]
    return (mutableURLRequest, nil)
}

let encoding: ParameterEncoding = .Custom(encodingClosure)

let URL = NSURL(string: "https://access.adelaide.edu.au/sa/login.asp")!
let URLRequest = NSURLRequest(URL: URL)
let data: NSData = // NSData you want as your body
let parameters: [String: AnyObject] = ["data": data]

let URLRequestWithBody = encoding.encode(URLRequest, parameters: parameters).0

答案 1 :(得分:0)

以下是您如何提出此类请求的快速示例。

import Alamofire

class BytesUploader {
    func uploadBytes() {
        let URLRequest: NSURLRequest = {
            let URL = NSURL(string: "https://access.adelaide.edu.au/sa/login.asp")!
            let mutableURLRequest = NSMutableURLRequest(URL: URL)
            mutableURLRequest.HTTPMethod = "POST"

            let authString = "UID=XXXXX&PASS=XXXXX"
            let authData = authString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!
            mutableURLRequest.HTTPBody = authData

            return mutableURLRequest.copy() as NSURLRequest
        }()

        let request = Alamofire.request(URLRequest)
        request.response { request, response, data, error in
            if let response = response {
                println("Response status code: \(response.statusCode)")

                if response.statusCode == 302 {
                    println("Request was successful")
                } else {
                    println("Request was NOT successful")
                }
            } else {
                println("Error: \(error)")
            }
        }
    }
}

您需要将授权字符串编码为NSData对象,然后将其设置为HTTPBody的{​​{1}}。这应该与您发布的Java代码相匹配。

答案 2 :(得分:0)

你应该使用Alamofire的自定义编码技术(类似这样)。这是斯威夫特的第3个小时,所以请耐心等待。

struct ByteEncoding: ParameterEncoding {
  private let data: Data

  init(data: Data) {
    self.data = data
  }

  func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest {
    var urlRequest = try urlRequest.asURLRequest()
    urlRequest.httpBody = data
    return urlRequest
  }
}

Alamofire.request(url: "url", method: .post, parameters: nil, encoding: ByteEncoding(data: authBytesAsData)

文档 https://github.com/Alamofire/Alamofire#custom-encoding