AFNetworking - Как я могу выставить исходные данные POST и POST без использования пары значений ключа?

Я пытаюсь сделать запрос HTTP PUT с помощью AFNetworking для создания вложения на сервере CouchDB. Сервер ожидает кодировку base64 в блоке HTTP. Как я могу сделать этот запрос без отправки тела HTTP в качестве пары ключ/значение с помощью AFNetworking?

Я начал с рассмотрения этого метода:

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

Но здесь параметры должны быть типа: NSDictionary. Я просто хочу отправить строку с кодировкой base64 в тело HTTP, но не связанную с ключом. Может ли кто-нибудь указать мне на соответствующий метод? Спасибо!

Ответ 1

Ответ Хеязи прост и должен отлично работать.

Если по какой-то причине вам нужно быть очень конкретным для одного запроса - например, если вам нужно переопределить заголовки и т.д. - вы также можете создать собственный NSURLRequest.

Вот некоторый (непроверенный) пример кода:

// Make a request...
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:myURL];

// Generate an NSData from your NSString (see below for link to more info)
NSData *postBody = [NSData base64DataFromString:yourBase64EncodedString];

// Add Content-Length header if your server needs it
unsigned long long postLength = postBody.length;
NSString *contentLength = [NSString stringWithFormat:@"%llu", postLength];
[request addValue:contentLength forHTTPHeaderField:@"Content-Length"];

// This should all look familiar...
[request setHTTPMethod:@"POST"];
[request setHTTPBody:postBody];

AFHTTPRequestOperation *operation = [client HTTPRequestOperationWithRequest:request success:success failure:failure];
[client enqueueHTTPRequestOperation:operation];

Метод категории NSData base64DataFromString доступен здесь.

Ответ 2

Вы можете использовать метод multipartFormRequestWithMethod следующим образом:

NSURLRequest *request = [self multipartFormRequestWithMethod:@"PUT" path:path parameters:parameters constructingBodyWithBlock:^(id <AFMultipartFormData> formData) {
    [formData appendString:<yourBase64EncodedString>]
}];
AFHTTPRequestOperation *operation = [client HTTPRequestOperationWithRequest:request success:success failure:failure];
[client enqueueHTTPRequestOperation:operation];

Ответ 3

Здесь у вас есть пример отправки raw json:

NSDictionary *dict = ...
NSError *error;
NSData *dataFromDict = [NSJSONSerialization dataWithJSONObject:dict
                                                           options:NSJSONWritingPrettyPrinted
                                                             error:&error];

AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];

NSMutableURLRequest *req = [[AFJSONRequestSerializer serializer] requestWithMethod:@"POST" URLString:YOUR_URL parameters:nil error:nil];

req.timeoutInterval = 30;
[req setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[req setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[req setValue:IF_NEEDED forHTTPHeaderField:@"Authorization"];

[req setHTTPBody:dataFromDict];

[[manager dataTaskWithRequest:req completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {
    if (!error) {
        NSLog(@"%@", responseObject);
    } else {
        NSLog(@"Error: %@, %@, %@", error, response, responseObject);
    }
}] resume];

Ответ 4

 NSData *data = someData;
 NSMutableURLRequest *requeust = [NSMutableURLRequest requestWithURL:          
 [NSURL URLWithString:[self getURLWith:urlService]]];

[reqeust setHTTPMethod:@"PUT"];
[reqeust setHTTPBody:data];
[reqeust setValue:@"application/raw" forHTTPHeaderField:@"Content-Type"];

NSURLSessionDataTask *task = [manager uploadTaskWithRequest:requeust fromData:nil progress:^(NSProgress * _Nonnull uploadProgress) {

} completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {

}];
[task resume];

Ответ 5

Я использую AFNetworking 2.5.3 и создаю новый метод POST для AFHTTPRequestOperationManager.

extension AFHTTPRequestOperationManager {

    func POST(URLString: String!, rawBody: NSData!, success: ((AFHTTPRequestOperation!, AnyObject!) -> Void)!, failure: ((AFHTTPRequestOperation!, NSError!) -> Void)!) {

        let request = NSMutableURLRequest(URL: NSURL(string: URLString, relativeToURL: baseURL)!)
        request.HTTPMethod = "POST"
        request.HTTPBody = rawBody

        let operation = HTTPRequestOperationWithRequest(request, success: success, failure: failure)

        operationQueue.addOperation(operation)
    }

}

Ответ 6

Пожалуйста, используйте метод ниже.

+(void)callPostWithRawData:(NSDictionary *)dict withURL:(NSString 
*)strUrl withToken:(NSString *)strToken withBlock:(dictionary)block
{
NSError *error;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict options:0 error:&error];
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
Please use below method.
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
NSMutableURLRequest *req = [[AFJSONRequestSerializer serializer] requestWithMethod:@"POST" URLString:[NSString stringWithFormat:@"%@/%@",WebserviceUrl,strUrl] parameters:nil error:nil];

req.timeoutInterval= [[[NSUserDefaults standardUserDefaults] valueForKey:@"timeoutInterval"] longValue];
[req setValue:strToken forHTTPHeaderField:@"Authorization"];
[req setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[req setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[req setHTTPBody:[jsonString dataUsingEncoding:NSUTF8StringEncoding]];

[[manager dataTaskWithRequest:req completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {
    if (!error) {
        if ([responseObject isKindOfClass:[NSData class]]) {
            NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;
            if ((long)[httpResponse statusCode]==201) {
                NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
                [dict setObject:@"201" forKey:@"Code"];

                if ([httpResponse respondsToSelector:@selector(allHeaderFields)]) {
                    NSDictionary *dictionary = [httpResponse allHeaderFields];
                    NSLog(@"%@",[dictionary objectForKey:@"Location"]);
                     [dict setObject:[NSString stringWithFormat:@"%@",[dictionary objectForKey:@"Location"]] forKey:@"Id"];
                     block(dict);
                }
            }
            else if ((long)[httpResponse statusCode]==200) {
                //Leave Hours Calculate
                NSDictionary *serializedData = [NSJSONSerialization JSONObjectWithData:responseObject options:kNilOptions error:nil];
                block(serializedData);
            }
            else{
            }
        }
        else if ([responseObject isKindOfClass:[NSDictionary class]]) {
            block(responseObject);
        }
    } else {
        NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
        [dict setObject:ServerResponceError forKey:@"error"];
        block(dict);
    }
}] resume];
}