IOS-Swift 4.0-使用Alamofire进行基本访问身份验证-

IOS-Swift 4.0-使用Alamofire进行基本访问身份验证-,ios,swift,post,alamofire,basic-authentication,Ios,Swift,Post,Alamofire,Basic Authentication,我正在用Swift 4 I做一个应用程序,当我需要做一个POST调用时,比如“基本访问验证”和带有参数的标题和正文,它对我不起作用 基本上我想模拟这个呼叫,返回一个200,但它返回给我: “responseSerializationFailed(Alamofire.AFError.ResponseSerializationFaileureReason.jsonSerializationFailed(错误 Domain=nscocaerorrordomain Code=3840“字符周围的值无效

我正在用Swift 4 I做一个应用程序,当我需要做一个POST调用时,比如“基本访问验证”和带有参数的标题和正文,它对我不起作用

基本上我想模拟这个呼叫,返回一个200,但它返回给我:

“responseSerializationFailed(Alamofire.AFError.ResponseSerializationFaileureReason.jsonSerializationFailed(错误 Domain=nscocaerorrordomain Code=3840“字符周围的值无效 0。“UserInfo={NSDebugDescription=字符0周围的无效值。}”)

API url为:

该部分是“在授权用户组合中存储新交易”

在这里,我传递了在Alamofire(4.7.3)的帮助下模拟请求“在授权的用户公文包中存储新交易”的代码

我遵循的步骤如下:

  • 我要做的是,对您需要的“用户名”和“密码”数据进行编码 请给我打64垒

  • 然后我将Stirng类型的日期格式化为date类型(ISO类型)

  • 在我为数据创建字典之后

  • 最后我创建了这个请求,把上面的所有内容放在一起

  • 此外,在Xcode中,我还有TransportSecurity来进行 请求“https”

我在这里留下代码:

进口基础 导入UIKit 进口阿拉莫菲尔

类ViewController:UIViewController{

override func viewDidLoad() {
    super.viewDidLoad()

    //URL
    let url = URL(string: "https://test.cryptojet.io/coins/portfolio")!

    // credentials encoded in base64
    let username = "richard@rich.com"
    let password = "secret"
    let loginData = String(format: "%@:%@", username, password).data(using: String.Encoding.utf8)!
    let base64LoginData = loginData.base64EncodedString()
    let headers = ["Authorization" : "Basic \(base64LoginData)",
                   "Content-Type": "application/json"]

    //Prepare date - Data UTC to ISO
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ"
    let dataSting = "2016-06-05T16:56:57.019+01:00"
    let dateISO = dateFormatter.date(from: dataSting)

    //Prepare paramsBody -> tot Data
    let paramsBody: [String: Any] = ["coin_id": 2,
                                     "amount": -2.2183,
                                     "price_usd": 675.982,
                                     "traded_at": dateISO!]

    //Request
    Alamofire.request(url, method: .post,parameters: paramsBody, encoding: URLEncoding.default, headers: headers).responseJSON { response in
        switch response.result {
        case .success:
            guard let json = response.result.value as? [String: Any],
                let data = json["trade"] as? [String: Any] else {
                    return
            }
            print(data)
        case .failure(let error):
            print(error)
        }
    }

}

您能告诉我,我在服务器上的这个身份验证后调用有什么问题吗?

我试图向您的url发出请求,但您的请求的响应似乎不是JSON:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8" />
        <meta name="robots" content="noindex,nofollow" />
        <style>            body { background-color: #F9F9F9; color: #222; font: 14px/1.4 Helvetica, Arial, sans-serif; margin: 0; padding-bottom: 45px; }

            a { cursor: pointer; text-decoration: none; }
            a:hover { text-decoration: underline; }
...

正文{背景色:#F9F9;颜色:#222;字体:14px/1.4 Helvetica,Arial,无衬线;边距:0;填充底部:45px;}
{光标:指针;文本装饰:无;}
a:悬停{文本装饰:下划线;}
...

如果您正在尝试摘要,则需要此方法:

    credential = URLCredential(user: UserDefaults.standard.string(forKey: "userName") ?? "admin", password: UserDefaults.standard.string(forKey: "password") ?? "admin", persistence: .none)

    let sessionMananager = Alamofire.SessionManager.default
    _ = sessionMananager.request(url)
        .authenticate(usingCredential: credential!)
        .responseJSON { response in
 }

是的,API似乎不适用于POST类型,而GET类型则返回JSON响应。是的,API适用于POST。我知道,因为给我测试的人说:“我知道错误在哪里,但您会理解,如果我告诉您解决方案,测试将是grace,因为这是代码问题,而不是后端问题…”您是否尝试使用摘要协议?如果这是问题,您需要以不同的方式使用alamo