19

REST POST 要求に AFHTTPRequestOperationManager (2.0 AFNetworking ライブラリ) を使用しています。ただし、マネージャーはパラメーターを設定するための呼び出ししかありません。

-((AFHTTPRequestOperation *)POST:(NSString *)URLString
                  parameters:(NSDictionary *)parameters
                     success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
                     failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure;

HTTP リクエストの本文にも文字列を設定する必要があります。AFHTTPRequestOperationManager を使用してそれを行うにはどうすればよいですか? ありがとう。

4

7 に答える 7

31

私は同じ問題を抱えていて、以下に示すようにコードを追加して解決しました:

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL
              cachePolicy:NSURLRequestReloadIgnoringCacheData  timeoutInterval:10];

[request setHTTPMethod:@"POST"];
[request setValue:@"Basic: someValue" forHTTPHeaderField:@"Authorization"];
[request setValue: @"application/json" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody: [body dataUsingEncoding:NSUTF8StringEncoding]];

AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];
op.responseSerializer = [AFJSONResponseSerializer serializer];
[op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {

    NSLog(@"JSON responseObject: %@ ",responseObject);

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

}];
[op start];
于 2013-12-28T07:06:50.453 に答える
6

その便利なメソッド (POST:parameters:success:failure) が内部で何をしているのかを確認し、実際の NSMutableRequest オブジェクトにアクセスするために自分で行ってください。

AFHTTPRequestOperation の代わりに AFHTTPSessionManager を使用していますが、メカニズムは似ていると思います。

これが私の解決策です:

  1. セッションマネージャーのセットアップ (ヘッダーなど)

  2. NSMutable リクエストを手動で作成し、HTTPBody を追加します。基本的には、その便利なメソッド内にコードをコピーして貼り付けます。次のようになります。

    NSMutableURLRequest *request = [manager.requestSerializer requestWithMethod:@"POST" URLString:[[NSURL URLWithString:<url string>] absoluteString] parameters:parameters];
    
    [request setHTTPBody:[self.POSTHttpBody dataUsingEncoding:NSUTF8StringEncoding]];
    __block NSURLSessionDataTask *task = [manager dataTaskWithRequest:request completionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) {
        if (error) {
           // error handling
        } else {
            // success
      }
    }];
    
    [task resume];
    
于 2013-11-08T08:59:50.110 に答える
4

の独自のカスタム サブクラスを作成し、AFHTTPRequestSerializerこれを の requestSerializer として設定できますAFHTTPRequestOperationManager

このカスタム requestSerializer では、オーバーライドできます

- (NSURLRequest *)requestBySerializingRequest:(NSURLRequest *)request         
                               withParameters:(id)parameters 
                                        error:(NSError *__autoreleasing *)error;

このメソッドの実装内では、にアクセスできるため、次のNSURLRequestようなことができます

- (NSURLRequest *)requestBySerializingRequest:(NSURLRequest *)request     
                               withParameters:(id)parameters 
                                        error:(NSError *__autoreleasing *)error  
{    
    NSURLRequest *serializedRequest = [super requestBySerializingRequest:request withParameters:parameters
     error:error];
    NSMutableURLRequest *mutableRequest = [serializedRequest mutableCopy];          
    // Set the appropriate content type
    [mutableRequest setValue:@"text/xml" forHTTPHeaderField:@"Content-Type"];              
    // 'someString' could eg be passed through and parsed out of the 'parameters' value
    NSData *httpBodyData = [someString dataUsingEncoding:NSUTF8StringEncoding];
    [mutableRequest setHTTPBody:httpBodyData];

    return mutableRequest;
}

AFJSONRequestSerializerカスタム HTTP 本文コンテンツを設定する例として、の実装の内部を調べることができます。

于 2015-02-25T14:17:53.910 に答える
4
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
[manager POST:url parameters:jsonObject success:^(AFHTTPRequestOperation *operation, id responseObject) {
    //success
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    //fail
}];

これは私が見つけた最良かつ最も簡潔な方法です。

于 2015-05-05T06:10:24.073 に答える
0

NSMutableURLRequest を使用できるかもしれません。コードは次のとおりです。

NSURL *url = [NSURL URLWithString:yourURLString];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url
                                                       cachePolicy:NSURLRequestUseProtocolCachePolicy
                                                   timeoutInterval:60.0];

[request setHTTPMethod:@"POST"];
NSData *JSONData = [NSJSONSerialization dataWithJSONObject:parameters options:NSJSONWritingPrettyPrinted error:nil];
NSString *contentJSONString = [[NSString alloc] initWithData:JSONData encoding:NSUTF8StringEncoding];
[request setHTTPBody:[contentJSONString dataUsingEncoding:NSUTF8StringEncoding]];

NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[connection start];
于 2014-10-22T10:41:19.357 に答える