0

Wufoo APIを iPhone アプリケーションに統合しようとしていますが、最終段階で問題が発生しています。AFNetworkingを使用して、Wufoo フォームへの接続を正常に確立し、AFHTTPClient のサブクラスを作成して、HTTP 認証などの必要な追加ヘッダーに対応しました。また、パラメーター エンコーディングを AFJSONParameterEncoding に設定しました。

上記を使用してリクエストを行うと、サーバーに正常に接続されてデータが送信されますが、空のフィールドに関するエラーが返されます。リクエストで渡されるフィールド/キーのペアを NSDictionary に追加しましたが、相手側で処理されないため、間違った形式である必要があります。申し訳ありませんが、私はそれが長い質問であることを知っていますが、助けていただければ幸いです:)。コンソールで得た応答と、関連するクラス ファイル/メソッドを追加しました。

応答:

2013-02-14 12:11:43.053 <AppName>[14750:c07] Success?: 0
Error: Errors have been <b>highlighted</b> below.
Fields: (
        {
        ErrorText = "This field is required. Please enter a value.";
        ID = Field1;
    },
        {
        ErrorText = "This field is required. Please enter a value.";
        ID = Field3;
    },
        {
        ErrorText = "This field is required. Please enter a value.";
        ID = Field222;
    },
        {
        ErrorText = "This field is required. Please enter a value.";
        ID = Field11;
    },
        {
        ErrorText = "This field is required. Please enter a value.";
        ID = Field12;
    },
        {
        ErrorText = "This field is required. Please enter a value.";
        ID = Field220;
    }
)

クラスファイル:

ViewController.m

 -(NSDictionary *)getParameters {
   
        NSDictionary *d = [NSDictionary dictionaryWithObjectsAndKeys:
                       emailAddress, @"Field1", //problem
                       firstName, @"Field3", //problem
                       lastName, @"Field4", 
                       activityArranged, @"Field10",
                       evidenceDescription, @"Field222", // problem
                       startDate, @"Field11", //Problem
                       endDate, @"Field224",
                       @"1", @"Field12", //Problem
                       benefitExplanation, @"Field113",
                       activityCategory, @"Field116",
                       webAddress, @"Field219",
                       @"I Agree", @"Field220", //Problem
                       nil];
   
        return d;
   }

-(void)submitForm {
            DiaryForm *df = [[DiaryForm alloc] init];
            [df submitForm:self params:[self getParameters]];
}

DiaryForm.m

-(void)submitForm:(id)sender params:(NSDictionary *)params {
WufooAPIClient *client = [WufooAPIClient sharedClient];
    [[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES];
    [[AFNetworkActivityIndicatorManager sharedManager] incrementActivityCount];
    NSURLRequest *req = [client requestWithMethod:@"POST" path:@"entries.json" parameters:params];
    AFJSONRequestOperation *op = [AFJSONRequestOperation JSONRequestOperationWithRequest:req success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
        [[AFNetworkActivityIndicatorManager sharedManager] decrementActivityCount];
        NSLog(@"Success?: %@\nError: %@\nFields: %@",[JSON objectForKey:@"Success"], [JSON objectForKey:@"ErrorText"], [JSON objectForKey:@"FieldErrors"]);
        
       
    }failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
        [[AFNetworkActivityIndicatorManager sharedManager] decrementActivityCount];
        
        NSLog(@"[Error]: (%@ %@) %@", [request HTTPMethod], [[request URL] relativePath], error);
        
    }];
    [op start];

}

WfooAPIClient.m

#import "WufooAPIClient.h"
#import "AFNetworking.h"


@implementation WufooAPIClient

+(WufooAPIClient *)sharedClient {
    static WufooAPIClient *_sharedClient = nil;
    static dispatch_once_t oncePredicate;
    dispatch_once(&oncePredicate, ^{
        NSString *kProtocol = @"https";
        NSString *kSub = @"<removed>";
        NSString *kHost = @"wufoo.com";
        NSString *kHash = @"<removed>";
        NSString *sURL = [NSString stringWithFormat:@"%@://%@.%@/api/v3/forms/%@/", kProtocol, kSub, kHost, kHash];
        NSLog(sURL);
        NSURL *url = [NSURL URLWithString:sURL];
        _sharedClient = [[self alloc] initWithBaseURL:url];
    });
    return _sharedClient;
}

-(id)initWithBaseURL:(NSURL *)url {
    self = [super initWithBaseURL:url];
    if (!self) {
        return nil;
    }
    [self registerHTTPOperationClass:[AFJSONRequestOperation class]];
    [self setDefaultHeader:@"Accept" value:@"application/json"];
    [self setAuthorizationHeaderWithUsername:@"<removed>" password:@"<removed>"];
    self.parameterEncoding = AFJSONParameterEncoding;
    
    return self;
}

@終わり

4

1 に答える 1

1

WufooAPIClient.m クラスの initWithBaseURL: メソッドの行を変更して、問題を修正しました。

これ:

self.parameterEncoding = AFJSONParameterEncoding;

に:

 self.parameterEncoding = AFFormURLParameterEncoding;

Wufoo は、HTTP POST データを送信してから、json または xml 応答を返します。私が行ったのは、送信されるデータを本来のフォーム データではなく JSON データに設定することでした。

同じことをしようとしている人に役立つことを願っています:)

于 2013-02-15T01:43:52.243 に答える