- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
大家好,在此先感谢您在理解如何将一些 NSURLConnection 代码转换为更新的 NSURLSession 方面提供的帮助。我想要做的是向服务器发出 POST 请求,并发送为 key “photo”编码的 base 64 照片。
下面我有一个用 NSURLConnection 编写的工作示例,我想将它转换为 NSURLSession。
正如我在苹果文档中所读到的那样,我应该使用数据任务,因为在我的情况下它是一个图像,如果它是像视频这样的更大的传输,我应该使用上传任务。
关于上传任务我找到了下一个tutorial但问题是,在我的例子中,我还设置了一个标题,而且我的内容类型应该是 multipart/form-data。
NSURL *url = [NSURL URLWithString:myLink];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
[request setHTTPMethod:@"POST"];
[request addValue:parameter1 forHTTPHeaderField:header1];
[request addValue:parameter2 forHTTPHeaderField:header2];
[request addValue:parameter3 forHTTPHeaderField:header3];
[request addValue:parameter4 forHTTPHeaderField:header4];
[request addValue:parameter5 forHTTPHeaderField:header5];
[request setHTTPBody:[UIImageJPEGRepresentation(avatarImage, 1.0) base64EncodedDataWithOptions:NSDataBase64Encoding64CharacterLineLength]];
[NSURLConnection sendAsynchronousRequest:request
queue:[NSOperationQueue mainQueue]
completionHandler:^(NSURLResponse *response, NSData *data, NSError *error){
NSHTTPURLResponse *httpResp = (NSHTTPURLResponse*) response;
NSError *jsonError;
if(httpResp.statusCode == 200){
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data
options:NSJSONReadingAllowFragments
error:&error];
if (!jsonError) {
[[NSUserDefaults standardUserDefaults] setObject:[dict objectForKey:@"photo_url"] forKey:@"avatarLink"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
}
else {
NSString *errorCode = [NSString stringWithFormat:@"An error has occured while uploading the avatar: %ld", (long)httpResp.statusCode];
[GeneralUse showAlertViewWithMessage:errorCode andTitle:@"Error"];
}
}];
我想提一下,我尝试使用 Ray Wenderlich 教程构建一个工作示例,但我在设置标题的方式上遇到了错误
提前感谢您提供的任何帮助!
最佳答案
我正在使用我编写的一个简单的 HTTPClient 类,但不幸的是它目前不支持上传任务。但下面我提出了一种创建此类上传任务的方法。我的客户端维护对 NSURLSession 的引用和正在运行的任务的字典(键是任务本身,值是收到的 NSData)作为异步处理(可能多个) session 任务的响应数据接收的一种方式。为了工作,我的客户实现了以下协议(protocol):.我将按如下方式创建上传任务:
- (NSURLSessionTask *) startUploadTaskForURL: (NSURL *) url withData: (NSData *) data {
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"POST"];
[request addValue:@"multipart/form-data" forHTTPHeaderField:@"Content-Type"];
NSURLSessionUploadTask uploadTask = [self.session uploadTaskWithRequest:request fromData:data];
[self scheduleTask:task];
return task;
}
- (void) scheduleTask: (NSURLSessionTask *) task {
[self.runningTasks setObject:[NSMutableData data] forKey:task];
[task resume];
}
- (NSMutableData *) dataForTask: (NSURLSessionTask *) task {
return [self.runningTasks objectForKey:task];
}
- (void) URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data {
NSString *dataString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"HTTPClient: Data task received data: %@", dataString);
NSMutableData *runningData = [self dataForTask:dataTask];
if (!runningData) {
NSLog(@"No data found for task");
}
[runningData appendData: data];
}
- (void) URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {
NSLog(@"HTTPClient: Task completed with error: %@", error);
// my client also works with a delegate, so as to make it reusable
[self.delegate sessionTask:task completedWithError:error data:[self dataForTask:task]];
}
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didSendBodyData:(int64_t)bytesSent totalBytesSent:(int64_t)totalBytesSent totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend {
NSLog(@"HTTPClient: did send body data: %lld of %lld bytes ", totalBytesSent, totalBytesExpectedToSend);
}
关于ios - 将 NSURLConnection 转换为 NSURLSessionUploadTask 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31362790/
我已经成功实现了 NSURLSessionUploadTask 并在后台和前台工作。但是读取响应数据时出现问题。 - (void)URLSession:(NSURLSession *)session
我必须设计一些东西来响应服务器的连接丢失,并支持在 iOS 后台上传。 如果由于连接丢失而导致上传失败,它应该从失败的偏移量重新开始。 我有能力询问服务器它是否有文件的一部分或者它有多少文件。 有没有
这个问题在这里已经有了答案: URLSessionUploadTask getting automatically cancelled instantly (3 个回答) 已关闭 3 年前。
我需要将文件上传到服务器并且请求必须指定一些表单参数。我如何使用 NSURLSessionUploadTask 执行此操作?换句话说,我如何发送多部分 POST 请求。 干杯 最佳答案 使用 NSUR
当我的应用程序在后台时,我想使用 NSURLSessionUploadTask 上传许多文件。 通过适当配置的 NSURLSession 对象,用于排队后台上传的 API 是: NSURLSessio
我在下面有这段代码,它向我的服务器发送图像和一些文本: NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfigura
我在使用 NSURLSession 框架时有一些误解,这就是为什么我决定在没有 AFFramework/Alamofire 的情况下从头开始编写小应用程序。 我有一个 API 需要执行以下步骤来上传文
我正在开发一个将图像上传到服务器的应用程序,我正在使用后台 NSURLSessionUploadTask。这非常适合少量上传的图像,例如 10 到 20 张照片。但是,我在尝试一次上传 100 多张图
下面是上传图像文件的片段。我只想使用 NSURLSessionUploadTask,因为它提供了我想在我的应用程序中使用的后台上传功能。 此外,我还想在上传文件时发送参数。 此外,我不擅长服务器端代码
我正在使用 AFNetworking 将视频文件上传到服务器,但几乎每次我尝试上传文件时都会遇到上传超时问题。 我正在尝试同时上传多个文件,到目前为止我尝试的最大值是 2,因为它们一直超时。 相关代码
我正在使用 NSURLSessionUploadTask 上传文件。 这里是我的部分代码不完整 let session:NSURLSession = NSURLSession(configuratio
我正在尝试通过 AFNetworking 使用 NSURLSessionUploadTask 通过多部分请求上传文件。请求执行并收到来自服务器的响应,但服务器未收到表单中的数据。 iOS 代码 NSS
我有一个应用程序,可以上传 TSPhoto 对象数组中保存的多张图片。 当我开始上传时,委托(delegate)方法最终会触发并告知它已完成,但应用程序从未访问服务器并且 Instruments 未显
在我的应用程序中,当应用程序进入后台时,我尝试将一些数据上传到服务器。这是我正在使用的代码: session self.session = [self backgroundSession]; 我的 s
毫无疑问,人们会对以下内容感到羞愧地摇头,但我将不胜感激。 我似乎在整个程序中使用几乎相同的结构对 NSURLSessionUploadTask 进行了相同的调用。因此,我试图使它成为一个我可以从程序
我需要类似于 Facebook 的离线发布功能的东西。基本上,无论连接状态如何,我都希望用户在设备上本地创建内容,并且只要互联网可用,它就应该 POST/PUT 到服务器。 我在互联网上搜索了一个解决
有时(猜测是否发生错误)NSURLSessionUploadTask对象开始上传(从零字节开始)。如何避免这种行为?我希望它进入失败状态。如果我得到它的 totalBytesSent,我可以在应用程序
服务器端是一个 PHP Web 服务,它接受 post 参数 userid、authenticationKey、一些标题、一些评论和一个文件 我正在 iPhone 上录制音频并上传到此服务。如果我使用
当我的应用程序在前台运行时,我看到定期调用:NSURLSessionTaskDelegate -> URLSession:task:didSendBodyData:totalBytesSent:tot
编辑:好的,我只是将内容类型 header 设置为 multipart/form-data 没有区别。我的原始问题如下: 这是我关于堆栈溢出的第一个问题,我希望我做对了。 我只是在学习 Objecti
我是一名优秀的程序员,十分优秀!