【问题标题】:AFHTTPRequestOperationManager post multi-part request not workingAFHTTPRequestOperationManager 发布多部分请求不起作用
【发布时间】:2014-08-03 06:12:34
【问题描述】:

这是我在 Git Doc 中使用的模板

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSDictionary *parameters = @{@"foo": @"bar"};
[manager POST:@"http://example.com/resources.json" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"JSON: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];

这是我的使用方法

-(void)postMultipartToServer
{
    if (!self.destinationUrl) {
        return;
    }

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    NSLog(@"IS dictionary empty? %@", self.textDictionary);

    [manager POST:self.destinationUrl
       parameters:self.textDictionary
    constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
        if ([self.imageDictionaries count]>0)
            for (NSDictionary *imgDic in self.imageDictionaries) {
                [formData appendPartWithFileData:UIImagePNGRepresentation([imgDic objectForKey:@"image"])
                                            name:[imgDic objectForKey:@"name"]//@"image"
                                        fileName:[imgDic objectForKey:@"fileName"]//@"image.png"
                                        mimeType:[imgDic objectForKey:@"mimeType"]//@"image/png"
                 ];
            }


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

无论出于何种原因,图像都已成功发布到服务器,但文本部分却没有。所以这是我的文本字典

 NSDictionary *textDictionary = @{
                                 @"userid”:self.userid,
                                 @"phone":self.phone,
                                 @"token”:self.userToken,
                                 @“age”:self.ageAsString,
                                 @“spouse”:self.spouse,
                                 @"isFamouse”:@”true"};

例如,服务器不断抱怨phone 为空。当我查看服务器日志时,textDictionary 中的任何数据都没有发送到服务器。

在有人说这是我的服务器之前:iOS 不是唯一的客户端。所有其他客户端工作正常。无论出于何种原因,textDictionary 都没有被发送。

我欢迎熟悉 AFHTTPRequestOperationManager 的人提供任何帮助。

这是错误日志

Error Domain=com.alamofire.error.serialization.response Code=-1011 "Request failed: internal server error (500)" UserInfo=0x170477840 {com.alamofire.serialization.response.error.response=<NSHTTPURLResponse: 0x178225140> 

另外,为了阻止失败,我之前进行了编辑但没有更改:我添加了

AFSecurityPolicy *policy = [[AFSecurityPolicy alloc] init];
[policy setAllowInvalidCertificates:YES];

AFHTTPRequestOperationManager *operationManager = [AFHTTPRequestOperationManager manager];
[operationManager setSecurityPolicy:policy];
operationManager.requestSerializer = [AFJSONRequestSerializer serializer];
operationManager.responseSerializer = [AFJSONResponseSerializer serializer];

以下是可以正常工作的等效 Android 代码供参考

public static void saveTextsAndImagesOnServer(List<byte[]> images, long someID1, String servingUrl, boolean someFlag)
        throws ClientProtocolException, IOException {
    Log.d(TAG, "saveTextsAndImagesOnServer started ");
    HttpClient httpClient = new DefaultHttpClient();
    HttpPost postRequest = new HttpPost(servingUrl);
    MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);

    AdditionData extr = AdditionData.getInstance();
    reqEntity.addPart("red", new ByteArrayBody(("" + extr.getred()).getBytes(), "red"));
    reqEntity.addPart("yellow", new ByteArrayBody(extr.getyellow.getBytes(), "yellow"));
    reqEntity.addPart("green", new ByteArrayBody(extr.getgreen().getBytes(), "green"));
    reqEntity.addPart("blue", new ByteArrayBody((extr.getblue()).getBytes(), "blue"));
    reqEntity.addPart("someID1", new ByteArrayBody(("" + someID1).getBytes(), "someID1"));
    if (someFlag) {
        reqEntity.addPart("someFlag", new ByteArrayBody("true".getBytes(), "someFlag"));
    }
    int i = 0;
    for (byte[] img : images) {
        ByteArrayBody image = new ByteArrayBody(img, "img" + i++ + ".png");
        reqEntity.addPart("image", image);
    }
    postRequest.setEntity(reqEntity);
    HttpResponse response = httpClient.execute(postRequest);
    Log.d(TAG, "saveTextsAndImagesOnServer ended with response " + response.toString());
}

【问题讨论】:

  • 我的服务器是谷歌应用引擎
  • 更准确地说,目标是应用引擎 blob 存储。
  • 我如何知道我使用的是 afnetworking 1 还是 afnetworking 2?我通过点击download zipgithub.com/AFNetworking/AFNetworking使用手动下载
  • 下载 zip 会给你 2.0.此外,序列化程序类在 2.0 之前不存在
  • @Hunkpapa 谢谢。所以我有2.0。现在我开始认为我的问题是我需要将我的 NSStrings 转换为 base-64 字节数组。你知道怎么做吗? Blobstore 可能需要它,因为这是其他客户端正在使用的。

标签: objective-c ios7 afnetworking-2 blobstore afhttprequestoperation


【解决方案1】:

我最终将所有字段,包括文本字段和图像都放在了constructingBodyWithBlock 中。 (里面还有一些其他的东西,比如取消代码和自定义进度条,但你大概明白了 :)

       NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer]
           multipartFormRequestWithMethod:@"POST"
                                URLString:self.destinationUrl
                               parameters:nil
                constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
            [formData appendPartWithFormData:[self.userid dataUsingEncoding:NSUTF8StringEncoding] name:@"userid"];
            [formData appendPartWithFormData:[self.phone dataUsingEncoding:NSUTF8StringEncoding] name:@"phone"];

        // Add images as jpeg
        for (UIImage *image in images) {
            NSData *imageData = UIImageJPEGRepresentation(image, 1.0);
            [formData appendPartWithFileData:imageData name:@"myFile" fileName:@"iphoneimage.jpg" mimeType:@"image/jpeg"];
        }

    } 
                                    error:nil];

    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    [operation setUploadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) {
        NSLog(@"Sent %lld of %lld bytes", totalBytesWritten, totalBytesExpectedToWrite);
        if (!self.httpClientWasCancelled && !self.progressBar.isHidden) {
           [self.progressBar updateCurrentValue:totalBytesWritten/1024 andMax:totalBytesExpectedToWrite/1024];
        }
    }];

    [request setTimeoutInterval:1800];

    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSString *responseString = [[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding];
        NSLog(@"responseString = %@",responseString);
        [self.progressBar stopAndHide];
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Request Error: %@", error);
        if (self.httpClientWasCancelled) {
            self.httpClientWasCancelled = NO;
        } else {
            [self.progressBar stopAndHide];
        }
    }];


    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    manager.responseSerializer = [AFJSONResponseSerializer serializer];
     [manager.operationQueue addOperation:operation];

在此处输入代码

【讨论】:

  • 感谢您分享您的代码。但我仍然得到与以前完全相同的错误。
  • 但我想现在你得到了服务器端的所有字段。服务器端的报错信息是什么?
猜你喜欢
  • 2013-12-01
  • 2016-05-22
  • 2013-08-08
  • 2020-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-01
相关资源
最近更新 更多