Alamofire 在 swift 中使用正文发布请求

Posted

技术标签:

【中文标题】Alamofire 在 swift 中使用正文发布请求【英文标题】:Alamofire post request with body in swift 【发布时间】:2019-02-22 03:30:13 【问题描述】:

我正在尝试使用带有正文的 alamofire 发出发布请求,但我一直收到此错误代码“消息:发生错误。” 我在 obj-c 和 afnetworking 中运行相同的 api,一切正常。我是不是用了错误的方法来制作参数?

let parameters: [String: Any] = ["ID": "aaaa@test.com", "PW": "12345", "LoginType": "IDPW", "PushKey": "ios"]
Alamofire.request(loginApi, method: .post, parameters: parameters, encoding: JSONEncoding.default)
            .responseJSON  response in
                print(response)
        

我使用 Objective-C 和函数发送的正文

     NSDictionary *parameters = @
                             @"LoginType": @"IDPW",
                             @"ID": @"aaaa@test.com",
                             @"PW": @"12345",
                             @"PushKey":  @"ios"
                             ;
     - (void) AsyncHttpRequestWithMethod:(NSString * _Nonnull)method
                      URLString:(NSString * _Nonnull)URLString
                     parameters:(NSDictionary * _Nullable)parameters
                        headers:(NSDictionary * _Nullable)headers
                 uploadProgress:(nullable void (^)(NSProgress * _Nullable uploadProgress)) uploadProgressBlock
               downloadProgress:(nullable void (^)(NSProgress * _Nullable downloadProgress)) downloadProgressBlock
              completionHandler:(nullable void (^)(NSURLResponse * _Nullable response, id _Nullable responseObject,  NSError * _Nullable error))completionHandler 

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

NSMutableURLRequest *req = [[AFHTTPRequestSerializer serializer] requestWithMethod:method URLString:URLString parameters:parameters error:nil];

req.timeoutInterval = intTimeInterval;

if (headers && headers.count > 0) 
    NSArray *keys = headers.allKeys;
    for (int i = 0; i < headers.count; i ++) 
        [req addValue:headers[keys[i]] forHTTPHeaderField:keys[i]];
    


[[manager dataTaskWithRequest:req uploadProgress:^(NSProgress * _Nonnull uploadProgress) 
    if (uploadProgressBlock) uploadProgressBlock(uploadProgress);
 downloadProgress:^(NSProgress * _Nonnull downloadProgress) 
    if (downloadProgressBlock) downloadProgressBlock(downloadProgress);
 completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) 

    NSLog(@"completionHandler......");

    completionHandler(response, responseObject, error);
] resume];

【问题讨论】:

您在 Objective-C 中发送的确切 json 正文是什么? 我认为您缺少“Content-Type”标头。你在哪里提到过? How to send a POST request with BODY in swift的可能重复 @Brandon 我在 Objective-C 中发送 nsdictionary。我已经编辑了我的问题 @Shruti 我在我的代码中添加标题:HTTPHeaders = ["Content-Type":"application/json"] 仍然无法正常工作 【参考方案1】:

在您的请求中缺少headers,请使用以下代码获取结果。

let headers = ["Content-Type":"application/json"]    
let parameter = ["MemberID": "aaaa@test.com", "MemberPW": "12345", "LoginType": "IDPW", "PushKey": "ios"]

            Alamofire.request(loginApi, method: .post, parameters: parameter, encoding: JSONEncoding.default, headers: headers)
                .responseJSON  (response) in
                    switch response.result 
                    case .success:
                        print("success",response)
                    case .failure(let error):
                        print("failure",error)
                    
            

【讨论】:

我在请求中添加了标头,但仍然获得成功: Message = "An error has occurred."; 好的,您的 API 调用正在获取响应成功块,但 API 端可能会出现一些问题。【参考方案2】:

你的代码在我看来不错。

没有更多信息,很难确定什么是实际问题。

在我看来,可能的问题是encoding

改变

JSONEncoding.default

还有其他可用选项,例如 URLEncoding.default

如果它不起作用,请告诉我,然后我将删除我的答案

【讨论】:

以上是关于Alamofire 在 swift 中使用正文发布请求的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中使用 Alamofire 将参数作为正文发送到 PUT 方法

如何在 Alamofire 4.0 中仅使用参数和正文在 swift 中使用 POST 方法发送请求?

Swift:带有 json 正文的 alamofire 帖子

ios swift 3 Alamofire 发布请求问题

发送 Alamofire JSON 数组 Swift

如何在 Swift 3 中使用 Alamofire 在 POST 请求中将给定的 JSON 作为参数发送?