Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/115.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 设置post请求主体以形成数据目标-c_Ios_Objective C_Form Data - Fatal编程技术网

Ios 设置post请求主体以形成数据目标-c

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

我试图在post请求正文中发送
表单数据
,但服务返回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
,我们需要知道服务器应该发送什么响应。也许可以告诉我们服务器代码?