3

AFNetworkingを使用してjsonデータをWebサービスに投稿し、json応答を返しています。ただし、これらのPOSTにマルチパートフォームデータも追加したいと思います。これを行うと(最初に追加したパラメーターがなくても)、完了ブロックは起動しません。進行状況ブロックが起動し、ファイルが正しくアップロードされていることがわかります。

AFNetworkingでこのような画像を投稿した経験はありますか?最新のAFNetworkingソース/バージョンを使用しています。

これは、jsonを含む辞書を投稿するための私の最初のコードです。これは正常に機能します。

NSMutableDictionary *postdata = [[NSMutableDictionary alloc] init];
[postdata setObject:[postdictionary JSONString] forKey:@"request"];

NSMutableURLRequest *jsonRequest = [httpClient requestWithMethod:@"POST"
                                           path:path
                                     parameters:postdata];

AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:jsonRequest success:^(NSURLRequest *request,     NSHTTPURLResponse *response, id JSON) {// Success} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {// Failure }];

[operation start];

これは、画像を送信するためのコードのバージョンです(機能しません)

NSMutableURLRequest *jsonRequest jsonRequest = [httpClient   multipartFormRequestWithMethod:@"POST" path:path parameters:postdata constructingBodyWithBlock: ^(id <AFMultipartFormData> formData) {
    [formData appendPartWithFileData:imageData name:@"photo" fileName:@"photo.jpg" mimeType:@"image/jpeg"];
    [formData throttleBandwidthWithPacketSize:5000 delay:0.1];
}];

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:jsonRequest];
[operation setUploadProgressBlock:^(NSUInteger bytesWritten, long long  totalBytesWritten, long long totalBytesExpectedToWrite) {
    NSLog(@"Sent %lld of %lld bytes", totalBytesWritten, totalBytesExpectedToWrite);
}];

[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"Upload succes");
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Upload failed");
}];

[operation start];
4

2 に答える 2

3

私はこのコードを多くのアプリで使用していますが、問題はありません(AFJSONRequestOperationとAFRestClientを使用していることに注意してください)

リクエストを設定する

// I have a shared singleton in a separate file APIClient.h 
AFRESTClient *httpClient = [APIClient sharedClient];

NSURLRequest *request = [httpClient multipartFormRequestWithMethod:@"POST" path:method parameters:params constructingBodyWithBlock: ^(id <AFMultipartFormData> formData) 
    {[formData appendPartWithFileData:imageData
               name:@"image"
               fileName:@"image.png"
               mimeType:@"image/png"];
    }];

その後、操作、

AFJSONRequestOperation *operation = [[AFJSONRequestOperation alloc] initWithRequest:request];

私の進捗ブロック

[operation setUploadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) {

    NSLog(@"Sent %lld of %lld bytes", totalBytesWritten, totalBytesExpectedToWrite);
    CGFloat progress = ((CGFloat)totalBytesWritten) / totalBytesExpectedToWrite * 100;
    [SVProgressHUD showProgress:50 status:[NSString stringWithFormat:@"%0.1f %%", progress]];

}];    

成功ブロック(私のAPIはstat -okまたはfailを返し、次にデータを返します(flickr APIと同じ)

[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id response) {
    NSLog(@"response string: %@", operation.responseString);
    NSString *resultStat = [response objectForKey:@"stat"];

   if ([resultStat isEqualToString:@"ok"]) {
        //success
        // do something with your data that is returned from the API 
   } else {
        //error 
        NSLog(@"Data Error: %@", response);
   }   

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", [error localizedDescription]); 
}];

[httpClient enqueueHTTPRequestOperation:operation];
于 2013-01-20T14:24:36.803 に答える
0

コードの問題を確認できません。いくつかの可能性があります。

短いタイムアウト間隔を設定して、要求が完了するかどうかを確認してください[request setTimeoutInterval:5];

また、スロットルラインをコメントアウトして、何かが変わるかどうかを確認してください

于 2013-01-19T17:04:09.143 に答える