我有一个我的iPhone应用程序的用户抱怨它在使用他的移动数据连接时不起作用(但通过Wifi工作正常)。我的应用程序向第三方REST API发出请求,并为此使用ASIHTTPRequest库。
我的HTTP请求的一个参数是用户名(这是一个电子邮件地址),因此我使用以下代码对用户名进行编码:
-(NSString *) encodeString:(NSString *) string
{
NSString * returnString = (NSString *)CFURLCreateStringByAddingPercentEscapes(
NULL,
(CFStringRef) string,
NULL,
(CFStringRef)@"!*'();:@&=+$,/?%#[]",
kCFStringEncodingUTF8 );
return [returnString autorelease];
}
然后将其内置到URL中,如下所示:
// Setup the url we need to make the request to the sharkscope API
NSString * urlString = [NSString stringWithFormat: @"%SERVICEADDRESSHERE?Username=%@&Password=%@",
encodedUserName, m_md5Key];
NSURL * url = [NSURL URLWithString:urlString];
request = [[ASIHTTPRequest requestWithURL:url] retain];
我的应用程序发送的内容是使用以下用户名的请求:
Username=Fred.Bloggs%40wanadoo.fr
对于这一个用户,使用移动数据连接时在服务器上收到的是:
Username=Fred.Bloogs%2540wanadoo.fr
很明显,在我调用requestWithURL并到达服务器之间的某个地方编码了%字符。我无法理解原因,因为我有数百名其他用户可以通过数据连接正常运行请求。
我是否甚至需要对传递给requestWithURL的值进行编码?
有没有人知道%字符被重新编码的阶段。我猜它一定是在ASIHTTP库中,但在这种情况下无法确定触发它的情况。
答案 0 :(得分:1)
由于运营商实施的3G连接上的代理或透明代理,可能会发生损坏。
可能的工作原理:
为了证明这个理论,当他使用3g连接时,你可以尝试让他在iOS上的Safari中输入相同/类似的请求。