기존에 데이터를 어떻게 추가 POST
NSURLRequest
합니까? 새 매개 변수를 추가해야합니다 userId=2323
.
답변:
타사 클래스를 사용하지 않으려면 다음은 게시물 본문을 설정하는 방법입니다.
NSURL *aUrl = [NSURL URLWithString:@"http://www.apple.com/"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:aUrl
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:60.0];
[request setHTTPMethod:@"POST"];
NSString *postString = @"company=Locassa&quality=AWESOME!";
[request setHTTPBody:[postString dataUsingEncoding:NSUTF8StringEncoding]];
NSURLConnection *connection= [[NSURLConnection alloc] initWithRequest:request
delegate:self];
키 / 값 쌍을 게시물 문자열에 추가하기 만하면됩니다.
에 대한 모든 변경은 NSMutableURLRequest
호출하기 전에 이루어져야합니다 NSURLConnection
.
위의 코드를 복사하여 붙여넣고 실행 TCPMon
하고 요청이 GET
예상 된 대신에 나타나는 것을 보면이 문제가 발생 합니다 POST
.
NSURL *aUrl = [NSURL URLWithString:@"http://www.apple.com/"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:aUrl
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:60.0];
[request setHTTPMethod:@"POST"];
NSString *postString = @"company=Locassa&quality=AWESOME!";
[request setHTTPBody:[postString dataUsingEncoding:NSUTF8StringEncoding]];
NSURLConnection *connection= [[NSURLConnection alloc] initWithRequest:request
delegate:self];
POST
요청 형성에 대한 이전 게시물 은 대체로 정확합니다 (URL이 아닌 본문에 매개 변수 추가). 그러나 예약 된 문자 (예 : 공백, 앰퍼샌드, 더하기 기호)를 포함하는 입력 데이터의 가능성이있는 경우 이러한 예약 된 문자를 처리해야합니다. 즉, 입력을 퍼센트 이스케이프해야합니다.
//create body of the request
NSString *userid = ...
NSString *encodedUserid = [self percentEscapeString:userid];
NSString *postString = [NSString stringWithFormat:@"userid=%@", encodedUserid];
NSData *postBody = [postString dataUsingEncoding:NSUTF8StringEncoding];
//initialize a request from url
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPBody:postBody];
[request setHTTPMethod:@"POST"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
//initialize a connection from request, any way you want to, e.g.
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
어디 precentEscapeString
메서드는 다음과 같이 정의된다 :
- (NSString *)percentEscapeString:(NSString *)string
{
NSString *result = CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
(CFStringRef)string,
(CFStringRef)@" ",
(CFStringRef)@":/?@!$&'()*+,;=",
kCFStringEncodingUTF8));
return [result stringByReplacingOccurrencesOfString:@" " withString:@"+"];
}
유망한 NSString
방법 stringByAddingPercentEscapesUsingEncoding
(현재 사용되지 않음) 이 있었는데, 매우 유사한 작업을 수행하지만 사용하려는 유혹에 저항합니다. 일부 문자 (예 : 공백 문자)를 처리하지만 다른 일부 (예 : +
또는 &
문자) 는 처리하지 않습니다 .
현대의 등가물은 stringByAddingPercentEncodingWithAllowedCharacters
이지만 다시 이스케이프 처리되지 않은 URLQueryAllowedCharacterSet
것을 허용 +
하고 &
전달할 수 있으므로 사용하려는 유혹을받지 마십시오 . 이러한 두 문자는 더 넓은 "쿼리"내에서 허용되지만 이러한 문자가 쿼리 내의 값 내에 나타나면 이스케이프되어야합니다. 기술적 URLQueryAllowedCharacterSet
으로는를 사용 하여 변경 가능한 문자 집합을 만들고 포함 된 몇 가지 문자를 제거하거나 처음부터 고유 한 문자 집합을 만들 수 있습니다.
예를 들어 당신이 Alamofire의를 보면, 매개 변수 인코딩 , 그들이 가지고 URLQueryAllowedCharacterSet
다음 제거 generalDelimitersToEncode
(포함하는 문자 #
, [
, ]
,과 @
, 그러나 때문에 오래된 웹 서버에서 역사적 버그, 어느 쪽 ?
도 /
)와 subDelimitersToEncode
(즉 !
, $
, &
, '
, (
, )
, *
, +
, ,
, ;
, 및 =
). 꽤 복잡 하지만 올바른 구현입니다 ( ?
및 제거에 대해 토론 할 수 있음 /
). 아마도 CFURLCreateStringByAddingPercentEscapes
더 직접적이고 효율적일 것입니다.
stringByAddingPercentEscapesUsingEncoding:
이지만 stringByAddingPercentEncodingWithAllowedCharacters:
모든 캐릭터에서 잘 작동합니다. 예 : URLString = [URLString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
stringByAddingPercentEncodingWithAllowedCharacters
,하지만 당신은 사용할 수 없습니다 URLQueryAllowedCharacterSet
즉 포함으로, +
그리고 &
(사람들은 더 넓은 쿼리 내에서 문자를 허용되지만 그 문자가 쿼리 내의 값 내에 표시하는 경우, 그들은 그 문자 집합하지 않을 것이다, 탈출합니다 ). 따라서 URLQueryAllowedCharacterSet
를 사용하여 변경 가능한 문자 집합을 만들고 포함 된 몇 가지 문자를 제거하거나 처음부터 고유 한 문자 집합을 만들 수 있습니다. 또는 CFURLCreateStringByAddingPercentEscapes
.
CFURLCreateStringByAddingPercentEscapes
지금은 사용되지 않습니다, 당신은 정말 적절한 캐릭터가 직접 설정 구축해야한다. stackoverflow.com/a/54742187/1271826을 참조하십시오 .
NSURL *url= [NSURL URLWithString:@"https://www.paypal.com/cgi-bin/webscr"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:aUrl
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:10.0];
[request setHTTPMethod:@"POST"];
NSString *postString = @"userId=2323";
[request setHTTPBody:[postString dataUsingEncoding:NSUTF8StringEncoding]];