如何在编码在简单的http post -objective-c中使用的字符串之前转义所有特殊字符

Tor*_*ups 0 viewstate escaping objective-c

我正在构建一个简单的http POST请求.在这篇文章中我需要添加一些项目,其中一项是在前一个请求中被拉下来的大型视图状态字符串.我注意到的是,原始请求需要转义所有特殊字符(如下所示)

_ EVENTTARGET =& _ EVENTARGUMENT =& __ VIEWSTATE = %% 3D&

但我不确定我是否在目标c中做到了这一点.目前,当我NSLog出视口状态字符串时,它仍然显示/和=字符.

任何人都可以证实我在正确的道路上吗?如果不是,我将如何转换viewstate中的特殊字符(即 - 而不是=我应该得到%3D)?

- (void)doHttpPostWithViewState:(NSString *)viewstate
{ 
  responseData = [[NSMutableData data] retain];

  NSURL *url = [NSURL URLWithString:@"https://localhost/Login"];
  NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];

  NSString* theBodyString = [[NSString alloc] initWithFormat:@"__EVENTTARGET=&__EVENTARGUMENT=&__VIEWSTATE=%@",viewstate];
  NSData *requestData = [theBodyString dataUsingEncoding:NSUTF8StringEncoding];

  NSDictionary * headers = [NSHTTPCookie requestHeaderFieldsWithCookies:cookies];

  [request setHTTPMethod:@"POST"];
  [request setValue:@"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" forHTTPHeaderField:@"Accept"];
  [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
  [request setValue:[NSString stringWithFormat:@"%d", [requestData length]] forHTTPHeaderField:@"Content-Length"];
  [request setHTTPBody: requestData];
  [request setAllHTTPHeaderFields:headers];

  [[NSURLConnection alloc] initWithRequest:request delegate:self];
}
Run Code Online (Sandbox Code Playgroud)

最后,为了本地调试目的 - 如何使用NSLog查看将发送到客户端的最终(原始)字符串?先感谢您!

更新

事实证明这是stringByAddingPercentEscapesUsingEncoding方法中的一个错误

我在这篇博客文章中发现了以下内容

NSString * cleanViewState = (NSString *)CFURLCreateStringByAddingPercentEscapes(
                                                                                 NULL,
                                                                                 (CFStringRef)viewstate,
                                                                                 NULL,
                                                                                 (CFStringRef)@"!*'();:@&=+$,/?%#[]",
                                                                                 kCFStringEncodingUTF8 );
Run Code Online (Sandbox Code Playgroud)

Dav*_*har 5

您可能正在寻找NSString上的stringByAddingPercentEscapesUsingEncoding:方法来对您的POST请求进行%编码.


更新:

如果NSString方法没有获得所需的所有特殊字符,则下一步是下拉到Core Foundation级别函数(CFURLCreateStringByAddingPercentEscapes),这样可以更好地控制.见http://simonwoodside.com/weblog/2009/4/22/how_to_really_url_encode/