LoginSignup
15
14

More than 5 years have passed since last update.

[Swift]multipartデータでPOSTする方法iOS8.3対応Swift1.2対応版

Last updated at Posted at 2015-05-03
環境
ios8.3
Xcode6.3.1
Swift1.2

今回はjson形式のデータをサーバーにPOSTする方法にハマったのでメモ書きとして残します。

参考サイト:
http://lv4.hateblo.jp/entry/2014/07/30/231634
↑こちらを参考に作成したのですが、ios8.1、ios8.2はOKだったけど、
ios8.3だけ送信できないよ!!って言われたので、改良しました。
原因は多分Content-Lengthを入れてなかったからだと思うけど...。

原因についてこっちに何かそれっぽいこと書いてあるし↓
http://stackoverflow.com/questions/29528293/nsmutableurlrequest-body-malformed-after-ios-8-3-update

使い方はjson形式のデータを引数に以下のメソッドを呼ぶだけ。
まぁ試してないけどjsonに限らず書方変えれば画像とかもいけると思う。


func pushJsonData(jsonStr: String) {

        let url = NSURL(string: "\(Const.URL)")
        var request = NSMutableURLRequest(URL: url!)
        let strData = jsonStr.dataUsingEncoding(NSUTF8StringEncoding)
        let boundary = String(arc4random() % 10000000)
        let config = NSURLSessionConfiguration.defaultSessionConfiguration()
        // ヘッダー
        request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
        let session = NSURLSession(configuration: config)

        // ボディー
        let post = NSMutableData()
        post.appendData("--\(boundary)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
        post.appendData("Content-Disposition: form-data;".dataUsingEncoding(NSUTF8StringEncoding)!)
        post.appendData("name=\"fileup\";".dataUsingEncoding(NSUTF8StringEncoding)!)
        post.appendData("filename=\"tmp_file.json\"\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
        post.appendData("Content-Type: application/json\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
        post.appendData(strData!)
        post.appendData("\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
        post.appendData("--\(boundary)--\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)

        request.setValue(String(post.length), forHTTPHeaderField: "Content-Length")
        request.HTTPMethod = "POST"
        request.HTTPBody = post

        let task: NSURLSessionDataTask = session.dataTaskWithRequest(request, completionHandler: { data, request, error in
            var result = NSString(data: data, encoding: NSUTF8StringEncoding) as! String
            NSLog("<result=\"\(result)\">")
            if error == nil {
                // メインに処理移譲
                dispatch_sync(dispatch_get_main_queue()) {
                    let alert = UIAlertView(title: "送信結果", message: "送信完了", delegate: self, cancelButtonTitle: "OK")
                    alert.show()
                }
            }
            else {
                // メインに処理移譲
                dispatch_sync(dispatch_get_main_queue()) {
                    let alert = UIAlertView(title: "送信結果", message: "送信失敗", delegate: self, cancelButtonTitle: "OK")
                    alert.show()
                }
            }
        })
        task.resume()
    }


参考サイト

15
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
14