【问题标题】:Swift 'Required String parameter 'grant_type' is not present' error when trying to get an access tokenSwift 'Required String parameter 'grant_type' is not present' 尝试获取访问令牌时出现错误
【发布时间】:2020-12-17 21:15:50
【问题描述】:

所以我正在尝试在 Swift 中制作一个应用程序,我需要为此登录 OAuth 以检索访问令牌。 API 采用参数“grant_type”和“code”。

我试过了:

let params = ["grant_type":"authorization_code", "code":"123456789"] as Dictionary<String, String>

var request = URLRequest(url: URL(string: "https://myschool.zportal.nl/api/v3/oauth/token")!)
request.httpMethod = "POST"
request.httpBody = try? JSONSerialization.data(withJSONObject: params, options: [])
request.addValue("application/json", forHTTPHeaderField: "Content-Type")

let session = URLSession.shared
let task = session.dataTask(with: request, completionHandler: { data, response, error -> Void in
    do {
        let json = try JSONSerialization.jsonObject(with: data!) as! Dictionary<String, AnyObject>
        print(json)
    } catch {
        print("error")
    }
})

task.resume()

这会返回:

["response": {
    data =     (
    );
    details = "class org.springframework.web.bind.MissingServletRequestParameterException: Required String parameter 'grant_type' is not present";
    endRow = 0;
    eventId = 216795;
    message = "Internal problems.";
    startRow = 0;
    status = 500;
    totalRows = 0;
}]

这很奇怪,因为我确实将“grant_type”参数解析为正确的值。

它应该返回类似:

{
  "response": {
    "status":200,
    "message":"",
    "startRow":0,
    "endRow":27,
    "totalRows":27,
    "data":[
      {
      },
      ...
    ]
  }
}

【问题讨论】:

    标签: swift oauth-2.0


    【解决方案1】:

    搞定了:

    @IBAction func sendButtonPressed(_ sender: UIButton) {
    
            let urlString = "https://myschool.zportal.nl/api/v3/oauth/token"
            performRequest(urlString: urlString)
    
        }
        
        func performRequest(urlString: String) {
            
            if let url = URL(string: urlString) {
                
                var request = URLRequest(url: url)
                request.httpMethod = "POST"
                request.httpBody = "grant_type=authorization_code&code=1234567890".data(using: .utf8)
                
                let session = URLSession(configuration: .default)
                let task = session.dataTask(with: request, completionHandler: { data, response, error -> Void in
                    //print(response!)
                    do {
                        let json = try JSONSerialization.jsonObject(with: data!) as! Dictionary<String, AnyObject>
                        print(json)
                    } catch {
                        print("error")
                    }
                })
                
                task.resume()
                
            }
            
        }
    

    不是最好的代码,但我稍后会完善它。 起初我解析了 JSON,但结果发现我需要解析一个字符串并将其转换为数据类型:.data(using: .utf8)

    【讨论】:

      【解决方案2】:

      标准消息格式需要表单 URL 编码正文,而不是 JSON 正文。也许像this Swift article一样调整你的代码。

      【讨论】:

        猜你喜欢
        • 2018-08-19
        • 2015-12-08
        • 1970-01-01
        • 2012-06-24
        • 1970-01-01
        • 1970-01-01
        • 2022-06-23
        • 2021-12-04
        • 2020-10-09
        相关资源
        最近更新 更多