POST要求の2種類のフォーマット
6501 ワード
転載先http://blog.csdn.net/charlesyaoxin/article/details/49230151
POST要求の2種類のフォーマット
1、同期要求はインターネットからデータを要求することができ、同期要求を送信すると、プログラムはユーザーの対話を停止し、サーバーがデータを返して完成するまで、次の操作を行うことができる.
2、非同期要求はメインスレッドをブロックすることなく、新しいスレッドを作成して操作する.ユーザーが非同期要求を発行した後もUIを操作することができ、プログラムは引き続き実行することができる.
3、GET要求、パラメータを直接アクセスパスに書く.操作は簡単ですが、外部に見られやすく、安全性が高くなく、アドレスは255バイトまでです.
4、POST要求、パラメータをbodyに入れる.POST要求操作は比較的複雑で、パラメータとアドレスを分ける必要があるが、安全性が高く、パラメータをbodyの中に置くと、キャプチャされにくい.[html]view plain copy GETは比較的簡単なリクエスト方式であり、URLには送信するすべてのパラメータが直接含まれている.POSTは主にサーバにデータをアップロードするために使われていることを理解することができ、簡単なのは文字をアップロードすることであり、複雑なのは画像音声をアップロードすることなどである.では、このようなニーズに対してGETを使うと、このURLが長すぎるのは明らかです.したがって、POST方式が存在し、基本的なURLの場合、アップロードするデータを含むパケットを添付し、URLとともにサーバに送信することができる.POSTメソッドには2つのフォーマットがあり,1つは基本的なフォーマットであり,文字情報の送信に一般的に用いられる.Postリクエストの基本フォーマットは、POST/login.asp HTTP/1.1 Host:www.example.com Content-Type:アプリケーション/x-www-form-urlencoded Content-Length:35 username=wantsoft&password=password//postのデータのもう1つはmultipart/form-dataで、フォーマットはPOST/upload_file/UploadFile HTTP/1.1 Accept: text/plain,/ Accept-Language: zh-cn Host: www.example.com Content-Type:multipart/form-data;boundary=—————————7d33a816d302b6 User-Agent: Mozilla/4.0 (compatible; OpenOffice.org) Content-Length: 424 Connection: Keep-Alive —————————–7d33a816d302b6 Content-Disposition:form-data; name=”userfile”; filename=”userfile” Content-Type: application/octet-stream abbXXXccc —————————–7d33a816d302b6 Content-Disposition: form-data; name=”text1” foo —————————–7d33a816d302b6 Content-Disposition: form-data; name="password 1"bar———————————7 d 33 a 816 d 302 b 6–複雑に見えますが、実は要求データを境界線であるBoundaryで区切ることで、冒頭の内容については、デフォルトであることが多く、考慮する必要はありません.[html] view plain copy - (void)sendPostTwo:(NSString *)urlString {
//{ [data appendData:[headBoundary dataUsingEncoding:NSUTF8StringEncoding]];
//}//複数のデータを要求する場合、カッコの3つはつなぎ合わせる必要がありますが、headとendBoundaryは先頭と最後に追加して要求体に設定するだけです.//ただし、要求データ型の設定を忘れないでくださいね.//一般文字はapplication/x-www/form-urlencodedピクチャなどです...multipart/form-data、実は简単ではありません....//そうだ、スペースと改行にも気をつけて、使う时にフォーマットを见てみましょう!!!
}
[html] view plain copy - (void)sendPostOne:(NSString *)urlString {
}
POST要求の2種類のフォーマット
1、同期要求はインターネットからデータを要求することができ、同期要求を送信すると、プログラムはユーザーの対話を停止し、サーバーがデータを返して完成するまで、次の操作を行うことができる.
2、非同期要求はメインスレッドをブロックすることなく、新しいスレッドを作成して操作する.ユーザーが非同期要求を発行した後もUIを操作することができ、プログラムは引き続き実行することができる.
3、GET要求、パラメータを直接アクセスパスに書く.操作は簡単ですが、外部に見られやすく、安全性が高くなく、アドレスは255バイトまでです.
4、POST要求、パラメータをbodyに入れる.POST要求操作は比較的複雑で、パラメータとアドレスを分ける必要があるが、安全性が高く、パラメータをbodyの中に置くと、キャプチャされにくい.[html]view plain copy GETは比較的簡単なリクエスト方式であり、URLには送信するすべてのパラメータが直接含まれている.POSTは主にサーバにデータをアップロードするために使われていることを理解することができ、簡単なのは文字をアップロードすることであり、複雑なのは画像音声をアップロードすることなどである.では、このようなニーズに対してGETを使うと、このURLが長すぎるのは明らかです.したがって、POST方式が存在し、基本的なURLの場合、アップロードするデータを含むパケットを添付し、URLとともにサーバに送信することができる.POSTメソッドには2つのフォーマットがあり,1つは基本的なフォーマットであり,文字情報の送信に一般的に用いられる.Postリクエストの基本フォーマットは、POST/login.asp HTTP/1.1 Host:www.example.com Content-Type:アプリケーション/x-www-form-urlencoded Content-Length:35 username=wantsoft&password=password//postのデータのもう1つはmultipart/form-dataで、フォーマットはPOST/upload_file/UploadFile HTTP/1.1 Accept: text/plain,/ Accept-Language: zh-cn Host: www.example.com Content-Type:multipart/form-data;boundary=—————————7d33a816d302b6 User-Agent: Mozilla/4.0 (compatible; OpenOffice.org) Content-Length: 424 Connection: Keep-Alive —————————–7d33a816d302b6 Content-Disposition:form-data; name=”userfile”; filename=”userfile” Content-Type: application/octet-stream abbXXXccc —————————–7d33a816d302b6 Content-Disposition: form-data; name=”text1” foo —————————–7d33a816d302b6 Content-Disposition: form-data; name="password 1"bar———————————7 d 33 a 816 d 302 b 6–複雑に見えますが、実は要求データを境界線であるBoundaryで区切ることで、冒頭の内容については、デフォルトであることが多く、考慮する必要はありません.[html] view plain copy - (void)sendPostTwo:(NSString *)urlString {
//
// 1. Content-type: multipart/form-data, boundary=AaB03x;
// 2. --boundary
//
// 3. Content-disposition
// 4 body
// 5. --boundary--
//
NSString *head = @"Content-type: multipart/form-data, boundary=AaB03x
";
NSString *boundary = @"AaB03x";
NSString *headBoundary = [NSString stringWithFormat:@"--%@",boundary];
NSString *endBoundary = [NSString stringWithFormat:@"--%@--",boundary];
//
NSString *contentString = @"content-disposition: form-data; name=\"pic\"; filename=\"star_pressed.png\"Content-Type: image/png
";
//
NSURL *url = [NSURL URLWithString:urlString];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
[request setHTTPMethod:@"POST"];
// body
NSData *fileData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"star_pressed.png" ofType:nil]];
//
NSMutableData *data = [NSMutableData data];
// = + + + body +
[data appendData:[head dataUsingEncoding:NSUTF8StringEncoding]];
//{ [data appendData:[headBoundary dataUsingEncoding:NSUTF8StringEncoding]];
[data appendData:[contentString dataUsingEncoding:NSUTF8StringEncoding]];
[data appendData:fileData];
//}//複数のデータを要求する場合、カッコの3つはつなぎ合わせる必要がありますが、headとendBoundaryは先頭と最後に追加して要求体に設定するだけです.//ただし、要求データ型の設定を忘れないでくださいね.//一般文字はapplication/x-www/form-urlencodedピクチャなどです...multipart/form-data、実は简単ではありません....//そうだ、スペースと改行にも気をつけて、使う时にフォーマットを见てみましょう!!!
[data appendData:[endBoundary dataUsingEncoding:NSUTF8StringEncoding]];
//
[request setHTTPBody:data];
// ,01 -
[request setValue:[NSString stringWithFormat:@"%lu",(unsigned long)data.length] forHTTPHeaderField:@"Content-Length"];
// 02 -
[request addValue:@"multipart/form-data" forHTTPHeaderField:@"Content-Type"];
// 4. ,
_urlConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
//
// Content-type: multipart/form-data, boundary=AaB03x
//
// --AaB03x
// content-disposition: form-data; name="field1"
//
// Hello Boris!
// --AaB03x
// content-disposition: form-data; name="pic"; filename="boris.png"
// Content-Type: image/png
//
// ... contents of boris.png ...
// --AaB03x--
////
// http post multipart/form-data( )。
// boundary=AaB03x AaB03x 。 --AaB03x
//
// content-disposition: form-data; name="field1"
//
// Hello Boris!
//
// , field1 , Hello Boris!
// form
// 。
//
// , , --AaB03x--
//
// ,
//
// content-disposition: form-data; name="pic"; filename="boris.png"
// Content-Type: image/png
//
// ... contents of boris.png ...
// --AaB03x--
//
// pic, , file name:filename="boris.png"
// :Content-Type: image/png
//
//
// ... contents of boris.png ... boris.png , <89504e47 0d0a1a0a 0000000d 49484452 000000b4 000000b4 08020000 00b2af91 65000020 00494441 5478012c dd79b724 6b7616f6 8c888c88 8c9c8733 55ddb1d5 6a0db486 06218401 ......
//
// http post , , -- :--AaB03x--
//
// , http , , 。
}
[html] view plain copy - (void)sendPostOne:(NSString *)urlString {
// 1. url
NSURL *url = [NSURL URLWithString:urlString];
// 2.
NSMutableURLRequest *mulRequest = [NSMutableURLRequest requestWithURL:url];
// 2.5 POST
[mulRequest setHTTPMethod:@"POST"];
// post get , , get url
NSString *postStr = @"username=Charles&password=yaoxin&message=helloworld";
//
NSData *postData = [postStr dataUsingEncoding:NSUTF8StringEncoding];
// 3.
//
[mulRequest setHTTPBody:postData];
// ,01 -
[mulRequest setValue:[NSString stringWithFormat:@"%lu",postData.length] forHTTPHeaderField:@"Content-Length"];
// 02 -
[mulRequest addValue:@"application/x-www/form-urlencoded" forHTTPHeaderField:@"Content-Type"];
// 4. ,
_urlConnection = [[NSURLConnection alloc] initWithRequest:mulRequest delegate:self];
}