美文网首页
传送对象到服务器

传送对象到服务器

作者: WARRON | 来源:发表于2016-10-15 13:27 被阅读57次

.h 文件中

h文件.png

代码如下

import <Foundation/Foundation.h>

@interface LBNetWorkManager : NSObject

+(LBNetWorkManager *)netManager;

-(void)Post:(NSString *)urlStr obj:(id)obj Success:(void (^)(id result))success Fault:(void (^)(id result))fault;

@end

这个够简单了吧
再来.m文件中


m文件1.png m文件2.png m文件3.png m文件4.png m文件5.png m文件6.png

代码如下

import "LBNetWorkManager.h"

import<objc/runtime.h>

//定义成功的回调,接收传过来的block,在下载数据成功后回调到调用查询数据的地方
typedef void (^Success)(id result);
typedef void (^Fault) (id result);

@interface LBNetWorkManager()

//接收数据
@property (nonatomic,strong)NSMutableData * receiveData;

//使用copy是将block从栈转移到堆, 避免内存释放是栈上的被释放,如果那样子, 在调用处是无论如何都不能接收到返回数据
@property (nonatomic,copy)Success success;

@property (nonatomic,copy)Fault fault;

@end

@implementation LBNetWorkManager

+(LBNetWorkManager *)netManager{
//类方法创建对象, 最好每个请求都创建一个对象,这样子不会导致异步时的不确定性
LBNetWorkManager *netManager = [[LBNetWorkManager alloc]init];
return netManager;
}

pragma mark urlStr直接传入拼接的字符串 obj必须是传入一个对象

