2012-12-14 5 views
4
내가

대괄호를 처리 할 수 ​​없습니다 (= []) 서버

NSString *resourcePath = [NSString stringWithFormat:@"/sm/search?limit=100&term=%@&types[]=users&types[]=questions", searchTerm]; 

그러나 서버 호출이 될 때 내 아이폰 응용 프로그램에서 다음 URL을 호출하고

에 URL의 구문 분석 할 때, 나는 실제 발견 보낸 URL은

/sm/search?term=mi&types%5B%5D=questions&limit=100 

올바른 URL을 서버로 보내려면 어떻게해야합니까?

+0

'[] '대신'\ [\]'를 사용해 보셨습니까? – Kjuly

+0

실제 URL **에는 '% 5B'이 (가) 포함되어야합니다. URL이 작동하는 방식입니다. URL에있는 안전하지 않은 문자의 유효한 이스케이프입니다. –

답변

3

난 당신이 URL을 만들 수 NSURL 방법

initWithScheme:host:path: 

를 사용한다고 가정합니다. 문서에 따르면이 메서드는 stringByAddingPercentEscapesUsingEncoding: 메서드를 사용하여 자동으로 경로를 이스케이프합니다.

문자가 여러 가지 이유로 안전하지 않을 수 있습니다 그들은 RFC 1738 - Uniform Resource Locators (URL)의 의미에서 "안전하지 않은"때문에

대괄호

는 이스케이프됩니다. [...] 기타 문자 은 게이트웨이 및 기타 전송 에이전트가 으로 알려져 있기 때문에 때때로 이러한 문자를 수정하기 때문에 안전하지 않습니다. 이러한 문자는 "{", "}", "|", "\", "^", "~", "[", "]"및 "`"입니다.

안전하지 않은 문자는 항상 URL 내에 인코딩되어야합니다.

initWithString 문자열이 필요한 %의 이스케이프 코드를 포함 할 것으로 예상 때문에, 다음 탈출 시퀀스가 ​​추가되지 않습니다

NSString *s = [NSString stringWithFormat:@"http://server.domain.com/sm/search?limit=100&term=%@&types[]=users&types[]=questions", searchTerm]; 
NSURL *url = [[NSURL alloc] initWithString:s]; 

와 URL을 생성합니다.

+1

서버가 서버 측에서 문제가되는 이스케이프 된 URL을 처리 할 수없는 경우 유의해야합니다. –

+0

실제로이 "[[RKClient sharedClient] get : resourcePath usingBlock :^(RKRequest * request)"에 대해 RESTKIT Client를 사용하고 있으며 리소스 경로는 문자열을 받아들입니다. – Zhen

+0

@Zhen : RestKit을 사용하면 도움이 안됩니다. 아직 사용하지 않았다. 필자는 소스 코드를 살펴본 결과 RestKit이 결과적으로 모든 쿼리 매개 변수를 이스케이프 처리 한 것처럼 보였습니다.이 쿼리 매개 변수는 인용 된 RFC에 따라 "올바른 것"으로 보입니다. 그래서 제 대답은 문제를 설명하는 데 도움이 될 수 있습니다. 서버가 이것을 처리해야한다는 Hot Licks의 의견도 참고하십시오. –

관련 문제