是否可以在执行实际请求之前打印整个http(s)请求?
这是我的代码:
let postsEndpoint: String = "https://www.example.com/api/"
guard let postsURL = NSURL(string: postsEndpoint) else {
throw APICallError.other("cannot create URL")
}
let postsURLRequest = NSMutableURLRequest(URL: postsURL)
postsURLRequest.HTTPMethod = "POST"
print(UTF8EncodedJSON)
postsURLRequest.HTTPBody = UTF8EncodedJSON
print(postsURLRequest)
let config = NSURLSessionConfiguration.defaultSessionConfiguration()
let session = NSURLSession(configuration: config)
let task = session.dataTaskWithRequest(postsURLRequest, completionHandler: {
(data, response, error) in
//handle response
})
首先以十六进制打印json然后:
<NSMutableURLRequest: 0x7fdae8d1dd30> { URL: https://www.ritzie.nl/api/v2 }
这对我没有多大帮助。我只想打印我的整个请求,就像你在Firefox上的firebug中看到它一样。
- 编辑 -
澄清一点,我不打算打印我的json。关于SO已经有足够的问题了。我希望我的完整请求打印出类似这样的内容:
POST /api/v2/ HTTP/1.1
HTTP headers:
Host: www.example.ocm
Origin: http://www.example.com
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/\*;q=0.8
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/601.3.9 (KHTML, like Gecko) Version/9.0.2 Safari/601.3.9
Referer: http://www.ritzie.nl/api/test.php
Accept-Language: en-us
Accept-Encoding: gzip, deflate
request body:
data=%7B%22action%22%3A+%22vehicleRecords%22%2C%0D%0A%22token%22%3A+%22token_04e01fdc78205f0f6542bd523519e12fd3329ba9%22%2C%0D%0A%22vehicle%22%3A+%22vehicle_e5b79b2e%22%7D
或者这个:
答案 0 :(得分:2)
在completionHandler中打印:
let task = session.dataTaskWithRequest(postsURLRequest, completionHandler: {
(data, response, error) in
//handle response
print(NSString(data: data.HTTPBody!, encoding:NSUTF8StringEncoding)!)
})
如果它不起作用,请使用以下内容:
print(NSString(data: data, encoding: NSUTF8StringEncoding))
答案 1 :(得分:1)
这个适用于我:
let task = session.dataTaskWithRequest(postsURLRequest, completionHandler: {
(data, response, error) in
if let _data = data
{
do {
var jsonResult: NSDictionary
try jsonResult = NSJSONSerialization.JSONObjectWithData(_data, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary
print("AsSynchronous\(jsonResult)")
}
catch {
// handle error
}
}
else
{
print("Error: no data for request \(urlPath)")
}
})
答案 2 :(得分:1)
我认为您正在寻找类似的东西
print("\(URLRequest.httpMethod ?? "") \(URLRequest.url)")
let str = String(decoding: URLRequest.httpBody!, as: UTF8.self)
print("BODY \n \(str)")
print("HEADERS \n \(URLRequest.allHTTPHeaderFields)")
答案 3 :(得分:0)
您可以使用CustomStringConvertible或CustomDebugStringConvertible生成有关URLRequest扩展的描述。您可以在返回字符串中包含所需的属性。
extension URLRequest /*: CustomStringConvertible*/{
public var description: String{
get{
return "HEADERS \n \(String(describing: allHTTPHeaderFields))"
}
}
}
Use : print(<session task>.currentRequest?.description)
答案 4 :(得分:-1)
let task = session.dataTaskWithRequest(postsURLRequest, completionHandler: {
(data, response, error) in
//handle response
print(NSString(data: response.request, encoding:NSUTF8StringEncoding)!)
})