-(void)Post:(NSString *)urlStr obj:(id)obj Success:(void (^)(id result))success Fault:(void (^)(id result))fault{

//成功的回调,_suceess 的指针指向success,以后调用_success 就是调用success,下同
_success  = success;

//失败的回调
_fault  = fault;

//构建为请求url
NSURL * url = [NSURL URLWithString:urlStr];

//获取json格式的data
NSData *data = [self getJSON:obj];

//设置请求
NSMutableURLRequest *request = [[NSMutableURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];
//请求方式
[request setHTTPMethod:@"POST"];

//请求内容格式
[request addValue:@"application/json" forHTTPHeaderField:@"Content-Type"];

//请求体
[request setHTTPBody:data];

//开始连接
NSURLConnection * connection  = [[NSURLConnection alloc]initWithRequest:request delegate:self];

}

//当连接通了之后再做初始化

  • (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{

    //请求的返回信息
    NSHTTPURLResponse *res = (NSHTTPURLResponse *)response;

    NSLog(@"%@",[res allHeaderFields]);

    self.receiveData = [NSMutableData data];
    }

//接收到服务器传输数据的时候调用,此方法根据数据大小执行若干次
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{

//信息是一个一个的来的 所以就需要将返回的信息追加到数据后面
[self.receiveData appendData:data];

}

//数据传完之后调用此方法
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{

 //将得到的信息转为字典
NSDictionary * dictAnalysis= [self receiveDataChangeTouchDictionary];
//在这里返回数据到调用处
_success(dictAnalysis);

}
//请求成功后,将返回的数据转换为字典

  • (NSDictionary *)receiveDataChangeTouchDictionary{
    //判断是否为空,为空则不转
    if (!_receiveData) {
    return nil;
    }
    NSError *error;
    //转为字典
    NSDictionary *dictAnalysis = [NSJSONSerialization JSONObjectWithData:self.receiveData options:NSJSONReadingMutableContainers error:&error];
    if(error) {
    NSLog(@"json解析失败:%@",error);
    return nil;
    }
    return dictAnalysis;
    }

//网络请求过程中,出现任何错误(断网,连接超时等)会进入此方法

-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{

//返回错误信息,
_fault(error);

}

//获取json格式的数据
-(NSData*)getJSON:(id)obj{

return [self getJSON:obj options:NSJSONWritingPrettyPrinted error:nil];

}
-(NSData)getJSON:(id)obj options:(NSJSONWritingOptions)options error:(NSError*)error{

return [NSJSONSerialization dataWithJSONObject:[self getObjectData:obj] options:options error:error];

}
//将对象的属性和值对应起来, 作为字典的格式
-(NSDictionary*)getObjectData:(id)obj{

NSMutableDictionary
*dic = [NSMutableDictionary dictionary];

unsigned
int propsCount;

objc_property_t *props = class_copyPropertyList([obj class], &propsCount);

for(int i = 0;i < propsCount; i++){
    
    objc_property_t prop = props[i];
    
    NSString  *propName = [NSString stringWithUTF8String:property_getName(prop)];
    
    id value = [obj valueForKey:propName];
    
    if(value == nil) {
       value = [NSNull null];
    }
    
    else {
      value = [self getObjectInternal:value];
    }
    
    [dic setObject:value forKey:propName];
}
return dic;
}

-(id)getObjectInternal:(id)obj{

if([obj isKindOfClass:[NSString class]]
   || [obj isKindOfClass:[NSNumber class]]
   || [obj isKindOfClass:[NSNull class]]){
    
    return obj;
}

if([obj  isKindOfClass:[NSArray class]]) {
    
    NSArray *objarr = obj;
    
    NSMutableArray  *arr = [NSMutableArray arrayWithCapacity:objarr.count];
    
    for(int  i = 0;i < objarr.count; i++) {
        
        [arr setObject:[self getObjectInternal:[objarr objectAtIndex:i]] atIndexedSubscript:i];
    }
    
    return arr;
}

if([obj  isKindOfClass:[NSDictionary class]]) {
    
    NSDictionary  *objdic = obj;
    
    NSMutableDictionary  *dic = [NSMutableDictionary dictionaryWithCapacity:[objdic count]];
    
    for(NSString *key in objdic.allKeys){
      [dic  setObject:[self getObjectInternal:[objdic objectForKey:key]] forKey:key];
    }
    
    return  dic;
}

return [self getObjectData:obj];

}
@end

调用的时候

调用.png
代码如下
-(void)loginAction{
NSString * userName = [self makeInputStrToBeStandard:self.fieldUserName.text];
NSString * passWord = self.fieldPassWord.text;
NSString *URLStr = [NSString stringWithFormat:@"http://121.196.227.33:1688/api/%@",@"postSearch"];
LBLoginModel * loginModel = [[LBLoginModel alloc]initWithPhoneNumber:userName password:passWord];

loginModel.text  = [[LBLoginModelText alloc]init];
 loginModel.text.PhoneNumber = @"123";
 loginModel.text.WeiboId = @"234";

self.netManager = [LBNetWorkManager netManager];
[self.netManager Post:URLStr obj:loginModel Success:^(id result) {
    
} Fault:^(id result) {
    
}];

}

相关文章

  • 传送对象到服务器

    .h 文件中 代码如下 import @interface L...

  • ssh上传文件

    1、从本地传送文件到服务器 将 /home 目录中的 a.jsp 文件从本地传送到服务器 /home 目录下 2、...

  • jsp

    jsp 九大内置对象 request 该对象代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据...

  • 学习过程中的问题

    本地向服务器传送文件

  • git将 tag push到远程

    将 tag push到远程 默认情况下,git push并不会把tag标签传送到远端服务器上。 或

  • TIME_WAIT意义

    1 : 客户端A发送一个FIN,用来关闭客户端A到服务器B的数据传送。 2 : 服务器B收到这个FIN,它发送一个...

  • ssh 无密码登陆 和 管理多个主机

    生产 ssh key 传送公钥到对端服务器上 ssh 多账号管理 创建 .ssh/config 配置文件,由此文件...

  • get和post的区别之处

    1.post是向服务器传送数据,get是向服务器接收数据; 2.get传送的数据量较小,不能超过2kb;post请...

  • Linux 实现scp传送不需要密码

    前言 由于昨天要从A服务器想B服务器传送一个200G的数据库文件,所以打算晚上进行后台自动传送,但是scp这个命令...

  • 第10章 雪山村练级1

    来到传送员旁边,这个传送员只能传送玩家到古阿村,传送费为1500龙币。 “你到古阿村后再到传送员那里,飞到雪山村,...

网友评论

      本文标题:传送对象到服务器

      本文链接:https://www.haomeiwen.com/subject/dhonyttx.html