网络处理2-异步POST请求和同步请求

上一讲介绍了iOS中的异步GET请求,这讲来看看异步POST请求。

一、异步POST请求

假如请求路径是http://192.168.1.102:8080/MJServer/login,请求参数有2个:

  • username :母鸡
  • pwd :123

1.POST请求细节分析

要想在iOS中发送一个POST请求,首先要了解POST请求的一些细节:

1> 跟GET请求不一样的是,POST请求的请求参数不是拼接在请求路径后面,而是以请求体的形式发送到服务器端。

2> POST请求需要发送两部分的数据到服务器端:

* 请求体内容:所有的请求参数

username=%E6%AF%8D%E9%B8%A1&pwd=123

中文参数需要进行编码,参数"母鸡"被编码成"%E6%AF%8D%E9%B8%A1"

 

* 请求头信息:请求体长度、请求数据的类型

(这是我在FireBug中模拟POST请求的截图)

Content-Length是指请求体长度,Content-Type是指请求数据类型

 

2.POST请求代码实现

 1 // 请求地址
 2 NSString *urlString = @"http://192.168.1.102:8080/MJServer/login";
 3 // 初始化一个NSURL对象
 4 NSURL *url = [NSURL URLWithString:urlString];
 5 
 6 // 初始化一个请求
 7 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
 8 // 设置请求方法
 9 request.HTTPMethod = @"POST";
10 // 60秒请求超时
11 request.timeoutInterval = 60;
12 
13 // 拼接请求参数
14 NSString *params = @"username=母鸡&pwd=123";
15 // 对字符串进行编码后转成NSData对象
16 NSData *data = [params dataUsingEncoding:NSUTF8StringEncoding];
17 // 设置请求体
18 request.HTTPBody = data;
19 
20 // 设置请求头信息-请求体长度
21 NSString *contentLength = [NSString stringWithFormat:@"%i", data.length];
22 [request setValue:contentLength forHTTPHeaderField:@"Content-Length"];
23 // 设置请求头信息-请求数据类型
24 [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
25 
26 // 初始化一个连接
27 NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self];
28 // 开始一个异步请求
29 [conn start];

1> 在18行设置了请求体内容

2> 从第21~24行设置了请求头信息

3> 其实,第21~24行代码可以省略。只要我们在第18行设置了请求体,系统在发送POST请求时,会自动根据请求体内容加上相应的请求头信息

 

二、NSURLConnection的其他请求方法

除了start方法,NSURLConnection还提供了2个静态方法帮助我们发送HTTP请求

1.异步请求

 1 // 请求地址
 2 NSString *urlString = @"http://192.168.1.102:8080/MJServer/login?username=123&pwd=123";
 3 // 初始化一个NSURL对象
 4 NSURL *url = [NSURL URLWithString:urlString];
 5 
 6 // 初始化一个请求
 7 NSURLRequest *request = [NSURLRequest requestWithURL:url];
 8 
 9 // 初始化一个操作队列
10 NSOperationQueue *queue = [[[NSOperationQueue alloc] init] autorelease];
11 // 发送一个异步请求
12 [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:
13 ^(NSURLResponse *response, NSData *data, NSError *error) {
14     // 解析成字符串数据
15     NSString *str = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];
16     NSLog(@"%@", str);
17 }];

在12行调用sendAsynchronousRequest:queue:completionHandler:方法发送一个异步HTTP请求,这个方法接收3个参数

* 第1个参数是一个NSURLRequest对象,封装的是一个GET请求

* 第3个参数是一个Block,当服务器成功返回数据时会回调这个Block,Block中的NSData *data参数就是服务器返回的数据

* 第2个参数是一个操作队列NSOperationQueue,当服务器成功返回数据时,系统会将第3个参数中传入的Block放到这个操作队列中执行

 

2.同步请求

前面说的都是异步请求,也是比较推荐的请求方式。NSURLConnection也提供了一个静态方法可以发送一个同步请求。

 1 // 请求地址
 2 NSString *urlString = @"http://192.168.1.102:8080/MJServer/login?username=123&pwd=123";
 3 // 初始化一个NSURL对象
 4 NSURL *url = [NSURL URLWithString:urlString];
 5 
 6 // 初始化一个请求
 7 NSURLRequest *request = [NSURLRequest requestWithURL:url];
 8 
 9 // 发送一个同步请求
10 NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
11 
12 // 解析成字符串数据
13 NSString *str = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];
14 NSLog(@"%@", str);

在第10行调用了sendSynchronousRequest:returningResponse:error:方法发送了一个同步请求,这是一个阻塞式的方法,也就是等服务器返回所有数据后,这个方法才会返回,返回值是一个NSData对象,存放着服务器返回的所有数据

