如何在swift中使用BODY发送POST请求

Str*_* B. 81 json put swift alamofire

我正在尝试使用Alamofire快速发布一个关于身体的帖子请求.

我的json身体看起来像:

{
    "IdQuiz" : 102,
    "IdUser" : "iosclient",
    "User" : "iosclient",
    "List":[
        {
        "IdQuestion" : 5,
        "IdProposition": 2,
        "Time" : 32
        },
        {
        "IdQuestion" : 4,
        "IdProposition": 3,
        "Time" : 9
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试let list使用NSDictionnary,它看起来像:

[[Time: 30, IdQuestion: 6510, idProposition: 10], [Time: 30, IdQuestion: 8284, idProposition: 10]]
Run Code Online (Sandbox Code Playgroud)

我使用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)
        }
Run Code Online (Sandbox Code Playgroud)

请求有一个错误,我相信问题是在字典列表,因为如果我提出一个没有列表的请求它工作正常,所以任何想法?


我尝试过建议的解决方案,但我遇到了同样的问题:

 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)
    }
Run Code Online (Sandbox Code Playgroud)

Gia*_*rlo 160

如果您使用的是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)
    }
Run Code Online (Sandbox Code Playgroud)

  • 大!请将接受的答案改为此答案!:)或与现有的Alamofire 3和4解决方案结合使用. (5认同)
  • 同意 - 这是“JSONEncoding”的明确声明,以消除为我执行此操作的类型的歧义。 (2认同)

cno*_*oon 88

你很亲密 参数字典格式看起来不正确.您应该尝试以下方法:

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)
    }
Run Code Online (Sandbox Code Playgroud)

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

  • 我在调用错误中得到额外的参数 (3认同)
  • @JaseemAbbas检查你的Alamofire版本,如果你在v4.0上+看看下面的答案 (3认同)

Sea*_*bet 33

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

afrodev在另一个问题中发布了正确的答案.你应该去投票吧.

下面是我的改编,有一些小的改动(主要是显式的UTF-8字符集).

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)
}
Run Code Online (Sandbox Code Playgroud)


Har*_*hna 16

Xcode 11 - Swift 5 - 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)
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 重要的!使用编码:JSONEncoding.default。我已经绞尽脑汁了好几个小时了……默认是对 GET 参数进行编码。 (4认同)

小智 10

如果你正在使用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)
                }
            }
Run Code Online (Sandbox Code Playgroud)


Swi*_*per 8

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)

            }
Run Code Online (Sandbox Code Playgroud)


Suh*_*til 6

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)
      }
  }
}
Run Code Online (Sandbox Code Playgroud)