URL编码和解码

297 阅读1分钟

研究这个的原因是碰到一个问题:后端加了http请求的校验,head里要把对应的请求的参数拼接进去,云端按照相同的规则去生成sign,跟我传过去的对比 结果请求方式1 能成功

 //方式1
  LHRequest *request1 = [[LHRequest alloc] init];
  NSString *str1 = [LHCommonUtil jsonStringFromObject:@[@"lumi.4cf8cdf3c878784"]];
  request1.path = [NSString stringWithFormat:@"app/dev/query/detail?dids=%@",str1];
  request1.params = @{@"dids":str1};
  [request1 getAsyncCompletion:^(id response, NSError *error) {
    NSLog(@"response==%@ error==%@",response,error);
  }];

方式2一直不成功

//方式2
LHRequest *request2 = [[LHRequest alloc] init];
str1 = [LHCommonUtil jsonStringFromObject:@[@"lumi.4cf8cdf3c878784"]];
//转码一下
str1 = [self encodeToPercentEscapeString:str1];
request2.path = [NSString stringWithFormat:@"app/dev/query/detail?dids=%@",str1];
request2.params = @{
                   };
[request2 getAsyncCompletion:^(id response, NSError *error) {
  NSLog(@"response==%@ error==%@",response,error);
}];

}

- (NSString *)encodeToPercentEscapeString: (NSString *)input{

NSString *outputStr =
(__bridge NSString *)CFURLCreateStringByAddingPercentEscapes(
NULL, /* allocator */
(__bridge CFStringRef)input,
NULL, /* charactersToLeaveUnescaped */
(CFStringRef)@"!*'();:@&=+$,/?%#[]",
kCFStringEncodingUTF8);
return outputStr;
}

debug了半天,找到原因,我是从path里把对应的keyvalue取出来,里边含有【“在请前进行了编码,我这里应该解码一下,果然改完后,问题解决了。

参考:全面深度解析iOS端URL编码和解码过程