如何快速发送带有尸体的 POST 请求

我想用 Alamofire 发布一条关于一具尸体的信息。

我的 Json 身材看起来像:

{
"IdQuiz" : 102,
"IdUser" : "iosclient",
"User" : "iosclient",
"List":[
{
"IdQuestion" : 5,
"IdProposition": 2,
"Time" : 32
},
{
"IdQuestion" : 4,
"IdProposition": 3,
"Time" : 9
}
]
}

我正在尝试使 let list与 NSDictionary 看起来像:

[[Time: 30, IdQuestion: 6510, idProposition: 10], [Time: 30, IdQuestion: 8284, idProposition: 10]]

而我使用 Alamofire 的请求看起来像:

Alamofire.request(.POST, "http://myserver.com", parameters: ["IdQuiz":"102","IdUser":"iOSclient","User":"iOSClient","List":list ], encoding: .JSON)
.response { request, response, data, error in
let dataString = NSString(data: data!, encoding:NSUTF8StringEncoding)
println(dataString)
}

该请求有一个错误,我相信问题是与字典列表,因为如果我提出了一个请求,没有列表它工作正常,所以有什么想法?


我试过建议的解决办法,但我面临着同样的问题:

 let json = ["List":list,"IdQuiz":"102","IdUser":"iOSclient","UserInformation":"iOSClient"]
let data = NSJSONSerialization.dataWithJSONObject(json, options: NSJSONWritingOptions.PrettyPrinted,error:nil)
let jsons = NSString(data: data!, encoding: NSUTF8StringEncoding)






Alamofire.request(.POST, "http://myserver.com", parameters: [:], encoding: .Custom({
(convertible, params) in
var mutableRequest = convertible.URLRequest.copy() as! NSMutableURLRequest
mutableRequest.HTTPBody = jsons!.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
return (mutableRequest, nil)
}))
.response { request, response, data, error in
let dataString = NSString(data: data!, encoding:NSUTF8StringEncoding)
println(dataString)
}
204923 次浏览

很接近了。参数字典格式看起来不正确。您应该尝试以下方法:

let parameters: [String: AnyObject] = [
"IdQuiz" : 102,
"IdUser" : "iosclient",
"User" : "iosclient",
"List": [
[
"IdQuestion" : 5,
"IdProposition": 2,
"Time" : 32
],
[
"IdQuestion" : 4,
"IdProposition": 3,
"Time" : 9
]
]
]


Alamofire.request(.POST, "http://myserver.com", parameters: parameters, encoding: .JSON)
.responseJSON { request, response, JSON, error in
print(response)
print(JSON)
print(error)
}

希望这能解决你的问题。如果没有,请回复,我会相应地调整我的答案。

有一些变化我想通知。从现在开始,您可以从响应对象访问请求、 JSON 和错误。

        let urlstring = "Add URL String here"
let parameters: [String: AnyObject] = [
"IdQuiz" : 102,
"IdUser" : "iosclient",
"User" : "iosclient",
"List": [
[
"IdQuestion" : 5,
"IdProposition": 2,
"Time" : 32
],
[
"IdQuestion" : 4,
"IdProposition": 3,
"Time" : 9
]
]
]


Alamofire.request(.POST, urlstring, parameters: parameters, encoding: .JSON).responseJSON { response in
print(response.request)  // original URL request
print(response.response) // URL response
print(response.data)     // server data
print(response.result)   // result of response serialization


if let JSON = response.result.value {
print("JSON: \(JSON)")
}
response.result.error
}

如果你正在使用 Alamofire v4.0 + ,那么可以接受的答案是这样的:

let parameters: [String: Any] = [
"IdQuiz" : 102,
"IdUser" : "iosclient",
"User" : "iosclient",
"List": [
[
"IdQuestion" : 5,
"IdProposition": 2,
"Time" : 32
],
[
"IdQuestion" : 4,
"IdProposition": 3,
"Time" : 9
]
]
]


Alamofire.request("http://myserver.com", method: .post, parameters: parameters, encoding: JSONEncoding.default)
.responseJSON { response in
print(response)
}

Xcode 8.X Swift 3. X

使用方便;

    let params:NSMutableDictionary? = [
"IdQuiz" : 102,
"IdUser" : "iosclient",
"User" : "iosclient",
"List": [
[
"IdQuestion" : 5,
"IdProposition": 2,
"Time" : 32
],
[
"IdQuestion" : 4,
"IdProposition": 3,
"Time" : 9
]
]
];
let ulr =  NSURL(string:"http://myserver.com" as String)
let request = NSMutableURLRequest(url: ulr! as URL)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
let data = try! JSONSerialization.data(withJSONObject: params!, options: JSONSerialization.WritingOptions.prettyPrinted)