转载于:https://my.oschina.net/kmodel/blog/619365

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: VB中的POST请求可以分为同步和异步两种方式。 同步请求同步请求指的是在发送请求后,直到获取到服务器返回的响应后才会继续执行后面的代码。在VB中,我们可以使用HttpWebRequest类来发送同步POST请求。具体步骤如下: 1. 创建HttpWebRequest对象:使用HttpWebRequest的Create方法创建一个HttpWebRequest对象。 2. 设置请求方法和URL:通过修改HttpWebRequest的Method属性为"POST",并设置请求URL。 3. 设置请求参数:可以通过修改HttpWebRequest的ContentLength属性来指定请求参数的长度,并通过GetRequestStream方法获取请求流,将请求参数写入到请求体中。 4. 发送请求并获取响应:使用HttpWebRequest的GetResponse方法发送请求,并使用GetResponseStream方法获取响应流。 5. 解析响应结果:根据响应流的内容进行相应的操作。 异步请求:异步请求指的是发送请求后,不会阻塞代码的执行,而是继续执行后面的代码。在VB中,我们可以使用HttpClient类来发送异步POST请求。具体步骤如下: 1. 创建HttpClient对象:使用New关键字创建一个HttpClient对象。 2. 设置请求参数:可以使用HttpContent类的派生类来设置请求参数,比如StringContent、ByteArrayContent等。 3. 发送请求并获取响应:使用HttpClient的PostAsync或Post方法发送异步POST请求,获取一个表示响应的Task对象。 4. 处理响应结果:可以通过Task对象的Result属性来获取响应结果。 通过上述介绍,我们可以发现同步请求是在等待服务器响应时阻塞代码执行,而异步请求是在发送请求后继续执行后续代码,不会阻塞。在实际应用中,我们可以根据需求选择适合的请求方式。 ### 回答2: 在VB中,POST请求可以通过以下两种方式进行处理同步和异步。 同步请求是指当发送POST请求后,程序会一直等待服务器响应并处理完毕后才会继续执行后续代码。这种方式适用于对请求的响应时间要求不高的情况,可以让程序按照一定的顺序执行。 在VB中使用同步方式发送POST请求,可以通过创建一个`WebRequest`对象,设置请求的URL和方法为POST,然后通过`GetResponse`方法发送请求并等待响应。接收到响应后,可以通过`ResponseStream`读取响应的数据并进行处理。 异步请求是指发送POST请求后,程序不会阻塞等待响应,而是继续执行后续代码。这种方式适用于对请求的响应时间要求较高或需要同时发送多个请求的情况,可以提高程序的性能和并发处理能力。 在VB中使用异步方式发送POST请求,可以通过创建一个`WebRequest`对象,设置请求的URL和方法为POST,然后通过`BeginGetResponse`方法发送请求并立即返回。之后可以注册一个回调函数,在响应返回后被调用,通过`EndGetResponse`获取响应并进行处理。 需要注意的是,在使用异步方式发送POST请求时,需要考虑线程安全和同步问题,适当使用锁、事件等机制来确保代码的正确执行。 无论是同步还是异步方式,都可以在发送POST请求时,通过设置请求的参数、请求头信息等来灵活地满足不同的需求,并根据响应的内容进行适当的处理。 ### 回答3: 在VB中,POST请求可以同步或异步执行。 同步POST请求是指请求发出后,程序会一直等待服务器返回响应后再继续执行后续代码。通常使用`WebClient`类来执行同步POST请求。可以使用`UploadString`或`UploadData`方法来发送POST请求,并且会返回服务器响应的字符串或字节数组。 以下是一个使用`WebClient`类发送同步POST请求的示例代码: ```vb Imports System.Net Imports System.Text Public Class Program Public Shared Sub Main() Dim url As String = "http://example.com/api" Dim client As New WebClient() ' 设置POST请求的参数 Dim postData As String = "param1=value1&param2=value2" Dim postDataBytes As Byte() = Encoding.UTF8.GetBytes(postData) ' 设置请求头 client.Headers(HttpRequestHeader.ContentType) = "application/x-www-form-urlencoded" ' 发送POST请求并获取服务器响应 Dim response As String = Encoding.UTF8.GetString(client.UploadData(url, "POST", postDataBytes)) Console.WriteLine(response) End Sub End Class ``` 异步POST请求是指请求发出后,程序不会阻塞等待服务器响应,而是继续执行后续代码。通常使用`HttpClient`类来执行异步POST请求。可以使用`PostAsync`方法来发送POST请求,并通过`await`关键字来异步等待服务器响应。 以下是一个使用`HttpClient`类发送异步POST请求的示例代码: ```vb Imports System.Net.Http Imports System.Threading.Tasks Public Class Program Public Shared Async Function Main() As Task Dim url As String = "http://example.com/api" Dim client As New HttpClient ' 设置POST请求的参数 Dim postData As String = "param1=value1&param2=value2" Dim content As New StringContent(postData) ' 设置请求头 content.Headers.ContentType = New Headers.MediaTypeHeaderValue("application/x-www-form-urlencoded") ' 发送POST请求并获取服务器响应 Dim response As HttpResponseMessage = Await client.PostAsync(url, content) Dim responseBody As String = Await response.Content.ReadAsStringAsync() Console.WriteLine(responseBody) End Sub End Class ``` 通过使用VB中的同步或异步POST请求,我们可以根据需求选择合适的方式来处理网络请求并获取服务器响应。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值