ios - Obj-C 中的 HTTP 多部分请求

标签 ios objective-c http afnetworking

序言

所以我正在制作一个 android 应用程序的 iOS 版本。所有的 web 服务都已经设置好了,但是它们没有太多详细的文档,所以我选择从 android 代码中推断出来。除了一件小事 - HTTP Multipart 请求,项目已经完成。

我需要什么

我需要将 web-requestjava 实现到 objective-c 中。它的作用是将图像 连同用户ID 一起上传到服务器并获得响应。这是相关的 Java 代码:

HttpClient httpClient = new DefaultHttpClient();
HttpPost postRequest=new HttpPost(Constant.server_url+"usermain/Profileimagesave");
String fileName = String.format("File_%d.png",new Date().getTime());
ByteArrayBody bab = new ByteArrayBody(data, fileName);
            
MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
reqEntity.addPart("file", bab);
reqEntity.addPart("WebID", new StringBody(SharedPreferenceSession.getValue(getApplicationContext(), "WebId")));
postRequest.setEntity(reqEntity);

我尝试了什么

我已经尝试将近一周的时间来将这段代码模仿成objective-c。以下是我在接受 stefan's answer 后可以管理的内容:

[manager POST:urlstr parameters:nil
constructingBodyWithBlock:^(id<AFMultipartFormData> formData){
  [formData appendPartWithFileData:imageData
                              name:@"blahblah.jpg"
                          fileName:@"blahblah.jpg"
                          mimeType:@"image/jpeg"];

  [formData appendPartWithFormData:[webid dataUsingEncoding:NSUTF8StringEncoding]
                              name:@"WebID"];
}
     progress:nil
      success:^(NSURLSessionTask *task, id responseObject) {
          NSLog(@"Response: %@", responseObject);
      }
      failure:^(NSURLSessionTask *operation, NSError *error) {
          NSLog(@"%@",[error.userInfo objectForKey:JSONResponseSerializerWithDataKey]);
}];

我一直在尝试上述代码的很多变体,但由于我对多部分请求没有清晰的理解,所以我觉得我在兜圈子。

我得到了什么

我从服务器收到 500 错误。

PHP warning

copy(../UserData/ThumbPhotos/MOB274565CCM_20151230062220.): failed to open stream: No such file or directory

1773 $login1=$login->LoginID;
1774 $curr_date=date("YmdHis");
1775 $currentname=$webid."_".+$curr_date;
1776
1777 //echo "file size:".$_FILES['file']['size'];
1778 $info = pathinfo($_FILES['file']['name']);
1779 $ext=$info['extension'];
1780 $filename="{$currentname}.{$ext}";
1781 $sourcePath = $_FILES['file']['tmp_name'];
1782 $targetPath="../UserData/ThumbPhotos/".$filename;
1783 $targetPath1="../UserData/UserPhoto/".$filename;
1784 move_uploaded_file($sourcePath,$targetPath);

1785 copy($targetPath,$targetPath1);

1786 $userfiles=new UserFiles;
1787 $userfiles->LoginID=$login1;
1788 $userfiles->FileActualName=$filename;
1789 $userfiles->FileTempName=$filename;
1790 $userfiles->ThumbImage=$filename;
1791 $userfiles->Type="IMAGE";
1792 $userfiles->ProfileImage=0;
1793 $userfiles->deletedStatus=0;
1794 $userfiles->UploadBy=$login1;
1795 $userfiles->UploadDate=date("Y-m-d");
1796 $userfiles->deletedby=NULL;
1797 $userfiles->PasswordProtected=0;

有什么帮助

我无法完全理解上面代码中发生的事情,因为我不太了解 HTTP 请求的功能。所以任何可以帮助我理解这一点的东西都是受欢迎的,可以是工作代码示例调试请求的提示或对这些东西如何工作的评论强>.

Android 代码运行良好。那么有什么方法可以检查 Android 和 iOS 应用程序上的传出请求,并尝试通过反复试验来匹配它们?

提前致谢

最佳答案

我建议您使用 AFNetworking . 在这种情况下,您想上传一些图片,所以我会为您提供代码:

NSData *imageData = [NSData dataWithContentsOfFile:filename];
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

[manager POST:urlString parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
    [formData appendPartWithFileData:imageData
                                name:@"files"
                            fileName:photoName mimeType:@"image/jpeg"];
[formData appendPartWithFormData:[key1 dataUsingEncoding:NSUTF8StringEncoding]
                            name:@"key1"];

} success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"Response: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];

关于ios - Obj-C 中的 HTTP 多部分请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34510587/

相关文章:

objective-c - 访问 NSMutableArray 的困难

iphone - 比较 NSNumber

html - 如何下载包含在线文件/文件夹列表中的所有文件和子目录的 HTTP 目录?

ios - 如何删除 UITableView 上方的多余空格?

ios - NSURLErrorDomain Code=-1202 使用同步请求时

iphone - iOS - 将自定义 UIView 放入 View Controller 中

css - HTTPS 以及如何引用文件和图像

iphone - EGOTextView 示例

ios - 键盘不隐藏有两个 UITextField 和一个调用选择器的

javascript - 奇怪的 AJAX 响应代码