Objective c NSURLRequest到NSString

Objective c NSURLRequest到NSString,objective-c,cocoa-touch,nsurlrequest,Objective C,Cocoa Touch,Nsurlrequest,如何将NSURLRequest转换为NSString?取决于您在字符串中需要的信息。是否希望它包含对象中实例变量的所有值?如果是这样,您将需要编写自己的方法来实现这一点。可能是子类NSURLRequest和重写description。您还可以使用反射获取所有私有IVAR,并打印来自另一个类的所有内容 或者只使用调试器检查值 - (NSString*) urlRequestToString:(NSURLRequest*)urlRequest { NSString *requestPath =

如何将NSURLRequest转换为NSString?

取决于您在字符串中需要的信息。是否希望它包含对象中实例变量的所有值?如果是这样,您将需要编写自己的方法来实现这一点。可能是子类
NSURLRequest
和重写
description
。您还可以使用反射获取所有私有IVAR,并打印来自另一个类的所有内容

或者只使用调试器检查值

- (NSString*) urlRequestToString:(NSURLRequest*)urlRequest
{
  NSString *requestPath = [[urlRequest URL] absoluteString];
  return requestPath;
}
在本例中,urlRequest是一个NSURLrequest(来自上面的示例)。第二行允许您打印已添加到NSURLRequest的特定字段“field”的值

来自苹果文档

- (NSString *)valueForHTTPHeaderField:(NSString *)field Parameters

要返回其值的标头字段的名称。与HTTP RFC一致,HTTP头字段名是 不区分大小写

返回值

与标头字段关联的值,如果存在,则为nil 没有相应的标题字段


如果您使用的是swift,则可以实现以下扩展:

extension NSURLRequest: DebugPrintable {
    public func extendedDescription() -> String {

        var result = "<\(NSStringFromClass(self.dynamicType)): " + String(format: "%p", self)
        result += "; HTTPMethod=" + (HTTPMethod ?? "nil") + "; URL=\(URL); timeoutInterval=" + String(format: "%.1fs", timeoutInterval) + "> {"

        // Add header fields.
        if let headers = allHTTPHeaderFields {
            result += "\nallHTTPHeaderFields {"
            for (key, value) in headers {
                result += "\n\t\(key) : '\(value)'"
            }
            result += "\n}"
        }

        if let body = HTTPBody {
            result += "\nHTTPBody {\n " + ((NSString(data: body, encoding: NSASCIIStringEncoding) ?? "") as String) + "}"
        }

        return result + "\n}"
    }

    public override var debugDescription: String {
        return extendedDescription()
    }

    public override var description: String {
        return extendedDescription()
    }
}
扩展NSURLRequest:可调试打印{
public func extendedDescription()->字符串{
var result=“{”
//添加标题字段。
如果let headers=allHTTPHeaderFields{
结果+=“\nallHTTPHeaderFields{”
用于标题中的(键、值){
结果+=“\n\t\(键):“\(值)”
}
结果+=“\n}”
}
如果let body=HTTPBody{
结果+=“\nHTTPBody{\n”+((NSString(数据:正文,编码:NSASCIIStringEncoding)??”)作为字符串)+“}”
}
返回结果+“\n}”
}
public override var debugDescription:字符串{
返回extendedDescription()
}
公共重写变量说明:字符串{
返回extendedDescription()
}
}
或者查看以下要点:

如果打印出来,它将显示类似以下内容:

<NSMutableURLRequest: 0x7fa91977e390; HTTPMethod=POST; URL=https://myapi.com/api/something; timeoutInterval=300.0s> {
allHTTPHeaderFields {
    Accept-Encoding : 'gzip'
    Content-Type : 'application/json'
    Accept : 'application/json'
}
HTTPBody {
    {"key1":"value1"}
}
}
{
所有HttpHeaderFields{
接受编码:“gzip”
内容类型:“应用程序/json”
接受:'application/json'
}
HTTPBody{
{“key1”:“value1”}
}
}

在iOS 9/Xcode 7中,您可以在Swift(或者实际上在Objective-C中)中使用
request.URLString

tnx dude…但我对cocoa是新手。。。在我的代码中:NSURLRequest*newRequest=request;NSLog(@“%@”,newRequest);//我需要在字符串变量中添加“”。
NSLog(@“”[[newRequest URL]absoluteString])查看
NSURLRequest
的API文档:tnx-Marc;NSString*naeim=[[newRequest URL]绝对字符串];此命令为true;)。这是一个愚蠢的问题,但这也是一个愚蠢的答案。很明显,用户请求的URL是一个字符串,这就是为什么上面的评论会获得如此多的赞成票。这只会打印NSURLRequest的URL。这不是NSURL请求中唯一重要的事情。@rplankenhorn-很明显。这也很清楚OP的目的是什么。这为什么有助于回答这个问题???这又如何增加其他答案呢??这似乎是一个毫无意义的回答,对任何人都没有帮助-1@Popeye-它显示了将NSURLRequest作为字符串获取的另一种方法,完全按照原始问题,而不是页面上任何其他答案提供的方法。这到底怎么会毫无意义呢?但事实并非如此。因为我们中没有人知道变量
urlRequest
是什么,所以它可以是任何东西(显然是NSURLRequest,但新手可能不知道),以及什么是
字段
?由于
HTTPHeaderFields
中有相当多的字段,因此实际上可以是任何字段。所以这实际上无助于解决问题。您需要做两件事:提供所有代码并解释代码,直到my-1仍然存在。上面的答案中引用了urlRequest。我只是用了同一个名字。它的名字也清楚地暗示它是一个请求!我接受你关于field:的观点,并将编辑我的答案。你不应该使用其他人的答案作为参考,并期望其他人知道你在说什么,如果你要给出答案并使用变量,你需要解释你自己答案中的变量。我可以执行
NSString*urlRequest
,当我执行您的代码时,我会得到
无法识别的选择器异常
,这将非常糟糕。我的-1仍然存在,因为您的答案仍然不清楚。谢谢,真的帮助我调试了一个客观的c调用,我正在迁移到swift。
<NSMutableURLRequest: 0x7fa91977e390; HTTPMethod=POST; URL=https://myapi.com/api/something; timeoutInterval=300.0s> {
allHTTPHeaderFields {
    Accept-Encoding : 'gzip'
    Content-Type : 'application/json'
    Accept : 'application/json'
}
HTTPBody {
    {"key1":"value1"}
}
}