在Swift或Objective-C中打印原始HTTP请求的便捷方式?

时间:2016-02-10 18:56:48

标签: ios objective-c swift

是否有方便的方法来查看或打印NSMutableURLRequest作为原始HTTP请求 - 即如何通过网络发送?也许当实际提出要求时?我特意尝试提取请求的特定组件并手动将它们组合在一起。我是否在WKWebView.loadRequest(r)的网页浏览中加载它。

通过原始请求,我的意思是它通过电线发送 - 类似于:

POST /target/command HTTP/1.0
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 9_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12D508
Content-Type: application/json
Content-Length: 38914
Custom-Header: custom-value

{"param": "value"}

我问的原因是因为我的服务器似乎收到一个特定请求的空请求主体,而它接收其他请求主体。如果我可以像我在服务器上调试一样调试它 - 通过打印原始请求将非常有用。我知道我可以使用像查尔斯这样的代理工具,但我希望有更方便的答案。

2 个答案:

答案 0 :(得分:1)

我通常只是将所有传出请求打印为带有类似类别的复制/可粘贴cURL命令,如果您不需要该功能,可以重新格式化。

@implementation NSURLRequest (cURLRepresentation)

- (NSString *)escapeQuotesInString:(NSString *)string {
    NSParameterAssert(string.length);

    return [string stringByReplacingOccurrencesOfString:@"\"" withString:@"\\\""];
}

- (NSString *)cURLRepresentation {

    NSMutableString *curlString = [NSMutableString stringWithFormat:@"-------\ncurl -k -X %@ --dump-header -", self.HTTPMethod];

    for (NSString *key in self.allHTTPHeaderFields.allKeys) {

        NSString *headerKey = [self escapeQuotesInString: key];
        NSString *headerValue = [self escapeQuotesInString: self.allHTTPHeaderFields[key] ];

        [curlString appendFormat:@" -H \"%@: %@\"", headerKey, headerValue];
    }

    NSString *bodyDataString = [[NSString alloc] initWithData:self.HTTPBody encoding:NSUTF8StringEncoding];
    if (bodyDataString.length) {

        bodyDataString = [self escapeQuotesInString: bodyDataString];
        [curlString appendFormat:@" -d \"%@\"", bodyDataString];
    }

    [curlString appendFormat:@" \"%@\"", self.URL.absoluteString];
    [curlString appendFormat:@"\n-------"];

    return curlString;
}

@end

答案 1 :(得分:0)

使用RequestBin(requestb.in)来确保我不会发疯...原来在WKWebView.loadRequest(r)中存在一个错误,其中r.HTTPBody将不会在请求正文中传递,即使非空。叹息。