Kar*_*arl 75 http request ios swift alamofire
如何在我的iOS应用程序中使用Alamofire在HTTP正文中发送带有简单字符串的POST请求?
默认情况下,Alamofire需要请求的参数:
Alamofire.request(.POST, "http://mywebsite.com/post-request", parameters: ["foo": "bar"])
Run Code Online (Sandbox Code Playgroud)
这些参数包含键值对.但我不想在HTTP正文中发送带有键值字符串的请求.
我的意思是这样的:
Alamofire.request(.POST, "http://mywebsite.com/post-request", body: "myBodyString")
Run Code Online (Sandbox Code Playgroud)
Sil*_*ril 83
您的示例Alamofire.request(.POST, "http://mywebsite.com/post-request", parameters: ["foo": "bar"])已包含"foo = bar"字符串作为其正文.但如果你真的想要自定义格式的字符串.你可以这样做:
Alamofire.request(.POST, "http://mywebsite.com/post-request", parameters: [:], encoding: .Custom({
(convertible, params) in
var mutableRequest = convertible.URLRequest.copy() as NSMutableURLRequest
mutableRequest.HTTPBody = "myBodyString".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
return (mutableRequest, nil)
}))
Run Code Online (Sandbox Code Playgroud)
注意:parameters不应该nil
更新(Alamofire 4.0,Swift 3.0):
在Alamofire 4.0 API已经改变.因此,对于自定义编码,我们需要符合ParameterEncoding协议的值/对象.
extension String: ParameterEncoding {
public func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest {
var request = try urlRequest.asURLRequest()
request.httpBody = data(using: .utf8, allowLossyConversion: false)
return request
}
}
Alamofire.request("http://mywebsite.com/post-request", method: .post, parameters: [:], encoding: "myBody", headers: [:])
Run Code Online (Sandbox Code Playgroud)
小智 51
你可以这样做:
把httpBody放入数据中
var request = URLRequest(url: URL(string: url)!)
request.httpMethod = HTTPMethod.post.rawValue
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
let pjson = attendences.toJSONString(prettyPrint: false)
let data = (pjson?.data(using: .utf8))! as Data
request.httpBody = data
Alamofire.request(request).responseJSON { (response) in
print(response)
}
Run Code Online (Sandbox Code Playgroud)Cem*_*YRI 11
如果您使用Alamofire,将类型编码为"URLEncoding.httpBody"就足够了
有了它,您可以在httpbody中将数据作为字符串发送,尽管您在代码中定义了json.
它对我有用..
更新
var url = "http://..."
let _headers : HTTPHeaders = ["Content-Type":"application/x-www-form-urlencoded"]
let params : Parameters = ["grant_type":"password","username":"mail","password":"pass"]
let url = NSURL(string:"url" as String)
request(url, method: .post, parameters: params, encoding: URLEncoding.httpBody , headers: _headers).responseJSON(completionHandler: {
response in response
let jsonResponse = response.result.value as! NSDictionary
if jsonResponse["access_token"] != nil
{
access_token = String(describing: jsonResponse["accesstoken"]!)
}
})
Run Code Online (Sandbox Code Playgroud)
我修改了@Silmaril的答案,以扩展Alamofire的经理.此解决方案使用EVReflection直接序列化对象:
//Extend Alamofire so it can do POSTs with a JSON body from passed object
extension Alamofire.Manager {
public class func request(
method: Alamofire.Method,
_ URLString: URLStringConvertible,
bodyObject: EVObject)
-> Request
{
return Manager.sharedInstance.request(
method,
URLString,
parameters: [:],
encoding: .Custom({ (convertible, params) in
let mutableRequest = convertible.URLRequest.copy() as! NSMutableURLRequest
mutableRequest.HTTPBody = bodyObject.toJsonString().dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
return (mutableRequest, nil)
})
)
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以像这样使用它:
Alamofire.Manager.request(.POST, endpointUrlString, bodyObject: myObjectToPost)
Run Code Online (Sandbox Code Playgroud)
基于Illya Krit的回答
import Alamofire
struct BodyStringEncoding: ParameterEncoding {
private let body: String
init(body: String) { self.body = body }
func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest {
guard var urlRequest = urlRequest.urlRequest else { throw Errors.emptyURLRequest }
guard let data = body.data(using: .utf8) else { throw Errors.encodingProblem }
urlRequest.httpBody = data
return urlRequest
}
}
extension BodyStringEncoding {
enum Errors: Error {
case emptyURLRequest
case encodingProblem
}
}
extension BodyStringEncoding.Errors: LocalizedError {
var errorDescription: String? {
switch self {
case .emptyURLRequest: return "Empty url request"
case .encodingProblem: return "Encoding problem"
}
}
}
Run Code Online (Sandbox Code Playgroud)
Alamofire.request(url, method: .post, parameters: nil, encoding: BodyStringEncoding(body: text), headers: headers).responseJSON { response in
print(response)
}
Run Code Online (Sandbox Code Playgroud)
如果要在请求中将字符串作为原始主体发布
return Alamofire.request(.POST, "http://mywebsite.com/post-request" , parameters: [:], encoding: .Custom({
(convertible, params) in
let mutableRequest = convertible.URLRequest.copy() as! NSMutableURLRequest
let data = ("myBodyString" as NSString).dataUsingEncoding(NSUTF8StringEncoding)
mutableRequest.HTTPBody = data
return (mutableRequest, nil)
}))
Run Code Online (Sandbox Code Playgroud)
我已经完成了从字符串数组。调整此解决方案以适应琴弦。
来自Alamofire 4的“本地”方式:
struct JSONStringArrayEncoding: ParameterEncoding {
private let myString: String
init(string: String) {
self.myString = string
}
func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest {
var urlRequest = urlRequest.urlRequest
let data = myString.data(using: .utf8)!
if urlRequest?.value(forHTTPHeaderField: "Content-Type") == nil {
urlRequest?.setValue("application/json", forHTTPHeaderField: "Content-Type")
}
urlRequest?.httpBody = data
return urlRequest!
}
}
Run Code Online (Sandbox Code Playgroud)
然后通过以下方式提出您的请求:
Alamofire.request("your url string", method: .post, parameters: [:], encoding: JSONStringArrayEncoding.init(string: "My string for body"), headers: [:])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
88724 次 |
| 最近记录: |