发送同步请求模块

简介: 发送同步请求模块

同步加载有两种,一个是直接加载方式,另一个是发送标准同步请求后生成页面的方式。

直接方式的实现是requestWithURL:url,这种方案基本上已经很少有人用了。它可以向服务器发送普通请求,也可以向服务器下载图片。现在一般只有部分人用它下载图片。

发送标准同步请求的方式就是通过sendSynchronousRequest这个函数实现。

咱们的这个标准同步请求模块是通过代理来实现,就只贴代码,步贴使用方法了。

chttpSendSynchronousRequest.h文件

#import <Foundation/Foundation.h>

@interface chttpSendSynchronousRequest : NSObject

- (void)sendHttpRequest:(NSString*)sendString : (NSInteger *)resultCode : (NSString **)recvData;
@end

chttpSendSynchronousRequest.m文件

- (void)sendHttpRequest:(NSString*)sendString : (NSInteger *)resultCode : (NSString **)recvData
{

    if(nil == serverUrl) //|| (nil == sendString))
    {
        *resultCode = -1;
        recvData = nil;        
        return;
    }

    NSURL *serverNUSUrl = [NSURL URLWithString:serverUrl];

    NSLog(@"%@", sendString);

    NSError *error = nil;
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:serverNUSUrl
                                                           cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:60];

    [request setHTTPMethod:@"POST"];

    [request setValue:@"text.html" forHTTPHeaderField:@"Content-Type"];
    NSString * sendData = sendString;
    NSData *postData = [sendData dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];

    NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"];

    NSInputStream *is = [NSInputStream inputStreamWithData:postData];
    [request setHTTPBodyStream:is];


    NSData *nsRecvData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&error];

    if(nil != error)
    {
        *resultCode = -1;
        recvData = nil;
        return;
    }

    NSString * recvStrData = [[NSString alloc] initWithData:nsRecvData encoding:NSUTF8StringEncoding];

    if(nil == recvStrData)
    {
        *resultCode = -1;
        recvData = nil;
        return;
    }
    NSLog(@"recvStrData[%@]",recvStrData);
    *recvData = recvStrData;
    *resultCode = 0;
    return;
}
@end

通过requestWithURL:url实现直接同步加载图像代码示例:

- (void)loadImageFromURL:(NSURL*)url {
    NSURLRequest* request = [NSURLRequest requestWithURL:url
                                             cachePolicy:NSURLRequestUseProtocolCachePolicy
                                         timeoutInterval:10.0];
    [_data setLength:0];
    _connection = [[NSURLConnection alloc]
                  initWithRequest:request delegate:self];
}

- (void)connection:(NSURLConnection *)theConnection
    didReceiveData:(NSData *)incrementalData {
    NSData * da = [[NSData alloc] initWithData:incrementalData];
    [_data appendData:da];

    LogInfo(@"succeeded  %d byte received", [_data length]);
    NSString* fileName2 = [self filePath:@"image23.jpg"];
    [da writeToFile:fileName2 atomically:YES];
}


- (void)connection:(NSURLConnection *)theConnection didFailWithError:(NSError *)error{
    // 当请求失败时的相关操作;
    [_data setLength:0];
}

- (void)connectionDidFinishLoading:(NSURLConnection*)theConnection {
    LogInfo(@"succeeded  %d byte received", [_data length]);
}
目录
相关文章
|
缓存 JavaScript 前端开发
【axios】二次封装——避免重复发送请求
【axios】二次封装——避免重复发送请求
572 0
【axios】二次封装——避免重复发送请求
|
10月前
自己实现异步发送请求和图片
自己实现异步发送请求和图片
50 0
|
10月前
|
前端开发 网络协议 JavaScript
如何在前端实现WebSocket发送和接收TCP消息(多线程模式)
请确保在你的服务器端实现WebSocket的处理,以便它可以接受和响应前端发送的消息。同时,考虑处理错误情况和关闭连接的情况以提高可靠性。
631 0
|
10月前
Socket网络编程练习题二:客户端发送一条数据,接收服务端反馈的消息并打印;服务端接收数据并打印,再给客户端反馈消息
Socket网络编程练习题二:客户端发送一条数据,接收服务端反馈的消息并打印;服务端接收数据并打印,再给客户端反馈消息
|
Linux
设置socket接收和发送超时的一种方式
设置socket接收和发送超时的一种方式
746 0
|
应用服务中间件 测试技术 网络安全
服务器收不到支付宝notify_url异步回调请求的问题排查
服务器收不到支付宝notify_url异步回调请求的问题排查
307 0
axios发送请求几种方式
axios发送请求几种方式
237 0
|
数据挖掘 Java
封装,分用、客户端服务器以及请求响应
封装,分用、客户端服务器以及请求响应
131 0
封装,分用、客户端服务器以及请求响应
|
移动开发 网络协议 测试技术
服务器循环接收客户端消息|学习笔记
快速学习服务器循环接收客户端消息
服务器循环接收客户端消息|学习笔记