環境 |
---|
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()
}
参考サイト