文章标题

本文详细介绍了JS网络请求的实现方式,包括单例模式的运用、网络状态判断、API请求封装及JSON/XML数据解析等核心内容。通过实例演示了如何在JS环境下发起网络请求并处理响应数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import “JSNetWork.h”

//asiHttpRequest

import “ASIFormDataRequest.h”

//xml 的解析

import “UseXmlParser.h”

//判断是否联网

import “Reachability.h”

//sbJson,判断json的解析

import “JSON.h”

@implementation JSNetWork

//创建一个单例
+(JSNetWork*)shareNetWork{
static JSNetWork *network = NULL;

static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    network = [[self alloc] init];
});
return network;

}

-(NSString*)JiangSuApiCacheFileName:(NSString*)fileName{

NSString * cacheFolder = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
cacheFolder = [cacheFolder stringByAppendingPathComponent:@"JiangSu"];

NSFileManager * fmgr = [NSFileManager defaultManager];
if (![fmgr fileExistsAtPath:cacheFolder])
{
    NSError * error;
    [fmgr createDirectoryAtPath:cacheFolder withIntermediateDirectories:YES attributes:nil error:&error];
}
cacheFolder = [cacheFolder stringByAppendingPathComponent:fileName];
return cacheFolder;

}

-(NSDictionary*)getURLFromPlistWithKey:(NSString*)plKey{
NSString *path = [[NSBundle mainBundle] pathForResource:@”JiangSuURL” ofType:@”plist”];
NSDictionary *urlDic = [NSDictionary dictionaryWithContentsOfFile:path];
return ASDynamicCast(NSDictionary, [urlDic valueForKey:plKey]);
}
//网络请求方式–因为是单例所有传递的值要不同 必须加connectId
-(void)JSNetWorkWith:(int)connectID Body:(NSString*)bodyString PostBody:(NSString*)postBody Delegate:(id)aDelegate{

//判断是否联网
if (![self isConnectNetWork]) {
UIAlertView *myalert = [[UIAlertView alloc] initWithTitle:nil message:@”请连接网络后再使用” delegate:self cancelButtonTitle:@”确定” otherButtonTitles:nil];
myalert.tag = 0x9999;
[myalert show];
[myalert release];
if (aDelegate && [aDelegate respondsToSelector:@selector(NetWorkBackConnectID:BackString:WithNetState:)]) {
[aDelegate NetWorkBackConnectID:connectID BackString:nil WithNetState:0];
}

    return;  
}

if ([bodyString hasPrefix:@"http"] == NO) {
    bodyString = [NSString stringWithFormat:@"%@/%@",HTTPURLPREFIX,bodyString];        
}

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:bodyString]];
[request setDelegate:self];
request.timeOutSeconds = 20;
[request setRequestMethod:@"POST"];
[request addRequestHeader:@"Content-Type" value:@"application/xml;charset=UTF-8;"];

NSArray *aa = [postBody componentsSeparatedByString:@"&"];
for (NSString *str in aa) {
    NSArray *bb = [str componentsSeparatedByString:@"="];
    [request setPostValue:[bb objectAtIndex:1] forKey:[bb objectAtIndex:0]];
}

//传递参数
[request setUserInfo:[NSDictionary dictionaryWithObjectsAndKeys:[NSString stringWithFormat:@"%d",connectID],@"tag",aDelegate,@"target", nil]];

[request startAsynchronous];

}

//请求成功
- (void)requestFinished:(ASIHTTPRequest *)request{

NSDictionary *userInfo = [request userInfo];
id delegate = [userInfo objectForKey:@"target"];
int conTag = [[userInfo objectForKey:@"tag"] intValue];
NSLog(@"\n成功  地址:%@  \n ConnectId = %d   结果 = %@",[[request url] absoluteString],conTag,[request responseString]);

NSString *responseString = [request responseString];

// if ([responseString hasPrefix:@”

pragma unused(delegate)

int conTag = [[userInfo objectForKey:@"tag"] intValue];
NSLog(@"\n失败  地址:%@  \n ConnectId = %d   结果 = %@",[[request url] absoluteString],conTag,[request responseString]);

if (delegate && [delegate respondsToSelector:@selector(NetWorkBackConnectID:BackDic:WithNetState:)]) {
    [delegate NetWorkBackConnectID:conTag BackDic:nil WithNetState:0];
}
if (delegate && [delegate respondsToSelector:@selector(NetWorkBackConnectID:BackString:WithNetState:)]) {
    [delegate NetWorkBackConnectID:conTag BackString:@"" WithNetState:0];
}
UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"" message:@"数据请求失败" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
[av show];
[av release];

}

// 判断是否联网
-(BOOL)isConnectNetWork{
BOOL isExistenceNetwork = YES;
Reachability *r = [Reachability reachabilityWithHostName:@”www.baidu.com”];
switch ([r currentReachabilityStatus]) {
case NotReachable:
isExistenceNetwork=NO;
NSLog(@”没有网络”);
break;
case ReachableViaWWAN:
isExistenceNetwork=YES;
NSLog(@”正在使用3G网络”);
break;
case ReachableViaWiFi:
isExistenceNetwork=YES;
NSLog(@”正在使用wifi网络”);
break;
}
return isExistenceNetwork;
}
//弹出WiFi
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
if (alertView.tag == 0x9999) {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@”prefs:root=WIFI”]];
// exit(0);
}
}
@end
复制代码

复制代码

pragma mark -请求信息

-(void)RentNewsRequest{
NSString *ss = [NSString stringWithFormat:@”szzssw/taxCommon.action?code=1001&pagecode=%d&menucode=0300000000”,NewsView.pageCode == 0 ? 1 : NewsView.pageCode];
[[JSNetWork shareNetWork] JSNetWorkWith:100 Body:ss PostBody:nil Delegate:self];
//先充缓存里面去读取
NSString *cachestr=[self readApiCacheFileName:@”地税新闻列表.txt”];
//只是对上拉信息,读取缓存
if(cachestr.length>0 &&NewsView.pageCode==1){
[self NetWorkBackConnectID:100 BackString:cachestr WithNetState:0];
}
}

pragma mark -数据完成信息

  • (void)NetWorkBackConnectID:(int)connectID BackString:(NSString *)aBackString WithNetState:(int)netState{
    NewsView.aTable.pullTableIsRefreshing=YES;
    NewsView.aTable.pullTableIsLoadingMore=YES;
    NewsView.aTable.pullTableIsRefreshing=NO;
    NewsView.aTable.pullTableIsLoadingMore=NO;
    if(connectID==100){

    NSDictionary *jsonDic=ASDynamicCast(NSDictionary, [aBackString JSONValue]);
    //根据请求的内容判断请求是否成功
    if (![[jsonDic getStringByKey:@"dealcode"] isEqualToString:@"0000"]) {
        NSLog(@"请求失败-->%@",[jsonDic getStringByKey:@"dealmsg"]);
        return;
    }
    
    //如果是上拉,进行缓存
    

    if (NewsView.pageCode==1) {
    [self saveApiCacheFileName:@”地税新闻列表.txt” textContent:aBackString Append:NO];
    }
    if (NewsView.dataArray.count>0 &&NewsView.pageCode==1) {
    [NewsView.dataArray removeAllObjects];//向下拉只显示20条,下拉只显示就叠加
    }

    NSArray *contentArray=ASDynamicCast(NSDictionary, [aBackString JSONValue])[@”content”];
    [NewsView.dataArray addObjectsFromArray:contentArray];
    [NewsView.aTable reloadData];

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值