Ios 设置post请求主体以形成数据目标-c
我试图在post请求正文中发送Ios 设置post请求主体以形成数据目标-c,ios,objective-c,form-data,Ios,Objective C,Form Data,我试图在post请求正文中发送表单数据,但服务返回null,因此我使用的方法错误(由邮递员生成)或图像编码不同,除了我使用的代码外,我将通过下面的截图向您展示图像应该如何编码,以及我是如何编码的 NSString* imgName = [self randomCode]; NSString* postFile = [NSString stringWithFormat:@"%@%@.png",imgName,userData.userID]; NSDi
表单数据
,但服务返回null,因此我使用的方法错误(由邮递员生成)或图像编码不同,除了我使用的代码外,我将通过下面的截图向您展示图像应该如何编码,以及我是如何编码的
NSString* imgName = [self randomCode];
NSString* postFile = [NSString stringWithFormat:@"%@%@.png",imgName,userData.userID];
NSDictionary *headers = @{ @"content-type": @"multipart/form-data; boundary=----WebKitFormBoundaryAt4JdBdihQo7lrrf",
@"authorization": [NSString stringWithFormat:@"Bearer %@",userData.accessToken ],
@"moduleid": @"441",
@"tabid": @"78",
@"cache-control": @"no-cache",
@"postman-token": @"1482fe03-076b-aa92-5565-125212592762" };
NSArray *parameters = @[ @{ @"name": @"folder", @"value": userData.userFolder },
@{ @"name": @"filter", @"value": @"bmp,gif,jpeg,jpg,jpe,png" },
@{ @"name": @"overwrite", @"value": @"true" },
@{ @"name": @"postfile", @"fileName": postFile } ];
NSString *boundary = @"----WebKitFormBoundaryAt4JdBdihQo7lrrf";
NSMutableString *body = [NSMutableString string];
for (NSDictionary *param in parameters) {
[body appendFormat:@"--%@\r\n", boundary];
if (param[@"fileName"]) {
[body appendFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@\"\r\n", param[@"name"], param[@"fileName"]];
[body appendFormat:@"Content-Type: %@\r\n\r\n", @"image/png"];
NSString* imgString = [self encodeToBase64String:self.teamImage];
[body appendFormat:@"%@", imgString];
;
} else {
[body appendFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", param[@"name"]];
[body appendFormat:@"%@\n", param[@"value"]];
}
}
[body appendFormat:@"\r\n--%@--\r\n", boundary];
NSData *postData = [body dataUsingEncoding:NSUTF8StringEncoding];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://172.16.0.216/API/internalservices/fileupload/postfile"]
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:10.0];
[request setHTTPMethod:@"POST"];
[request setAllHTTPHeaderFields:headers];
[request setHTTPBody:postData];
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (error) {
NSLog(@"%@", error);
} else {
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;
NSLog(@"%@", httpResponse);
}
}];
[dataTask resume];
- (NSString *)encodeToBase64String:(UIImage *)image {
NSData * data = [UIImagePNGRepresentation(image) base64EncodedDataWithOptions:NSDataBase64Encoding64CharacterLineLength];
return [NSString stringWithUTF8String:[data bytes]];
}
以下是服务器接收is时图像的外观:
以下是服务器从我这里接收信息的方式:
请告诉我我做错了什么
谢谢我认为问题在于服务器不希望图像是base64编码的。为了提交非编码图像,您可以直接构造post数据,而无需中间
NSMutableString
对象:
NSMutableData *postData = [NSMutableData data];
for (NSDictionary *param in parameters) {
[postData appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
if (param[@"fileName"]) {
[postData appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@\"\r\n", param[@"name"], param[@"fileName"]] dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[[NSString stringWithFormat:@"Content-Type: %@\r\n\r\n", @"image/png"] dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:UIImagePNGRepresentation(self.teamImage)];
} else {
[postData appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", param[@"name"]] dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[[NSString stringWithFormat:@"%@\n", param[@"value"]] dataUsingEncoding:NSUTF8StringEncoding]];
}
}
[postData appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
我认为问题在于服务器不希望图像是base64编码的。为了提交非编码图像,您可以直接构造post数据,而无需中间
NSMutableString
对象:
NSMutableData *postData = [NSMutableData data];
for (NSDictionary *param in parameters) {
[postData appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
if (param[@"fileName"]) {
[postData appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@\"\r\n", param[@"name"], param[@"fileName"]] dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[[NSString stringWithFormat:@"Content-Type: %@\r\n\r\n", @"image/png"] dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:UIImagePNGRepresentation(self.teamImage)];
} else {
[postData appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", param[@"name"]] dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[[NSString stringWithFormat:@"%@\n", param[@"value"]] dataUsingEncoding:NSUTF8StringEncoding]];
}
}
[postData appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
结果仍然为空:((状态代码:200,标题{“缓存控制”=“无缓存”;“内容编码”=gzip;“内容长度”=143;“内容类型”=“文本/普通;字符集=utf-8”;日期=“2017年3月23日星期四14:42:59 GMT”;过期=“-1”;Pragma=“无缓存”;“代理连接”=“保持活动”;“设置Cookie”=“dnn_IsMobile=False;path=/;HttpOnly,language=en-US;path=/;HttpOnly”Vary=“Accept Encoding”}您是否控制服务器?您是否可以在那里调试问题或发送更详细的错误描述?结果仍然为空:((状态代码:200,标题{“缓存控制”=“无缓存”;“内容编码”=gzip;)内容长度“=143;“内容类型”=“text/plain;charset=utf-8”;日期=“Thu,2017年3月23日14:42:59 GMT”;过期=“-1”;Pragma=“无缓存”;“代理连接”=“保持活动”;“Set Cookie”=“dnn_IsMobile=False;路径=/;HttpOnly,语言=en-US;路径=/;HttpOnly”Vary=“接受编码”}你控制服务器吗?你能在那里调试问题吗?或者发送一个更详细的错误描述吗?你说你想要一个base64字符串,但你使用的是mime类型的image/png(不应该是base64字符串)。您发送数据的方式既不是二进制数据,也不是基64字符串。通常,当我们使用
多部分/表单数据
请求时,我们这样做是为了能够发送二进制数据,正如pckill建议的那样。关于结果为何为null
,我们需要知道服务器应该发送什么响应。也许可以告诉我们服务器代码?您说您想要一个base64字符串,但您使用的是mime类型的image/png(不应该是base64字符串)。您发送数据的方式既不是二进制数据,也不是基64字符串。通常,当我们使用多部分/表单数据
请求时,我们这样做是为了能够发送二进制数据,正如pckill建议的那样。关于结果为何为null
,我们需要知道服务器应该发送什么响应。也许可以告诉我们服务器代码?