[ios] POST NSURLRequest에 데이터 추가

기존에 데이터를 어떻게 추가 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더 직접적이고 효율적일 것입니다.


답변

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


답변

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


답변

신속한 솔루션을 찾는 사람

let url = NSURL(string: "http://www.apple.com/")
let request = NSMutableURLRequest(URL: url!)
request.HTTPBody = "company=Locassa&quality=AWESOME!".dataUsingEncoding(NSUTF8StringEncoding)


답변