我正在创建一个下载我的大学时间表的应用程序。我先用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,获取它们的字节然后将它们放入参数等等,但到目前为止似乎没有任何工作。
任何帮助都会很棒,谢谢!
答案 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)