❶ iOS开发中网络请求的代码放到哪儿比较好
一般网络请求的代码都封装到一个工具类中。MVC的话就放到model层中
❷ iOS网络请求库
这已经是老生常谈的问题了。
作为一个入门级、大众级的封装,仿佛在网上随随便便就能找到一套适用于自己的方案。在afnetworking一统天下之后(得到了苹果官方认可),基于其afnetworking的封装也越来越全面、强大。
但是,每一个开发者都想拥有属于自己的网络请求库☺,而且很多别人的封装用起来隔靴搔痒,所以我们在整理了项目内所有网络请求的痛点之后,搞了一套最适合我们自己的方案。
我们现在就用最流行的“影响地图”来解构这套框架。
由于类名有所修改,所以这个框架图可以参考来看
这套方案能为我们带来什么
相比于afnetworking,ZZCHTTPSession提供了以下功能:
适用项目
除了URL的管理稍显复杂之外,其他都尽量向轻量级,适用性靠拢。
适合中小型项目的开发使用,个人开发尤其推荐(使用链式的方式传参,完全是不想声明那么多的API啊,尽管有一部分开发试听抗拒这种方式的😂)。
支持大部分APP对URL管理、内存硬盘缓存、多个请求管理、model管理的要求。对依赖路由的APP能发挥最大优势。(完全解耦)
基本思想
ZZCURLManagement配置URL,ZZCHTTPSessionSignal配置请求,建议加一个协议层,用来管理所有的signal。
协议层使用ZZCHTTPServer的分类。
简单demo:
相关使用:
git地址:
https://github.com/lzy1010/ZZCHTTPManager
❸ IOS怎么抓取网络请求包
好吧,苹果提供了命令行监控的方法,将iPhone连接到Mac电脑的USB,输入特定命令来监听iPhone的所有网络请求。
请求的内容会写入到一个文件,读取该文件即可获取所有网络请求。
而该文件需要特定工具才能打开,用WireShark,它再次派上了用场。
——————监控网络请求的步骤—————–
1.将iPhone连接到Mac电脑
2.从Xcode或者iTunes获得iPhone的UUID,一串32位的标示,类似0B6814B3-EB2F-5B85-929D-7C5C5SS8DB64
3.命令行输入rvictl -s [你的手机UUID标示],打开Mac监听
4.命令行输入sudo tcpmp -i rv0 -n -s 0 -w mpFile.pcap tcp,开始向文件写入监控数据
结束监听时,ctrl+c关闭tcpmp进程。
关闭Mac监听,命令是 rvictl -v [你的手机UUID标示]
——————步骤结束———————–
以下是苹果官方文档
iOS Packet Tracing
iOS does not support packet tracing directly. However, if you’re developing for iOS you can take a packet trace of your app in a number of different ways:
If the problem you’re trying to debug occurs on Wi-Fi, you can put your iOS device on a test Wi-Fi network. See Wi-Fi Capture for details.
If your app uses HTTP, you can configure your iOS device to use a debugging HTTP proxy (such as Charles HTTP Proxy).
In iOS 5 and later you can use the remote virtual interface facility.
Remote Virtual Interface
iOS 5 added a remote virtual interface (RVI) facility that lets you use OS X packet trace programs to capture traces from an iOS device. The basic strategy is:
Connect your iOS device to your Mac via USB.
Set up an RVI for that device. This creates a virtual network interface on your Mac that represents the iOS device’s networking stack.
Run your OS X packet trace program, and point it at the RVI created in the previous step.
To set up an RVI, you should run the rvictl tool as shown below.
# First get the current list of interfaces.# First get the current list of interfaces. ifconfig -l
lo0 gif0 stf0 en0 en1 p2p0 fw0 ppp0 utun0
# Then run the tool with the UDID of the device.# Then run the tool with the UDID of the device. rvictl -s
Starting device [SUCCEEDED]
# Get the list of interfaces again, and you can see the new virtual# Get the list of interfaces again, and you can see the new virtual # network interface, rvi0, added by the previous command.
$ ifconfig -l
lo0 gif0 stf0 en0 en1 p2p0 fw0 ppp0 utun0 rvi0
Now that you know the name of the RVI, you can point your packet trace tool at it. For example, here’s how you might run tcpmp to take a packet trace from the RVI and write it to the file trace.pcap.
$ sudo tcpmp -i rvi0 -w trace.pcap
tcpmp: WARNING: rvi0: That device doesn’t support promiscuous mode
(BIOCPROMISC: Operation not supported on socket)
tcpmp: WARNING: rvi0: no IPv4 address assigned
tcpmp: verbose output suppressed, use -v or -vv for full protocol decode
listening on rvi0, link-type RAW (Raw IP), capture size 65535 bytes
When you’re done you can remove the RVI with the following command.
$ rvictl -x
Stopping device [SUCCEEDED]
Important: The RVI represents the entire networking stack of the iOS device; there’s no way to trace a specific interface on the device, or even learn which packets were transferred on which interface.
❹ android 网络请求数据一般写在哪
一、需要用到的场景 在jQuery中使用$.post()就可以方便的发起一个post请求,在android程序中有时也要从服务器获取一些数据,就也必须得使用post请求了。 二、需要用到的主要类 在android中使用post请求主要要用到的类是HttpPost、HttpResponse、EntityUtils 三、主要思路 1、创建HttpPost实例,设置需要请求服务器的url。 2、为创建的HttpPost实例设置参数,参数设置时使用键值对的方式用到NameValuePair类。 3、发起post请求获取返回实例HttpResponse 4、使用EntityUtils对返回值的实体进行处理(可以取得返回的字符串,也可以取得返回的byte数组) 代码也比较简单,注释也加上了,就直接贴出来了 [java] package com.justsy.url; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import org.apache.http.protocol.HTTP; import org.apache.http.util.EntityUtils; import android.app.Activity; import android.os.Bundle; public class HttpURLActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); System.out.println("start url..."); String url = "192.168.2.112:8080/JustsyApp/Applet"; // 第一步,创建HttpPost对象 HttpPost httpPost = new HttpPost(url); // 设置HTTP POST请求参数必须用NameValuePair对象 List<NameValuePair> params = new ArrayList<NameValuePair>(); params.add(new BasicNameValuePair("action", "downloadAndroidApp")); params.add(new BasicNameValuePair("packageId", "89dcb664-50a7-4bf2-aeed-49c08af6a58a")); params.add(new BasicNameValuePair("uuid", "test_ok1")); HttpResponse httpResponse = null; try { // 设置httpPost请求参数 httpPost.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8)); httpResponse = new DefaultHttpClient().execute(httpPost); //System.out.println(httpResponse.getStatusLine().getStatusCode()); if (httpResponse.getStatusLine().getStatusCode() == 200) { // 第三步,使用getEntity方法活得返回结果 String result = EntityUtils.toString(httpResponse.getEntity()); System.out.println("result:" + result); T.displayToast(HttpURLActivity.this, "result:" + result); } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } System.out.println("end url..."); setContentView(R.layout.main); } } ADD:使用HttpURLConnection 进行post请求 [java] String path = "192.168.2.115:8080/android-web-server/httpConnectServlet.do?PackageID=89dcb664-50a7-4bf2-aeed-49c08af6a58a"; URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST"); conn.setConnectTimeout(5000); System.out.println(conn.getResponseCode()); ============================================================================================================================ 通过get和post方式向服务器发送请求 首先说一下get和post的区别 get请求方式是将提交的参数拼接在url地址后面,例如/index.jsp?num=23&jjj=888; 但是这种形式对于那种比较隐私的参数是不适合的,而且参数的大小也是有限制的,一般是1K左右吧,对于上传文件 就不是很适合。 post请求方式是将参数放在消息体内将其发送到服务器,所以对大小没有限制,对于隐私的内容也比较合适。 如下Post请求 POST /LoginCheck HTTP/1.1 Accept: text/html, application/xhtml+xml, */* Referer: 192.168.2.1/login.asp Accept-Language: zh-CN User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; BOIE9;ZHCN) Content-Type: application/x-www-form-urlencoded Accept-Encoding: gzip, deflate Host: 192.168.2.1 Content-Length: 39 Connection: Keep-Alive Cache-Control: no-cache Cookie: language=en Username=admin&checkEn=0&Password=admin //参数位置 在android中用get方式向服务器提交请求: 在android模拟器中访问本机中的tomcat服务器时,注意:不能写localhost,因为模拟器是一个单独的手机系统,所以要写真是的IP地址。 否则无法访问到服务器。 //要访问的服务器地址,下面的代码是要向服务器提交用户名和密码,提交时中文先要经过URLEncoder编码,因为模拟器默认的编码格式是utf-8 //而tomcat内部默认的编码格式是ISO8859-1,所以先将参数进行编码,再向服务器提交。 private String address = "192.168.2.101:80/server/loginServlet"; public boolean get(String username, String password) throws Exception { username = URLEncoder.encode(username);// 中文数据需要经过URL编码 password = URLEncoder.encode(password); String params = "username=" + username + "&password=" + password; //将参数拼接在URl地址后面 URL url = new URL(address + "?" + params); //通过url地址打开连接 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); //设置超时时间 conn.setConnectTimeout(3000); //设置请求方式 conn.setRequestMethod("GET"); //如果返回的状态码是200,则一切Ok,连接成功。 return conn.getResponseCode() == 200; } 在android中通过post方式提交数据。 public boolean post(String username, String password) throws Exception { username = URLEncoder.encode(username);// 中文数据需要经过URL编码 password = URLEncoder.encode(password); String params = "username=" + username + "&password=" + password; byte[] data = params.getBytes(); URL url = new URL(address); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setConnectTimeout(3000); //这是请求方式为POST conn.setRequestMethod("POST"); //设置post请求必要的请求头 conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");// 请求头, 必须设置 conn.setRequestProperty("Content-Length", data.length + "");// 注意是字节长度, 不是字符长度 conn.setDoOutput(true);// 准备写出 conn.getOutputStream().write(data);// 写出数据 return conn.getResponseCode() == 200;
❺ iOS 14:为什么APP请求本地网络想要扫描本地网络追踪
随着iOS 14正式版的推送升级到新版本的用户越来越多 , 不过也有用户发现升级后系统在某些方面似乎有些变化。
比如屏幕顶部经常提示某某应用读取剪切板、音视频通话时屏幕顶部出现圆点,还有弹出本地网络访问权限许可。
本地网络访问权限指的是什么?APP是否有必要读取本地网络?用户是否需要进行授予?本文我们给大家分析下。
什么是本地网络:
本地网络其实指的就是本地局域网,比如我们的手机连接家里的路由器,通过这台路由器可以构建家庭的局域网。
iOS 14里新增的本地网络访问权限是苹果为增加隐私透明度引入的 , 实际上在此前版本这个权限可以被任意访问。
当APP调用相关接口时即可通过苹果设备访问用户所在局域网,包括扫描该局域网下的所有设备并收集相关信息。
苹果在新版本里为提高透明度要求APP添加本地网络隐私权限支持,即需要调用时必须征得用户同意后才可访问。
APP是否有必要读取本地网络:
本地网络访问权限是个非必要的权限,也就是说有些应用程序基于其实际功能确实需要调用本地网络的访问权限。
例如微软推出的远程桌面协议客户端,我们安装该客户端后可以通过局域网内的计算机IP地址连接对应的计算机。
如果不授予本地网络访问权限的话则远程桌面协议客户端无法访问对应的内网地址,导致无法连接局域网计算机。
因此微软远程桌面协议客户端访问本地网络完全合理的,因为不授予的话会造成该应用的主要功能无法正常使用。
而有些APP根本不需要与本地网络进行交互,例如电商类应用并不需要连接本地设备,那就没必要读取本地网络。
用户是否应该授予本地网络权限:
是否授予本地网络权限取决于应用是否需要使用本地网络权限,如果需要使用的话那用户则必须授予对应的权限。
例如小米米家系列控制类的APP,这些应用需要连接本地网络中的物联网设备,因此使用本地网络权限是合理的。
也就是说凡是应用因为其功能必须访问局域网里的设备那使用就是合理的,反之使用本地网络权限就是不合理的。
更简单的判断方法:任何APP请求本地网络权限直接拒绝,拒绝后若是影响其主要功能的使用那就去设置里恢复。
如果拒绝读取本地网络后并不影响APP主要功能的使用那就是不合理的调用,因此用户拒绝其读取是完全没事的。
在哪里调整本地网络权限 :转到设置的隐私里即可看到本地网络,点开后就会罗列所有请求的应用可以随时开关。
购物软件调用本地网络多半是追踪用户:
在蓝点网的实际测试中我们发现大多数应用都不会调用本地网络或者是合理调用,少部分应用则存在不合理调用。
例如电商购物类软件调用本地网络大多数都是不合理的,这些应用无需与本地网络交互也不控制连接局域网设备。
那为什么这类软件要调用本地网络呢?我们猜测这可能是用于追踪用户,通过扫描局域网设备来收集用户的信息。
扫描局域网可以获得:1、局域网设备例如路由器和其他设备IP和MAC ;2、利用这些信息生成用户身份标识符。
这些信息可以生成的标识符甚至可以跨设备、跨应用、持续性的追踪用户,并根据收集的信息对用户进行画像等。
因此我们推荐用户拒绝所有APP请求本地网络权限,除非出现工作不正常否则没必要授予、防止自己被持续追踪。
❻ iOS 网络请求有哪些方式
两种请求方式GET,POST
两种请求方式的比较
相同点:都能给服务器传输数据
不同点:
1、给服务器传输数据的方式:
GET:通过网址字符串。POST:通过data
2、传输数据的大小:GET:⽹址字符串最多255字节。POST:使用NSData,容量超过1G
3、安全性:GET:所有传输给服务器的数据,显示在网址里,类似于密码的明文输入,直接可见。
POST:数据被转成NSData(二进制数据),类似于密码的密文输⼊入,⽆无法直接读取。
连接方式
同步:使用一个线程(主线程)完成所有的工作,效率低,当线程正在执行一个任务的时候无法执行另一个任务,所有如果使用同步进行网络数据的请求,那么在该线程进行网络请求时,暂时无法响应用户的点击事件,用户体验极差
异步:再开一个线程(子线程)去完成任务,此时,主线程依然可以监听用户的点击事件,不会造成卡顿,用户体验较好
❼ ios开发怎么用定时器进行网络请求
看下是不是你需要的答案(实在搞不定,可以到我们27773技术众包平台,顾问能帮你找合适的技术牛人)?
如何通过URL获取json数据
第一种,利用AFJSONRequestOperation,官方网站上给的例子:
NSString *str=[NSString stringWithFormat:@"https://alpha-api.app.net/stream/0/posts/stream/global"];
NSURL *url = [NSURL URLWithString:[str :NSUTF8StringEncoding]];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
// 从URL获取json数据
AFJSONRequestOperation *operation1 = [AFJSONRequestOperation :requestsuccess:^(NSURLRequest *request, NSHTTPURLResponse *response, NSDictionary* JSON) {
NSLog(@"获取到的数据为:%@",JSON);
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id data) {
NSLog(@"发生错误!%@",error);
}];
[operation1 start];
第二种方法,利用AFHTTPRequestOperation 先获取到字符串形式的数据,然后转换成json格式,将NSString格式的数据转换成json数据,利用IOS5自带的json解析方法:
NSString *str=[NSString stringWithFormat:@"https://alpha-api.app.net/stream/0/posts/stream/global"];
NSURL *url = [NSURL URLWithString:[str :NSUTF8StringEncoding]];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
NSString *html = operation.responseString;
NSData* data=[html dataUsingEncoding:NSUTF8StringEncoding];
id dict=[NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
NSLog(@"获取到的数据为:%@",dict);
}failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"发生错误!%@",error);
}];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperation:operation];
如果发生Error Domain=NSURLErrorDomain Code=-1000 "bad URL" UserInfo=0x14defc80 {NSUnderlyingError=0x14deea10 "bad URL", NSLocalizedDescription=bad URL这个错误,请检查URL编码格式。有没有进行:NSUTF8StringEncoding
如何通过URL获取图片
异步获取图片,通过队列实现,而且图片会有缓存,在下次请求相同的链接时,系统会自动调用缓存,而不从网上请求数据。
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0.0f, 100.0f, 100.0f, 100.0f)]; [imageView setImageWithURL:[NSURL URLWithString:@"http://i.imgur.com/r4uwx.jpg"]placeholderImage:[UIImage imageNamed:@"placeholder-avatar"]]; [self.view addSubview:imageView];
上面的方法是官方提供的,还有一种方法,
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.scott-sherwood.com/wp-content/uploads/2013/01/scene.png"]];
AFImageRequestOperation *operation = [AFImageRequestOperation :requestimageProcessingBlock:nil success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
self.backgroundImageView.image = image;
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
NSLog(@"Error %@",error);
}];[operation start];
如果使用第一种URLWithString: placeholderImage:会有更多的细节处理,其实实现还是通过AFImageRequestOperation处理,可以点击URLWithString: placeholderImage:方法进去看一下就一目了然了。所以我觉得还是用第一种好。
如何通过URL获取plist文件
通过url获取plist文件的内容,用的很少,这个方法在官方提供的方法里面没有
NSString *weatherUrl = @"http://www.calinks.com.cn/buick/kls/Buickhousekeeper.plist";
NSURL *url = [NSURL URLWithString:[weatherUrl :NSUTF8StringEncoding]];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[ addAcceptableContentTypes:[NSSet setWithObject:@"text/plain"]];
*operation = [ :request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id propertyList) {
NSLog(@"%@",(NSDictionary *)propertyList);
}failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id propertyList) {
NSLog(@"%@",error);
}];[operation start];
如果稍不留神,可能就出现Error Domain=AFNetworkingErrorDomain Code=-1016 "Expected content type {(
"application/x-plist"
)}, got text/plain" UserInfo=0x16e91ce0 {NSLocalizedRecoverySuggestion=...
...
, = { }, NSErrorFailingURLKey=, NSLocalizedDescription=Expected content type {(
"application/x-plist"
)}, got text/plain, = { URL: } { status code: 200, headers {
"Accept-Ranges" = bytes;
Connection = "keep-alive";
"Content-Length" = 974;
"Content-Type" = "text/plain";
Date = "Sat, 25 Jan 2014 07:29:26 GMT";
Etag = ""1014c2-3ce-4ee63e1c80e00"";
"Last-Modified" = "Wed, 25 Dec 2013 23:04:24 GMT";
Server = "nginx/1.4.2";} }}
可能还会出现乱码,解决办法就是[ addAcceptableContentTypes:[NSSet setWithObject:@"text/plain"]];
如何通过URL获取XML数据
xml解析使用AFXMLRequestOperation,需要实现苹果自带的NSXMLParserDelegate委托方法,XML中有一些不需要的协议格式内容,所以就不能像json那样解析,还得实现委托。我之前有想过能否所有的XML链接用一个类处理,而且跟服务端做了沟通,结果很不方便,效果不好。XML大多标签不同,格式也不固定,所以就有问题,使用json就要方便的多。
第一步;在.h文件中加入委托NSXMLParserDelegate
第二步;在.m文件方法中加入代码
NSURL *url = [NSURL URLWithString:@"http://113.106.90.22:5244/sshopinfo"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFXMLRequestOperation *operation =
[AFXMLRequestOperation :request success:^(NSURLRequest *request,NSHTTPURLResponse *response, NSXMLParser *XMLParser) {
XMLParser.delegate = self;
[XMLParser setShouldProcessNamespaces:YES];
[XMLParser parse];
}failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, NSXMLParser *XMLParser) {
NSLog(@"%@",error);
}];
[operation start];
第三步;在.m文件中实现委托方法
//在文档开始的时候触发
-(void)parserDidStartDocument:(NSXMLParser *)parser{
NSLog(@"解析开始!");
}
//解析起始标记
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
NSLog(@"标记:%@",elementName);
}
//解析文本节点
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
NSLog(@"值:%@",string);
}
//解析结束标记
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
NSLog(@"结束标记:%@",elementName);
}
//文档结束时触发
-(void) parserDidEndDocument:(NSXMLParser *)parser{
NSLog(@"解析结束!");
❽ iOS开发 GET、POST请求方法(NSURLConnection篇)
Web Service使用的主要协议是HTTP协议,即 超文本传输协议 。
HTTP/1.1协议共定义了8种请求方法(OPTIONS、HEAD、GET、POST、PUT、DELETE、TRACE、CONNECT)作为Web服务器。
GET方法 ,是向指定的资源发送请求,请求的参数“显式”地在URL的后面。有点像明信片,把内容“显式”写在外面,因此安全性比较差。一般使用于读取数据、例如从服务器读取静态图片、或查询数据等。
POST方法 ,是向指定资源提交数据,请求服务器进行处理,数据包含在 请求体 中。参数和地址分开,放在body里面。有点像把信内容放在信封中,接触的人看不到,安全性比较高。一般用于例如提交表单、上传文件等(请求的的动态资源,与查询类似,每个方法调用都要传递很多参数,因此需要使用NSMutableURLRequest创建请求。 )
iOS SDK中为HTTP请求提供了同步和异步请求这两种不同的API,
同步请求,可以从因特网请求数据,一旦发送同步请求,程序将停止用户交互,直至服务器返回数据完成,才可以进行下一步操作,意味着线程阻塞;
异步请求,不会阻塞主线程,而会建立一个新的线程来操作,用户发出异步请求后,依然可以对UI进行操作,程序可以继续运行;
它们的主要区别在于连接方式的不同。
下面通过请求一个登陆接口介绍有关于网络请求中的不同情况。
【本次开发环境: Xcode:7.2 iOS Simulator:iphone6 By:啊左】
一、GET方法
1.同步get方法:
//1.创建一个web路径
NSString*webPath=[NSString stringWithFormat:@"http://172.16.2.254/php/phonelogin?name=%@&pass=%@&btn=login",yourname,yourpass];
webPath=[webPath :NSUTF8StringEncoding]; //url不允许为中文等特殊字符,需要进行字符串的转码为URL字符串,例如空格转换后为“%20”;
NSURL *url=[NSURL URLWithString:webPath];
//2.根据WEB路径创建一个请求
NSURLRequest *request=[NSURLRequest requestWithURL:url];
NSURLResponse *respone;//获取连接的响应信息,可以为nil
NSError *error; //获取连接的错误时的信息,可以为nil
//3.得到服务器数据
NSData*data=[NSURLConnection sendSynchronousRequest: request returningResponse: respone error: &error];
if(data==nil) { NSLog(@"登陆失败:%@,请重试",error); return; }
/* 4.对服务器获取的数据data进行相应的处理; */
2.异步get方法:
异步请求与同步请求的不同在于使用NSURLConnectionDataDelegate委托协议,指定代理.
@interface ViewController : UIViewController // 遵循协议
@property (weak,nonatomic) NSMutableData *receiveData; //创建一个可变data,用于异步接收服务器的数据
@end
创建网络请求:
//1.创建一个web路径
NSString*webPath=[NSString stringWithFormat: @"http://172.16.2.254/php/phonelogin?name=%@&pass=%@&btn=login",yourname,yourpass];
webPath=[webPath :NSUTF8StringEncoding];
NSURL *url=[NSURL URLWithString:webPath];
//2.根据WEB路径创建一个请求
NSURLRequest *request=[NSURLRequest requestWithURL:url];
//3.指定代理 以异步的方式接收数据NSURLConnectionDataDelegate
NSURLConnection *con=[NSURLConnection connectionWithRequest:request delegate:self];
if(con==nil)
{
NSLog(@"创建连接失败.");
return;
}
else//成功 准备接数据
{
if(self.receiveData==nil)
{
self.receiveData=[[NSMutableData alloc] init];
}
}
异步的代理行为:
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
NSLog(@"已经响应成功.");
//清空 为当前连接做准备
self.receiveData.length=0;
}
-(void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{ NSLog(@"已经接收到了数据.");
//追加接收到的数据
[self.receiveData appendData:data];
}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
NSLog(@"接收数据已经完成.");
/* 对服务器获取的数据receiveData进行相应的处理; */
}
-(void) connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{ NSLog(@"连接失败.");
}
二、POST方法
1.同步post方法:
//1.创建一个web路径
NSString *webPath=@"http://172.16.2.254/php/phoneloginpost.php";
webPath = [webPath :NSUTF8StringEncoding]; NSURL *url=[NSURL URLWithString:webPath];
//2.建立一个带协议缓存类型的请求 (使用NSMutableURLRequest,是post方法的关键) NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url cachePolicy:() timeoutInterval:10]; //3.设置表单提交的方法(默认为get) [request setHTTPMethod: @"post"];
//4.设置要提交的参数 NSString *args=[NSString stringWithFormat:@"uname=%@&upas=%@&btn=login",uname,upas]; [request setHTTPBody: [args dataUsingEncoding:NSUTF8StringEncoding]];
NSData *recvData=[NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; if(recvData!=nil) {
/*
对服务器获取的数据recvData进行相应的处理
*/
}
else
{
NSLog(@"连接失败,请重试!");
}
2.post方法的异步与同步的区别在于使用NSURLConnectionDataDelegate委托协议,指定代理.
这一点与get方法一致,所以就不进行长篇幅的演示了。
以上就是关于部分网络同步异步请求,get、post请求方法的演示,由于UI控件还有其他的处理没有附上,具体的读者可以进行相应细节的调整,进行完整的网络请求项目开发。
由于iOS开始,引入了新的网络接口NSURLSession,而在iOS9中NSURLConnection被宣布弃用,因此关于NSURLSession发送GET和POST请求的资料部分,有兴趣的可以参考:
iOS开发 GET、POST请求方法(NSURLSession篇)
by:啊左~
❾ 我的苹果x网络启动失败怎么解决师傅
苹果手机显示网络请求失败的解决方法:
1、解锁iphonex手机到主页面后,选择并打开【设置】选项;
2、在【设置】中心里打开【通用】;
3、页面跳转至【通用】的设置列表中,选择【还原】;
4、在【还原】设置的详细选项列表下,点击【还原网络设置】,如图:
5、手动输入6位数字密码,对【还原网络设置】进行授权工作,见下图所示:
6、完成授权后,等待系统进行网络还原完成,长按iphonex机身侧面的【电源键】进行关机重启。
7、还原网络设置并重启iphonex手机后,解锁至主屏幕页面,即可使网络状态恢复至正常,解决iphonex手机显示网络请求失败的问题。