【问题标题】:Using NSURLSession with HTTP REST API on IOS in Swift在 Swift 的 IOS 上使用 NSURLSession 和 HTTP REST API
【发布时间】:2016-09-22 19:05:47
【问题描述】:

我正在创建基于NSURLURL,然后使用NSURLSession 将文件发送到REST API(self.prefix 是一个类似于

的字符串

/var/mobile/Applications/39FEBF47-6B74-48F2-8484-638D4B79A5FC/Documents/app/s7UqOoLJcI7tUCB/file.png)。

let UUID: String = "'UUID:" + (randomStringWithLength(32) as String) + "' "

let ContentType: String =  "Content-Type:image/png < "

let str: String = "http://link/convert 'X-Auth-Token:a351sfddsf2cbcce8' 'X-Project-ID:2222' " + UUID + ContentType + self.prefix

let url = NSURL(string: str)
        let task = NSURLSession.sharedSession().dataTaskWithURL(url!) {(data, response, error) in
            print(NSString(data: data!, encoding: NSUTF8StringEncoding))
        }

task.resume()

我来了

"致命错误:在展开 Optional 时意外发现 nil 价值”

因为 URL 为零。我应该怎么做才能正确构建与 REST API 通信的 URL?

这是与 API 交互在命令行中的样子:

http 链接:80/action 'X-Auth-Token:a3s33cfeffswffffs5454534bcce8' 'X-Project-ID:1234' 'UUID:abcdef123456' 内容类型:image/jpg

我目前创建了一个如下所示的 HTTP 请求,但看不到任何响应。

        self.currentImage.image = tempImage

        let body = NSMutableData()
        let boundary = generateBoundaryString()
        let fname = self.prefix
        let mimetype = "image/png"

        let imageData: NSData = UIImagePNGRepresentation(self.currentImage.image!)!


        let UUID: String = randomStringWithLength(12) as String
        let url = NSURL(string: "http://aaaa/bbb")!

        let request = NSMutableURLRequest(URL: url)
        request.HTTPMethod = "POST"
        request.setValue("image/png", forHTTPHeaderField: "Content-Type")
        request.setValue("aa", forHTTPHeaderField: "X-Auth-Token")
        request.setValue("aaa", forHTTPHeaderField: "X-Project-ID")
        request.setValue(UUID, forHTTPHeaderField: "UUID")
        request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")

        body.appendData("--\(boundary)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
        body.appendData("Content-Disposition:form-data; name=\"test\"\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
        body.appendData("hi\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)

        body.appendData("--\(boundary)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
        body.appendData("Content-Disposition:form-data; name=\"file\"; filename=\"\(fname)\"\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
        body.appendData("Content-Type: \(mimetype)\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
        body.appendData(imageData)
        body.appendData("\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)


        body.appendData("--\(boundary)--\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)

        request.HTTPBody = body

        let session = NSURLSession.sharedSession()

        let task = session.dataTaskWithRequest(request) { data, response, error in
            if let response = response, data = data {
                print(String(data: data, encoding: NSUTF8StringEncoding))
            }
        }


        task.resume()

【问题讨论】:

  • 请举例说明什么是有效的 URL。您的“在命令行中”示例不是有效的 URL。
  • @EricD 在命令行示例中与 url 的交互是 http (github.com/jkbrzt/httpie) 并且只有 url -- url 从 link:80 开始。因此,例如 abc/action 'X-Auth-Token:a3513cf345345345' 'X-Project-ID:845c3' 'UUID:abcdef123456' Content-Type:image/png
  • 不是一个URL,这是一个带参数的命令行。
  • @EricD sth.com/action 'X-Auth-Token:a3513cfesdfsdfsdf' 'X-Project-ID:8413' 'UUID:ase56' Content-Type:image/png

标签: ios swift rest nsurlsession nsurl


【解决方案1】:

我认为这里有些地方是错误的......

1/ 您在那里构建的 url 不是 url...您要构建的是带有标头的请求。而是这样做:

let url = NSURL(string: "http://link.com/convert")!

let request = NSMutableURLRequest(URL: url)
request.HTTPMethod = "POST"
request.setValue("image/png", forHTTPHeaderField: "Content-Type")
request.setValue("a351sfddsf2cbcce8", forHTTPHeaderField: "X-Auth_Token")
request.setValue("2222", forHTTPHeaderField: "X-Project-ID")

然后创建 NSURLSession

let session = NSURLSession.sharedSession()

然后创建任务

let task = session.dataTaskWithRequest(request) { data, response, error in
    if let response = response, data = data {
        print(String(data: data, encoding: NSUTF8StringEncoding))
    }
}

那就发吧!

task.resume()

注意:我没有将你的 self.prefix 添加到 URL 中......你可能需要把它放在请求的有效负载或其他东西中......但这将解决你的 URL nil 问题,并且是一种简洁的方式向 REST API 发出 POST 请求

还有

您的 URL 链接 http://link/convert 无效

【讨论】:

  • 我有一个有效的链接。只是说它是一种更简单的形式。
  • 太棒了——只是说以防万一:)
  • 鉴于我的硬盘上有一个文件,我曾经发送过类似 Content-Type:image/jpg
  • 这告诉你如何...寻找他们添加图像的body部分...谷歌搜索upload image swift post request得到了这个结果:)kaleidosblog.com/…
  • let body = NSMutableData()request.HTTPBody = body 之间的行
猜你喜欢
  • 1970-01-01
  • 2016-06-13
  • 1970-01-01
  • 2018-04-20
  • 2017-01-25
  • 2016-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多