[iOS]网络编程专题:发送Http请求(POST GET)的方法

首先说说一下http请求

http请求最长用的方法是get和post方法

get方法和post方法相比理解起来比较简单,get方法可以直接请求一个url,也可以url后面拼接上参数作为一个新的url地址进行请求。form的enctype属性默认为application/x-www-form-urlencoded。不能发送二进制文件。

post方法相对要复杂一些。首先post方法要设置key和value,所有的key和value都会拼接成key1=value1&key2=value2的样式的字符串,然后这个字符串转化为二进制放到http请求的body中。当请求发送的时候,也就跟随body一起传给服务器。http请求求Content-Type设置为:application/x-www-form-urlencoded。这里讲的只是简单的post请求,一般发送文件不会选择这种方式(从技术方面考虑也可以发送文件,就是把文件以ke和value的方式放入)。下面我们再讨论一下post发送二进制文件更加普遍的方法。

post发送文件首先网页中的form的enctype设置为multipart/form-data,然后浏览器会把表单中需要提交的项目分隔,并为每个部分加上Content-Disposition(form-data或者file),Content-Type(默认为text/plain),name(控件name)等信息,并加上分割符(boundary)。

如果有以下form,并选择了file1.txt上传

//作者:禚来强电话:XXXXXXemail:[email protected]

//原问地址:http://blog.csdn.net/diyagoanyhacker/article/details/6685398

<formaction="http://server.com/cgi/handle"

enctype="multipart/form-data"

method="post">

<inputtype="text"name="submit-name"value="chmod777"><br/>

Whatfilesareyousending?<inputtype="file"name="files"><br/>

</form>

则有如下body:

Content-Type:multipart/form-data;boundary=AaB03x

--AaB03x

Content-Disposition:form-data;name="submit-name"

chmod777

--AaB03x

Content-Disposition:form-data;name="files";filename="file1.txt"

Content-Type:text/plain

...contentsoffile1.txt...

--AaB03x--

以上重点讲解的post请求的两种方式。如果还是不明白可以和我一起讨论。

发送Http请求(POSTGET)的方法

我们知道Http有Get和Post两种方法,我们分开说吧.

另注:今天讲的方法是同步的请求,异步的方法我还没试过,不知道有没有使用异步的需求,有的话于发上来和大家分享.

1.Get方法

1.1使用NSMutableURLRequest

viewplaincopytoclipboardprint?

NSURL*url=[NSURLURLWithString:@"http://aminby.net"];

NSMutableURLRequest*request=[NSMutableURLRequestnew];

[requestsetURL:url];

[requestsetHTTPMethod:@"GET"];

NSHTTPURLRequest*response;

NSData*data=[NSURLConnectionsendSynchronousRequest:request

returningResponse:&responseerror:nil];

[NSString*strRet=[[NSStringalloc]initWithData:dataencoding:NSUTF8String];

NSLog(strRet);

[strRetrelease];

NSURL*url=[NSURLURLWithString:@"http://aminby.net"];

NSMutableURLRequest*request=[NSMutableURLRequestnew];

[requestsetURL:url];

[requestsetHTTPMethod:@"GET"];

NSHTTPURLRequest*response;

NSData*data=[NSURLConnectionsendSynchronousRequest:request

returningResponse:&responseerror:nil];

[NSString*strRet=[[NSStringalloc]initWithData:dataencoding:NSUTF8String];

NSLog(strRet);

[strRetrelease];

1.2使用NSString

viewplaincopytoclipboardprint?

/options有两个枚举,NSMappedRead这个不懂,NSUncachedRead是不缓存

[NSDatadataWithContentsOfURL:(NSURL*)url

options:(NSUInteger)readOptionsMask

error:(NSError**)errorPtr]

//或者

[NSDatadataWithContentsOfURL:(NSURL*)url];

/options有两个枚举,NSMappedRead这个不懂,NSUncachedRead是不缓存

[NSDatadataWithContentsOfURL:(NSURL*)url

options:(NSUInteger)readOptionsMask

error:(NSError**)errorPtr]

//或者

[NSDatadataWithContentsOfURL:(NSURL*)url];

1.2和1.3的方法是缺点是没办法知道response的status,一般是返回200-299之间的数值代表请求成功.我们可以依照这个code来做数据处理,如果对地址存在很有把握,就可以使用后两种简单的GET方法.

今天查了一下手册,发现NSArrayNSDictionary也有xxxxWithContentsOfURL的方法,这两个我还没用过,应该是跟NSData和NSString一样,但具体怎么用我还不清楚.

2.Post方法

2.1使用NSMutableURLRequest

viewplaincopytoclipboardprint?

NSURL*url=[NSURLURLWithString:@"http://aminby.net"];

NSMutableURLRequest*request=[NSMutableURLRequestnew];

[requestsetURL:url];

[requestsetHTTPMethod:@"GET"];

[requestaddValue:@"application/json"forHTTPHeaderField:@"Content-Type"];

[requestsetHTTPBody:@"someparam"];

NSHTTPURLRequest*response;

NSData*data=[NSURLConnectionsendSynchronousRequest:request

returningResponse:&responseerror:nil];

[NSString*strRet=[[NSStringalloc]initWithData:dataencoding:NSUTF8String];

NSLog(strRet);

[strRetrelease];

相关推荐