POSTNSURLRequestにデータを追加します


83

既存のデータにどのようにデータを追加しますPOST NSURLRequestか?新しいパラメータを追加する必要がありますuserId=2323


3
質問をコードで説明してください。
2011年

回答:


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データを取得する方法です。
ティム

1
言い換えれば、既存のリクエストのpostStringをどのように取得しますか?
ティム

1
NSString、キー/値のペアにエンコードできる-(NSData *)HTTPBodyにアクセスできます
Simon Lee

既存の投稿データは、例のようにUTF8でエンコードされます。エンコードを逆にするにはどうすればよいですか?次に、新しいパラメータで新しい文字列を作成しますか?次に、新しい投稿データをエンコードします
Tim

1
これ機能するはずですが、現時点ではテストできません。...NSMutableString * existingPost = [[NSMutableString alloc] initWithData:[req HTTPBody] encoding:NSUTF8StringEncoding]; [existingPost appendFormat:@ "&%@ =%@"、@ "name"、@ "Locassa"];
サイモンリー

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こともできますよう、+そして&エスケープ渡します。これらの2文字は、より広い「クエリ」内で許可されますが、これらの文字がクエリ内の値内に表示される場合は、エスケープする必要があります。技術的にはURLQueryAllowedCharacterSet、可変文字セットを作成してそこに含まれている文字のいくつかを削除するか、独自の文字セットを最初から作成するために使用できます。

たとえば、あなたがAlamofireのを見れば、パラメータの符号化、彼らが取るURLQueryAllowedCharacterSetと、その後削除generalDelimitersToEncode(文字を含む#[]、と@、しかしため、一部の古いWebサーバでの歴史的なバグの、どちら?でも/)とsubDelimitersToEncode(すなわち!$&'()*+,;、および=)。(あなたがの除去を議論できたが、これは正しい実装である?/、かなり畳み込まれても、)。おそらくCFURLCreateStringByAddingPercentEscapes、より直接的/効率的です。


についてstringByAddingPercentEscapesUsingEncoding:は真実ですが、stringByAddingPercentEncodingWithAllowedCharacters:すべてのキャラクターで問題なく動作します。例: URLString = [URLString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
Alejandro Cotilla 2016

@ AlejandroDavidCotillaRojas-を使用できますがstringByAddingPercentEncodingWithAllowedCharacters、を使用することはできません。URLQueryAllowedCharacterSetこれには+、およびが含まれているため使用できません&(これらの文字は、より広範なクエリ内で許可されている文字ですが、これらの文字がクエリ内の値内に表示される場合は、エスケープする必要があります。この文字セットでは実行されません。 )。したがって、を使用URLQueryAllowedCharacterSetして可変文字セットを作成し、そこに含まれている文字のいくつかを削除するか、独自の文字セットを最初から作成することができます。またはを使用しますCFURLCreateStringByAddingPercentEscapes
ロブ

素晴らしい答えです。この深さをすべて回避するためにAlamofireを使用することは本当に重要です。
ダンローゼンスターク2016

これCFURLCreateStringByAddingPercentEscapesが非推奨になったことを考えると、適切な文字セットを自分で作成する必要があります。stackoverflow.com/a/54742187/1271826を参照してください。
ロブ

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.