使用带参数的NSURLSession(HTTP POST)下载PDF

时间:2016-04-21 07:22:04

标签: swift pdf post alamofire nsurlsession

我使用POST NSURLSession下载PDF文件时出现问题。我的下载网址与其他网页不同,因为它没有以文件扩展名结尾,也需要参数来下载该文件。< / p>

它来自ASPX基本服务器并返回这样的URL

http://example.com/DownloadPDF.aspx?File=ES2Ges%2BUA1CEe1150UF3uUgEDeCEMoIuOrJCbwjzVKCEfA6%2F1zKxycl6MMWcjvtk

如果我必须访问pdf并下载它,我必须提供2个参数 ConfigKeyIDAccessToken。有一点奇怪的是它是POST请求。 由于Alamofire仅支持GET下载请求,因此,我必须使用NSURLSession编写自己的自我。但是,我有从代码访问文件的问题,因为它返回html页面401。

这是html:

401 - 未经授权:由于凭据无效,访问被拒绝。

服务器错误

    

401 - 未经授权:由于凭据无效,访问被拒绝。

  

您无权使用您提供的凭据查看此目录或页面。

 

这是我的代码

protocol PDFDownloadAPIProtocol{
    func didSuccessGettingPDF()
    func didFailGettingPDF(err:NSError)
}

class PDFDownloadAPI{

var delegate : InvoicePDFDownloadAPIProtocol

init(delegate: InvoicePDFDownloadAPIProtocol){
    self.delegate=delegate
}

func post(url:String,accessToken:String,configKey :String){
    let url:NSURL = NSURL(string: url)!

    print(url)
    let session = NSURLSession.sharedSession()

    let request = NSMutableURLRequest(URL: url)
    request.HTTPMethod = "POST"
    request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringCacheData

    let param = "ConfigKeyID=\(configKey)&AccessToken=\(accessToken)"
    request.HTTPBody = param.dataUsingEncoding(NSUTF8StringEncoding)

    let task = session.downloadTaskWithRequest(request) {
        (
        let location, let response, let error) in

        guard let _:NSURL = location, let _:NSURLResponse = response  where error == nil else {
            print("Location Error")
            self.delegate.didFailGettingPDF(error!)
            return
        }

        let urlContents = try! NSString(contentsOfURL: location!, encoding: NSUTF8StringEncoding)

        guard let _:NSString = urlContents else {
            print("Content Error")
            self.delegate.didFailGettingPDF(error!)
            return
        }

        print("Downloaded Content : \(urlContents)")

        self.delegate.didSuccessGettingPDF()
    }

    task.resume()
}

func doDownloadData(url : String,accessToken:String,configKey : String){
    post(url,accessToken: accessToken,configKey : configKey)
}
}

当我尝试使用Postman所有工作文件时,我甚至可以从chrome.So下载文件,我认为我的代码有问题。任何帮助?

1 个答案:

答案 0 :(得分:0)

有可能,身份验证需要的不仅仅是POST请求字段。它可能使用cookie或身份验证标头(基于实际凭据)。

如果我错了,请检查以下内容:

  • 在将这两个魔术值添加到POST正文之前,请确保这两个魔术值已正确进行URL编码。
  • 确保您设置了Content-Type标头,以便服务器知道您以x-www-form-urlencoded格式提供正文。
  • 使用Wireshark嗅探请求并查看实际发送的内容。
  • 如果可以,请检查服务器日志。