POST NSURLRequest에 데이터 추가


83

기존에 데이터를 어떻게 추가 POST NSURLRequest합니까? 새 매개 변수를 추가해야합니다 userId=2323.


3
몇 가지 코드로 질문을 설명하십시오.
Tirth

답변:


192

타사 클래스를 사용하지 않으려면 다음은 게시물 본문을 설정하는 방법입니다.

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];

키 / 값 쌍을 게시물 문자열에 추가하기 만하면됩니다.


2
새 요청을 만드는 것이 아니라 기존 NSURLRequest에 새 매개 변수를 추가해야합니다. 먼저 NSMutableURLRequest로 변환해야한다고 생각합니다. 내가 모르는 것은 기존 POST 데이터를 얻는 방법입니다.
Tim

1
즉, 기존 요청의 postString을 어떻게 얻습니까?
Tim

1
당신이있는 NSString, 키 / 값 쌍으로 인코딩 할 수 있습니다 (있는 NSData *) HTTPBody - 당신은에 액세스 할 수 있습니다
사이먼 리

기존 게시물 데이터는 예제와 같이 UTF8로 인코딩됩니다. 인코딩을 어떻게 되돌릴 수 있습니까? 그런 다음 새 매개 변수로 새 문자열을 만드시겠습니까? 그런 다음 새 게시물 데이터를 인코딩합니다
Tim

1
있어야 작동하지만 지금 테스트 할 수 .... existingPost 인 NSMutableString * = [인 NSMutableString ALLOC] initWithData : REQ HTTPBody]을 코딩 NSUTF8StringEncoding]; [existingPost appendFormat : @ "& % @ = % @", @ "name", @ "Locassa"];
Simon Lee

16

에 대한 모든 변경은 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];

12

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]];
Alejandro Cotilla

@AlejandroDavidCotillaRojas - 당신은 사용할 수 있습니다 stringByAddingPercentEncodingWithAllowedCharacters,하지만 당신은 사용할 수 없습니다 URLQueryAllowedCharacterSet즉 포함으로, +그리고 &(사람들은 더 넓은 쿼리 내에서 문자를 허용되지만 그 문자가 쿼리 내의 값 내에 표시하는 경우, 그들은 그 문자 집합하지 않을 것이다, 탈출합니다 ). 따라서 URLQueryAllowedCharacterSet를 사용하여 변경 가능한 문자 집합을 만들고 포함 된 몇 가지 문자를 제거하거나 처음부터 고유 한 문자 집합을 만들 수 있습니다. 또는 CFURLCreateStringByAddingPercentEscapes.
Rob

훌륭한 대답입니다. Alamofire를 사용하여이 모든 깊이를 피할 수 있습니다.
Dan Rosenstark

그 감안할 때 CFURLCreateStringByAddingPercentEscapes지금은 사용되지 않습니다, 당신은 정말 적절한 캐릭터가 직접 설정 구축해야한다. stackoverflow.com/a/54742187/1271826을 참조하십시오 .
Rob

8
 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]];

8

예제 코드는 위, 내가 사용할 필요가 있다고 생각합니다 (위에서 암시하고있다) 그러나, 나에게 정말 도움이되었다 NSMutableURLRequest보다는 NSURLRequest. 현재 형태로는 setHTTPMethod전화 에 응답 할 수 없습니다 . 유형을 변경하면 문제가 해결되었습니다.


1

신속한 솔루션을 찾는 사람

let url = NSURL(string: "http://www.apple.com/")
let request = NSMutableURLRequest(URL: url!)
request.HTTPBody = "company=Locassa&quality=AWESOME!".dataUsingEncoding(NSUTF8StringEncoding)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.