swift2 在控制台中记录NSURLSession请求

hs1rzwqc  于 2022-11-06  发布在  Swift
关注(0)|答案(4)|浏览(261)

是否可以将NSURLSession发送的请求记录到控制台?我遇到了身份验证问题,如果无法查看请求,我将无法进行调试

5lwkijsr

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"
  }
}
<------------------------
wn9m85ua

wn9m85ua2#

值得一试的是在Xcode方案中添加CFNETWORK_DIAGNOSTICS=3来运行。更多信息请访问:https://developer.apple.com/library/archive/qa/qa1887/_index.html

col17t5w

col17t5w3#

打印请求正文的一种可能方法是:

let sBody = NSString(data: request.HTTPBody!, encoding: NSASCIIStringEncoding)
print(sBody)

要打印所有题头,请执行以下操作:

let sHeaderFields = request.allHTTPHeaderFields
print(sHeaderFields)
hvvq6cgz

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时是必不可少的。
他让我走上了正确的方向。

相关问题