Swift2 GCDWebServerFileResponse失败,错误代码=-1017“;无法分析响应";
我试图使用GCDWebServerFileResponse将文件从一个设备发送到另一个设备,但每次都出现以下错误:Swift2 GCDWebServerFileResponse失败,错误代码=-1017“;无法分析响应";,swift2,ios9,gcdwebserver,Swift2,Ios9,Gcdwebserver,我试图使用GCDWebServerFileResponse将文件从一个设备发送到另一个设备,但每次都出现以下错误: Optional(Error Domain=NSURLErrorDomain Code=-1017 "cannot parse response" UserInfo={NSUnderlyingError=0x14e6d46a0 {Error Domain=kCFErrorDomainCFNetwork Code=-1017 "(null)" UserInfo={_kCFStream
Optional(Error Domain=NSURLErrorDomain Code=-1017 "cannot parse response" UserInfo={NSUnderlyingError=0x14e6d46a0 {Error Domain=kCFErrorDomainCFNetwork Code=-1017 "(null)" UserInfo={_kCFStreamErrorCodeKey=-1, _kCFStreamErrorDomainKey=4}}, NSErrorFailingURLStringKey=http://xx.xx.xx.xx:8080/course.json, NSErrorFailingURLKey=http://xx.xx.xx.xx:8080/course.json, _kCFStreamErrorDomainKey=4, _kCFStreamErrorCodeKey=-1, NSLocalizedDescription=cannot parse response})
以下是我的GET请求代码:
func sendGetRequestToTeacher(data: AnyObject, IP: String, completionHandler: ((Bool, AnyObject) -> Void)? = nil) {
let archivedData = NSKeyedArchiver.archivedDataWithRootObject(data)
let url = NSURL(string: ("http://" + IP + ":\(self.port)/" + "course.json"))!
let request = NSMutableURLRequest(URL: url, cachePolicy: NSURLRequestCachePolicy.UseProtocolCachePolicy, timeoutInterval: 30.0)
request.networkServiceType = NSURLRequestNetworkServiceType.NetworkServiceTypeVoIP
request.HTTPMethod = "GET"
request.HTTPBody = archivedData
request.setValue("application/octet-stream", forHTTPHeaderField: "Accept")
request.setValue("application/octet-stream", forHTTPHeaderField: "Content-Type")
request.setValue("\(archivedData.length)", forHTTPHeaderField: "Content-Length")
let task = NSURLSession.sharedSession().dataTaskWithRequest(request, completionHandler: { (data, response, err) -> Void in
dispatch_async(dispatch_get_main_queue(), { () -> Void in
if let err = err {
completionHandler?(false, err)
} else if let data = data, let unarchivedData = NSKeyedUnarchiver.unarchiveObjectWithData(data) {
completionHandler?(true, unarchivedData)
}
})
})
task.resume()
}
这是我的GET处理程序:
private func addDefaultHandlerForGetMethod() {
self.server.addGETHandlerForBasePath("/", directoryPath: "/", indexFilename: nil, cacheAge: 3600, allowRangeRequests: true)
}
private func addHandlerForGetMethod() {
self.server.addHandlerWithMatchBlock({ (requestMethod, requestURL, requestHeaders, urlPath, urlQuery) in
if requestMethod != "GET" {
return nil
}
if !urlPath.hasSuffix("/course.json") {
return nil
}
return GCDWebServerRequest(method: requestMethod, url: requestURL, headers: requestHeaders, path: urlPath, query: urlQuery)
}, processBlock: { (request) in
let filePath = STCCourseManager.sharedInstance.coursesFolderPath.stringByAppendingPathComponent((STCCourseManager.sharedInstance.currentCourseID?.stringByAppendingPathComponent(request.path.stringByRemovingPercentEncoding!))!)
do {
let fileAttributes = try NSFileManager.defaultManager().attributesOfItemAtPath(filePath)
if let fileType = fileAttributes[NSFileType] as? String where fileType == NSFileTypeRegular {
let response = GCDWebServerFileResponse(file: filePath, byteRange: request.byteRange)
response.setValue("bytes", forAdditionalHeader: "Accept-Ranges")
response.cacheControlMaxAge = 3600
return response
}
} catch {
print("\(error)")
}
return GCDWebServerResponse(statusCode: GCDWebServerClientErrorHTTPStatusCode.HTTPStatusCode_NotFound.rawValue)
})
另外,我刚刚意识到,如果使用curl-v,请求将由defaultHandlerForGet处理,它将在终端中正确返回文件,但是我的自定义处理程序返回“Not Found”。我的自定义处理程序缺少什么
我非常感谢您对解决此问题的帮助。我将请求更改为以下内容,从而解决了此问题:
let url = NSURL(string: ("http://" + IP + ":\(self.port)/" + "distribution"))!
let request = NSMutableURLRequest(URL: url)
request.timeoutInterval = 30.0
不确定之前的请求有什么问题。可能是我有一些标题字段设置不正确。因为没有任何答案,我接受了这个解决方案。如果您尝试从终端呼叫您的服务器,例如使用
curl-v[url]
?@Pol:我刚刚用在终端中使用curl命令后看到的结果更新了我的问题。不要用Swift编程,所以我帮不了什么忙,但是,如果您使用Xcode调试器逐步检查处理程序,您应该能够了解发生了什么。另外,请确保按照正确的顺序安装处理程序,因为最后一个安装的处理程序是在请求中首先调用的。