我有这段代码可以将用户名和密码发送到本地API(由于我仍在开发中,所以它现在是http,并且还不在服务器上)。但是,返回的数据只是响应代码,而不是响应的正文,该正文应包含auth-token。
这是客户端代码(我在SwiftUI中的应用):
func login(username:String, password:String){
guard let url = URL(string: "http://localhost:3000/users/login") else { print("URL error"); return }
var request = URLRequest(url: url, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10)
let headers = [
//"auth-token": "auth-token goes here",
"accept": "string",
"content-type": "application/json"]
let body = [
"username": username,
"password": password]
do{
let dataToSend = try JSONSerialization.data(withJSONObject: body, options: .fragmentsAllowed)
request.httpBody = dataToSend
}catch{
print("Error creating data object")
return
}
request.allHTTPHeaderFields = headers
request.httpMethod = "POST"
let session = URLSession.shared
let dataTask = session.dataTask(with: request) { (data, response, error) in
// Check for erros
if error == nil && data != nil{
// Try parse out data
print(data)
do {
let dictionary = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? [String:Any]
print(dictionary)
}
catch{
print("Error parsing response data")
}
}
}
dataTask.resume()
}
当我在尝试将其放入字典之前打印出数据响应时,会得到以下信息:
Optional(200 bytes)
我得到的是响应代码,而不是响应的主体(即json),为什么?
这是我的服务器端代码:
router.post('/login', async (req,res) => {
// Validate before we login user
const { error } = loginValidation(req.body);
if (error) return res.status(400).send(error.details[0].message);
// Checking if the user exists
const user = await User.findOne({username: req.body.username});
if(!user) return res.status(400).send("Invalid username")
// Check if password is correct
const validPass = await bcrypt.compare(req.body.password, user.password);
if(!validPass) return res.status(400).send("Invalid password")
console.log(req.body);
// User is logged in provide them with a token
const token = jwt.sign({
_id: user._id,
_username: user.username
}, "SECRET_KEY", { expiresIn: '1h' });
res.status(200).header('auth-token', token).send(token);
});
答案 0 :(得分:1)
数据似乎不包含有效的JSON
,这是您的代码未打印出您试图解析的dictionary
的原因。查找响应数据的方法如下:
if let data = data {
do {
let dictionary = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String:Any]
print(dictionary)
} catch {
print("Error parsing response data: \(String(decoding: data, as: UTF8.self))")
}
}