【问题标题】:AFNetworking - How can I PUT and POST raw data without using a key value pair?AFNetworking - 如何在不使用键值对的情况下 PUT 和 POST 原始数据?
【发布时间】:2013-06-14 05:06:25
【问题描述】:

我正在尝试使用AFNetworking 发出 HTTP PUT 请求以在 CouchDB 服务器中创建附件。服务器需要在 HTTP 正文中使用 base64 编码的字符串。如何在不使用AFNetworking 将 HTTP 正文作为键/值对发送的情况下发出此请求?

我从研究这个方法开始:

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

但这里的参数类型为:NSDictionary。我只想在 HTTP 正文中发送一个 base64 编码的字符串,但不与密钥关联。有人可以指出我使用的适当方法吗?谢谢!

【问题讨论】:

    标签: ios objective-c rest afnetworking


    【解决方案1】:

    Hejazi 的回答很简单,应该很好用。

    如果由于某种原因,您需要非常具体地处理一个请求 - 例如,如果您需要覆盖标头等 - 您也可以考虑构建自己的 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 类别方法base64DataFromStringavailable here

    【讨论】:

    【解决方案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 并为 AFHTTPRequestOperationManager 创建新的 POST 方法。

          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];
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2019-10-02
              • 2019-10-26
              • 2021-08-02
              • 2019-09-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多