是否可以将NSURLSession发送的请求记录到控制台?我遇到了身份验证问题,如果无法查看请求,我将无法进行调试
5lwkijsr1#
这些方法将以干净的方式打印HTTP请求和响应:
class func log(request: URLRequest){ let urlString = request.url?.absoluteString ?? "" let components = NSURLComponents(string: urlString) let method = request.httpMethod != nil ? "\(request.httpMethod!)": "" let path = "\(components?.path ?? "")" let query = "\(components?.query ?? "")" let host = "\(components?.host ?? "")" var requestLog = "\n---------- OUT ---------->\n" requestLog += "\(urlString)" requestLog += "\n\n" requestLog += "\(method) \(path)?\(query) HTTP/1.1\n" requestLog += "Host: \(host)\n" for (key,value) in request.allHTTPHeaderFields ?? [:] { requestLog += "\(key): \(value)\n" } if let body = request.httpBody{ let bodyString = NSString(data: body, encoding: String.Encoding.utf8.rawValue) ?? "Can't render body; not utf8 encoded"; requestLog += "\n\(bodyString)\n" } requestLog += "\n------------------------->\n"; print(requestLog) } class func log(data: Data?, response: HTTPURLResponse?, error: Error?){ let urlString = response?.url?.absoluteString let components = NSURLComponents(string: urlString ?? "") let path = "\(components?.path ?? "")" let query = "\(components?.query ?? "")" var responseLog = "\n<---------- IN ----------\n" if let urlString = urlString { responseLog += "\(urlString)" responseLog += "\n\n" } if let statusCode = response?.statusCode{ responseLog += "HTTP \(statusCode) \(path)?\(query)\n" } if let host = components?.host{ responseLog += "Host: \(host)\n" } for (key,value) in response?.allHeaderFields ?? [:] { responseLog += "\(key): \(value)\n" } if let body = data{ let bodyString = NSString(data: body, encoding: String.Encoding.utf8.rawValue) ?? "Can't render body; not utf8 encoded"; responseLog += "\n\(bodyString)\n" } if let error = error{ responseLog += "\nError: \(error.localizedDescription)\n" } responseLog += "<------------------------\n"; print(responseLog) }
范例:
---------- OUT ----------> https://api.example.com/api/auth POST /api/auth HTTP/1.1 Host: api.example.com -------------------------> <---------- IN ---------- https://api.example.com/api/auth HTTP/1.1 200 /api/auth Host: api.example.com Content-Type: application/json; charset=UTF-8 Content-Length: 331 Date: Mon, 21 Aug 2017 18:55:46 GMT Server: Google Frontend { "Data": { "Token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1MDMzNDUzNDYsImlhdCI6MTUwMzM0MTc0NiwianRpIjoiNTcwNmMyN2UtODZhMi0xMWU3LThkN2ItNjJjYmY2YzkxYzdhIiwibmJmIjoxNTAzMzQxNzQ2fQ.0p09QG9ImjemQxlDIxZb9SL6j3Fy4VAAzsA-JZp27q0", "ExpiryUnix": 1503345346, "ExpiryTimestamp": "Mon Aug 21 19:55:46 UTC 2017" } } <------------------------
wn9m85ua2#
值得一试的是在Xcode方案中添加CFNETWORK_DIAGNOSTICS=3来运行。更多信息请访问:https://developer.apple.com/library/archive/qa/qa1887/_index.html
col17t5w3#
打印请求正文的一种可能方法是:
let sBody = NSString(data: request.HTTPBody!, encoding: NSASCIIStringEncoding) print(sBody)
要打印所有题头,请执行以下操作:
let sHeaderFields = request.allHTTPHeaderFields print(sHeaderFields)
hvvq6cgz4#
下面的方法对我很有效:对于请求主体,我获取原始的ascii值;对于头字段,我使用String(descripting:)函数将头值作为字符串获取。
雨燕三号
print("REQUEST BODY: \(NSString(data: request.httpBody!, encoding: String.Encoding.ascii.rawValue)!)") print("REQUEST HEADER: \(String(describing: request.allHTTPHeaderFields!))")
控制台输出:
申请正文:{“feeds”:[“xxxx”]}请求标题:[“内容类型”:“应用程序/json”,“授权”:“令牌令牌= xxxxxxxxxxxxxxxxxxxxxxx”]另一种方法可能是使用use a tool like Postman来构建请求并查看API响应。有一个免费版本,一旦你通过了学习曲线,它在使用API时是必不可少的。他让我走上了正确的方向。
4条答案
按热度按时间5lwkijsr1#
这些方法将以干净的方式打印HTTP请求和响应:
范例:
wn9m85ua2#
值得一试的是在Xcode方案中添加CFNETWORK_DIAGNOSTICS=3来运行。更多信息请访问:https://developer.apple.com/library/archive/qa/qa1887/_index.html
col17t5w3#
打印请求正文的一种可能方法是:
要打印所有题头,请执行以下操作:
hvvq6cgz4#
下面的方法对我很有效:对于请求主体,我获取原始的ascii值;对于头字段,我使用String(descripting:)函数将头值作为字符串获取。
雨燕三号
控制台输出:
申请正文:{“feeds”:[“xxxx”]}请求标题:[“内容类型”:“应用程序/json”,“授权”:“令牌令牌= xxxxxxxxxxxxxxxxxxxxxxx”]
另一种方法可能是使用use a tool like Postman来构建请求并查看API响应。有一个免费版本,一旦你通过了学习曲线,它在使用API时是必不可少的。
他让我走上了正确的方向。