let json = NSString(data: data, encoding: String.Encoding.utf8.rawValue)
if let json = json {
print(json)
}
request.httpBody = json!.data(using: String.Encoding.utf8.rawValue);




Alamofire.request(request as! URLRequestConvertible)
.responseJSON { response in
// do whatever you want here
print(response.request)
print(response.response)
print(response.data)
print(response.result)


}

到目前为止,我不喜欢其他任何答案(也许除了 SwiftDeveloper 的 ) ,因为它们要么要求您反序列化 JSON,只是为了再次序列化它,要么关心 JSON 本身的结构。

正确的 回答已经由 afrodev 在另一个问题中发布了。你应该去给它投赞成票。

Below is just my adaption, with some minor changes (primarily explicit UTF-8 charset).

let urlString = "https://example.org/some/api"
let json = "{\"What\":\"Ever\"}"


let url = URL(string: urlString)!
let jsonData = json.data(using: .utf8, allowLossyConversion: false)!


var request = URLRequest(url: url)
request.httpMethod = HTTPMethod.post.rawValue
request.setValue("application/json; charset=UTF-8", forHTTPHeaderField: "Content-Type")
request.httpBody = jsonData


Alamofire.request(request).responseJSON {
(response) in


print(response)
}

我稍微编辑了 SwiftDeveloper的答案,因为它对我不起作用。我还添加了 Alamofire 验证。

let body: NSMutableDictionary? = [
"name": "\(nameLabel.text!)",
"phone": "\(phoneLabel.text!))"]


let url = NSURL(string: "http://server.com" as String)
var request = URLRequest(url: url! as URL)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
let data = try! JSONSerialization.data(withJSONObject: body!, options: JSONSerialization.WritingOptions.prettyPrinted)


let json = NSString(data: data, encoding: String.Encoding.utf8.rawValue)
if let json = json {
print(json)
}
request.httpBody = json!.data(using: String.Encoding.utf8.rawValue)
let alamoRequest = Alamofire.request(request as URLRequestConvertible)
alamoRequest.validate(statusCode: 200..<300)
alamoRequest.responseString { response in


switch response.result {
case .success:
...
case .failure(let error):
...
}
}

如果你使用的是 swift4Alamofire v4.0,那么接受的代码应该是这样的:

            let parameters: Parameters = [ "username" : email.text!, "password" : password.text! ]
let urlString = "https://api.harridev.com/api/v1/login"
let url = URL.init(string: urlString)
Alamofire.request(url!, method: .put, parameters: parameters, encoding: JSONEncoding.default, headers: nil).responseJSON { response in
switch response.result
{
case .success(let json):
let jsonData = json as! Any
print(jsonData)
case .failure(let error):
self.errorFailer(error: error)
}
}

下面是我如何使用 swift 创建 Http POST 请求,该请求需要使用 Json 编码和 Header 的参数。

创建 API 客户端 BKCAPIClient 作为一个共享实例,它将包括所有类型的请求,如 POST、 GET、 PUT、 DELETE 等。

func postRequest(url:String, params:Parameters?, headers:HTTPHeaders?, completion:@escaping (_ responseData:Result<Any>?, _ error:Error?)->Void){
Alamofire.request(url, method: .post, parameters: params, encoding: JSONEncoding.default, headers: headers).responseJSON {
response in
guard response.result.isSuccess,
(response.result.value != nil) else {
debugPrint("Error while fetching data: \(String(describing: response.result.error))")
completion(nil,response.result.error)
return
}
completion(response.result,nil)
}
}

Created Operation 类,包含特定请求所需的所有数据,还包含完成块内部的解析逻辑。

func requestAccountOperation(completion: @escaping ( (_ result:Any?, _ error:Error?) -> Void)){
BKCApiClient.shared.postRequest(url: BKCConstants().bkcUrl, params: self.parametrs(), headers: self.headers()) { (result, error) in
if(error != nil){
//Parse and save to DB/Singletons.
}
completion(result, error)
}
}
func parametrs()->Parameters{
return ["userid”:”xnmtyrdx”,”bcode":"HDF"] as Parameters
}
func headers()->HTTPHeaders{
return ["Authorization": "Basic bXl1c2VyOm15cGFzcw",
"Content-Type": "application/json"] as HTTPHeaders
}

在需要此数据的任何视图控制器中调用 API

func callToAPIOperation(){
let accOperation: AccountRequestOperation = AccountRequestOperation()
accOperation.requestAccountOperation{(result, error) in


}}
func get_Contact_list()
{
ApiUtillity.sharedInstance.showSVProgressHUD(text: "Loading..")
let cont_nunber = contact_array as NSArray
print(cont_nunber)


let token = UserDefaults.standard.string(forKey: "vAuthToken")!
let apiToken = "Bearer \(token)"




let headers = [
"Vauthtoken": apiToken,
"content-type": "application/json"
]


let myArray: [Any] = cont_nunber as! [Any]
let jsonData: Data? = try? JSONSerialization.data(withJSONObject: myArray, options: .prettyPrinted)
//        var jsonString: String = nil
var jsonString = String()
if let aData = jsonData {
jsonString = String(data: aData, encoding: .utf8)!
}


let url1 = "URL"
var request = URLRequest(url: URL(string: url1)!)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = jsonData as! Data


//        let session = URLSession.shared


let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data, error == nil else {
print("error=\(String(describing: error))")
ApiUtillity.sharedInstance.dismissSVProgressHUD()
return
}


print("response = \(String(describing: response))")




let responseString = String(data: data, encoding: .utf8)
print("responseString = \(String(describing: responseString))")


let json =  self.convertStringToDictionary(text: responseString!)! as NSDictionary
print(json)


let status = json.value(forKey: "status") as! Int


if status == 200
{


let array = (json.value(forKey: "data") as! NSArray).mutableCopy() as! NSMutableArray




}
else if status == 401
{
ApiUtillity.sharedInstance.dismissSVProgressHUD()


}
else
{
ApiUtillity.sharedInstance.dismissSVProgressHUD()
}




}
task.resume()
}


func convertStringToDictionary(text: String) -> [String:AnyObject]? {
if let data = text.data(using: String.Encoding.utf8) {
do {
let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String:AnyObject]
return json
} catch {
print("Something went wrong")
}
}
return nil
}

如果有人想知道如何继续处理模型和其他东西,请看下面

        var itemArr: [Dictionary<String, String>] = []
for model in models {
let object = ["param1": model.param1,
"param2": model.param2]
itemArr.append(object as! [String : String])
}


let param = ["field1": someValue,
"field2": someValue,
"field3": itemArr] as [String : Any]


let url: URLConvertible = "http://------"


Alamofire.request(url, method: .post, parameters: param, encoding: JSONEncoding.default)
.responseJSON { response in
self.isLoading = false
switch response.result {
case .success:
break
case .failure:
break
}
}

使用 POST、参数和 Header 获取数据

func feedbackApi(){
DispatchQueue.main.async {
let headers = [
"Content-Type": "application/x-www-form-urlencoded",
"Authorization": "------"
]
let url = URL(string: "---------")
var parameters = [String:AnyObject]()
parameters =  [
"device_id":"-----" as AnyObject,
"user_id":"----" as AnyObject,
"cinema_id":"-----" as AnyObject,
"session_id":"-----" as AnyObject,
]
Alamofire.request(url!, method: .post, parameters: parameters,headers:headers).responseJSON { response in
switch response.result{
case.success(let data):
self.myResponse = JSON(data)
print(self.myResponse as Any)
let slide = self.myResponse!["sliders"]
print(slide)
print(slide.count)
for i in 0..<slide.count{
let single = Sliders(sliderJson: slide[i])
self.slidersArray.append(single)
}
DispatchQueue.main.async {
self.getSliderCollection.reloadData()
}
case .failure(let error):
print("dddd",error)
}


}
}


}

接受回答 Xcode 11 -Swift 5-< strong > Alamofire 5.0

func postRequest() {
let parameters: [String: Any] = [
"IdQuiz" : 102,
"IdUser" : "iosclient",
"User" : "iosclient",
"List": [
[
"IdQuestion" : 5,
"IdProposition": 2,
"Time" : 32
],
[
"IdQuestion" : 4,
"IdProposition": 3,
"Time" : 9
]
]
]
AF.request("http://myserver.com", method:.post, parameters: parameters,encoding: JSONEncoding.default) .responseJSON { (response) in
print(response)
}
}

Alamofire ~5.2 and Swift 5

You can structure your parameter data

使用 fake json api

struct Parameter: Encodable {
let token: String = "xxxxxxxxxx"
let data: Dictionary = [
"id": "personNickname",
"email": "internetEmail",
"gender": "personGender",
]
}


let parameters = Parameter()


AF.request("https://app.fakejson.com/q", method: .post, parameters: parameters).responseJSON { response in
print(response)
}

Alamofire 5.5和 Swift 5

func postRequest() {
let parameters: [String : Any] = [
"IdQuiz" : 102,
"IdUser" : "iosclient",
"User" : "iosclient",
"List": [
[
"IdQuestion" : 5,
"IdProposition": 2,
"Time" : 32
],
[
"IdQuestion" : 4,
"IdProposition": 3,
"Time": 9
]
]
]
  

let url = URL(string: "http://myserver.com/api/post")!
AF.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default)
.validate()
.responseJSON { response in
switch response.result {
case .success(let response):
print(response)
case .failure(let error):
print(error.localizedDescription)
}
}
}