9原生get异步请求 ios_ios 添加请求头的get 原生请求 - CSDN
精华内容
参与话题
  • iOS之AFNetworking实现原理和使用方法

    万次阅读 2017-04-19 18:26:37
    AFHTTPClient处理GET和POST请求 在要经常调用某个请求时,可以封装,节省资源。 http网络库是集XML解析,Json解析,网络图片下载,plist解析,数据流请求操作,上传,下载,缓存等网络众多功能于一身的...
    AFHTTPClient处理GET和POST请求

    在要经常调用某个请求时,可以封装,节省资源。

    http网络库是集XML解析,Json解析,网络图片下载,plist解析,数据流请求操作,上传,下载,缓存等网络众多功能于一身的强大的类库。最新版本支持session,xctool单元测试网络获取数据一直是手机软件的重中之重,如果处理的不好,会造成很差的用户体验。随着ASIHTTPRequest的停止更新,更换网络库是必然的事情,AFNetworking就是很好的替代品。而且都是轻量级,不要担心加入太多库会多软件性能有影响。


    一、为什么用第三方网络库?

    什么都用苹果原生的好,XML解析用苹果自带的委托,下载图片自己写,你会发现自己管理起来很复杂,很容易出错,而且性能不好。第三方网络库可以优化这些问题。


    二、为什么要用AFNetworking?


    AFNetworking 目前使用比较多得一个下载库,目前一直在维护更新,使用的是非常简单,不需要添加任何关联的库。
     1、带block形式, 内部是任务队列进行下载 ,就是对operation的一个封装下载。
     2、还对uikit 内部的类进行类别形式添加方法(异步下载图片)。
     3、还可以检测网络状态。
     ASI 以前使用比较多得一个下载开源库 现在已经不维护了,ASI 使用的时候要导入很多库 比较麻烦第一点。

    三、AFNetWorking处理GET请求

    要使用常规的AFN网络访问
     
     1. AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
     
     所有的网络请求,均有manager发起
     
     2. 需要注意的是,默认提交请求的数据是二进制的,返回格式是JSON
     
     1> 如果提交数据是JSON的,需要将请求格式设置为AFJSONRequestSerializer
     2> 如果返回格式不是JSON的,
     
     3. 请求格式
     
     AFHTTPRequestSerializer            二进制格式
     AFJSONRequestSerializer            JSON
     AFPropertyListRequestSerializer    PList(是一种特殊的XML,解析起来相对容易)
     
     4. 返回格式 (响应格式)
     
     AFHTTPResponseSerializer           二进制格式
     AFJSONResponseSerializer           JSON
     AFXMLParserResponseSerializer      XML,只能返回XMLParser,还需要自己通过代理方法解析
     AFXMLDocumentResponseSerializer (Mac OS X)
     AFPropertyListResponseSerializer   PList
     AFImageResponseSerializer          Image
     AFCompoundResponseSerializer       组合
     
     取消任务
     [manager.operationQueue cancelAllOperations];

    代码demo:

    1、GET请求

    第一种情况:服务端的响应体的形式是text/json格式


    第二种情况:服务端响应体的content-type: 是text/xml格式


    第三种情况: 服务端返回的响应体的content-type: 是text/html格式


    2、get请求中的https 安全认证


    3、AF添加get请求头



    四、AFNetWorking处理POST请求

    代码demo:

    1、post&AFNetworking 参数


    2、post&AFNetworking 上传文件


    3、post&AFNetworking 上传头像


    4、AFNetwork检测网络连接


    5、检测网络连接另外一个第三方库Reachability


    6、发送json数据,post请求体,发送的json格式



    展开全文
  • iOS原生Http请求get post 异步

    千次阅读 2016-05-31 00:52:27
    网上有个公开的天气接口:天气 ,点进其中的... 这里面提供了get、post请求的格式要求。 1、get: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14

    网上有个公开的天气接口:天气 ,点进其中的getSupportCityDataset接口,用这个接口为例写一下iOS上的HTTP请求的写法。 这里面提供了get、post请求的格式要求。

    1、get:

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <span style="font-size:14px;">NSString * URLString = @"http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx/getSupportCityDataset?theRegionCode=广东";
        NSURL * URL = [NSURL URLWithString:[URLString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
         
        NSURLRequest * request = [[NSURLRequest alloc]initWithURL:URL];
        NSURLResponse * response = nil;
        NSError * error = nil;
        NSData * data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
        if (error) {
            NSLog(@"error: %@",[error localizedDescription]);
        }else{
            NSLog(@"response : %@",response);
            NSLog(@"backData : %@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
        }
    </span>
    get方法的请求参数是放在长长的URL字符串里面,这里只需要一个参数,就是地区的编号或名字,通过这个参数,服务器返回属于这个区域内支持天气查找的城市列表。如果有更多的参数也是放在URL字符串里面,至于参数的组织方式,就看服务器的要求了。

    用字符串构建NSURL,最好在使用URLWithString的时候把原字符串进行一下UTF8转码,关于为何要转码,看下这里第一部分。然后NSURL对象构建NSURLRequest,使用NSURLConnection的同步方法,传入request对象就可以通过get方法获取数据。

    这里有个NSError对象地址传入,用于做错误判断,网络的实际情况是多变的,必须要考虑请求错误的情况,否则可能导致程序奔溃。

    2、post:

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
        NSURL * URL = [NSURL URLWithString:[URLString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
         
        NSString * postString = @"theRegionCode=广东";
        NSData * postData = [postString dataUsingEncoding:NSUTF8StringEncoding];  //将请求参数字符串转成NSData类型
         
        NSMutableURLRequest * request = [[NSMutableURLRequest alloc]init];
        [request setHTTPMethod:@"post"]; //指定请求方式
        [request setURL:URL]; //设置请求的地址
        [request setHTTPBody:postData];  //设置请求的参数
         
        NSURLResponse * response;
        NSError * error;
        NSData * backData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
         
        if (error) {
            NSLog(@"error : %@",[error localizedDescription]);
        }else{
            NSLog(@"response : %@",response);
            NSLog(@"backData : %@",[[NSString alloc]initWithData:backData encoding:NSUTF8StringEncoding]);
        }
    post方式的时候参数是放在HTTPBody里面的,而且需要将字符串转码成响应的NSData类型,在接口文档里一般都有指出转码方式,需要按指定方式转码,这里的UTF8,也有gb2312的。request构建好了之后,和get方法一样使用NSURLConnection请求数据。

    3、同步和异步请求:

    一般网络请求都需要一段时间,哪怕数据再少、网络再好,都会有一段时间,而且很多时候必须考虑在网络不好的时候的app状态。使用同步请求只需安心等待数据就可以,不需要做额外操作,上面两例都是同步请求,connection调用方法后会把返回请求的数据,无需做什么其他事。但是同步会阻塞线程,如果通过点击button来发起请求,那么按钮会停留在highLight状态直到请求结束,会造成一种app卡住、死机的感觉,很不好。

    异步get:

    ?
    1
    2
    3
    4
    5
    6
        NSURL * URL = [NSURL URLWithString:[URLString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
         
        NSURLRequest * request = [[NSURLRequest alloc]initWithURL:URL];
         
        _connection = [[NSURLConnection alloc]initWithRequest:request delegate:self];  (1)
    异步post类似,不再是使用NSURLConnection调用方法直接得到数据,而是使用(1)位置方法构建一个NSURLConnection对象,这个方法会默认开始请求数据。接下来关键就是靠委托了。因为请求的时间未知,所以使用委托模式的回调作用,在数据回来是调用协议方法。post和get委托方法处理一样。

    协议方法:

    要注意的是这里有两个委托:NSURLConnectionDataDelegate和NSURLConnectionDelegate,前一个继承于后一个,获取数据的方法是定义在前一个委托里面的,所以只要遵循NSURLConnectionDataDelegate就可以了。

    一般用到四个委托方法:

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    <pre name="code" class="objc">//接受到respone,这里面包含了HTTP请求状态码和数据头信息,包括数据长度、编码格式等
    -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{ NSLog(@"response = %@",response); _backData = [[NSMutableData alloc]init];
    }
     
    //接受到数据时调用,完整的数据可能拆分为多个包发送,每次接受到数据片段都会调用这个方法,所以需要一个全局的NSData对象,用来把每次的数据拼接在一起
    -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
        [_backData appendData:data];
    }
     
    //数据接受结束时调用这个方法,这时的数据就是获得的完整数据了,可以使用数据做之后的处理了
    -(void)connectionDidFinishLoading:(NSURLConnection *)connection{
        NSLog(@"%@",[[NSString alloc]initWithData:_backData encoding:NSUTF8StringEncoding]);
    }
     
    //这是请求出错是调用,错误处理不可忽视
    -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
        if (error.code == NSURLErrorTimedOut) {
            NSLog(@"请求超时");
        }
        NSLog(@"%@",[error localizedDescription]);
    }
    </pre><br>
    <pre class="brush:java;"></pre>
    <pre class="brush:java;"></pre>
     
    <p></p>
    <pre class="brush:java;"></pre>
       最后,请求可以设置超时时间:<pre class="brush:java;">NSURLRequest * request = [[NSURLRequest alloc]initWithURL:URL cachePolicy:0 timeoutInterval:8.0];</pre>或者:<pre class="brush:java;">NSMutableURLRequest * request = [[NSMutableURLRequest alloc]initWithURL:URL];
     [request setTimeoutInterval:8.0];</pre>请求时间超过所设置的超时时间,会自动调用<pre class="brush:java;">-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error</pre>但是有个问题是怎么把判断是超时导致的请求失败,上面的例子里已经写了,可以根据返回的error的code进行判断。了解不同情况的请求失败,可以更好的给用户提示。<br>
    <br>
    <p></p> 
    展开全文
  • 这段时间,由于项目需求,需要实现Unity和iOS之间的代码交互(如,在Unity中使用iOS原生UI,二者之间方法互调等),故做了相关的技术预研及演示Demo。下文简单记录了本次实现,仅供参考。由于本人也是初学Unity,又...

    这段时间,由于项目需求,需要实现Unity和iOS之间的代码交互(如,在Unity中使用iOS原生UI,二者之间方法互调等),故做了相关的技术预研及演示Demo。下文简单记录了本次实现,仅供参考。由于本人也是初学Unity,又不足之处望高手指正。

    在Unity中使用iOS原生代码,其实唯一的方法就是通过插件的方式,官方文档 Building Plugins for iOS 其实已经对此做了较详细的阐述(当然也有对应的  Building Plugins for Android   和 Building Plugins for Desktop Platforms  )。我想实现的需求,能够在Unity导出生成的Xcode项目运行后,屏幕下方使用iOS原生UI--ToolBar,左右各有原生Item进行方法的交互。

    Unity中调用Objective-C/C++方法

    1、[DllImport("__Internal")] 特性

    在Unity新建项目中,Progect --> Create --> C# Script ,然后使用 [DllImport("__Internal")] 特性来标识用Objective-C/C++实现的函数。如下:

    [DllImport ("__Internal")]
    private static extern void ActivateUI_iOS();

    而在脚本中,我选择在void Start () 调用该方法:

    void Start () {
    	if (Application.platform == RuntimePlatform.IPhonePlayer) {
    		ActivateUI_iOS();
    	}
    }

    脚本写好后,添加引用:using System.Runtime.InteropServices ,然后绑定到目标对象(本Demo绑定到 Main Camera,同时创建了球和文本对象作为Unity的显示)。

    2、extern"C" 

    在对应的iOS项目文件 .mm 中对应的用 extern"C"  来标识接口,以及 void ActivateUI_iOS()方法的实现:

    extern "C" {
        void ActivateUI_iOS() {
            //Get the applications UIWindow
            UIWindow *window = [[UIApplication sharedApplication] keyWindow];
            //Create the RootViewController from a XIB file.
            ViewController *rootViewController = [ViewController sharedManager];
            rootViewController.view.frame = window.bounds;
            rootViewController.view.frame = CGRectMake(0, window.bounds.size.height - 44, 320, 44);
            //Add the RootViewController view to the main window.
            [window addSubview: rootViewController.view];
        }
    }

    因为 extern "C" 是C++语法,故应将.m文件改为.mm,编译才能通过。而 ViewController.h/m/xib 实现的就是界面展示的功能(View背景色为透明,才能显示Unity所展示的):

      

    3、文件导入Unity项目中,生成Xcode工程,编译运行

    Xcode运行项目没问题后,将原生代码(.a,.m,.mm,.c,.cpp文件)选中,拖入 Unity --> Project --> Plugins --> iOS 中(不能再有子目录),然后 File --> Build Settings 生成Xcode 工程编译运行。你会发现新版Unity已经自动合并这些文件到Xcode工程的Libraries目录下。而.h文件不会被包括在Xcode项目树之中,但是他们会在最终产生的文件系统中出现,这样能支持.m/.mm/.c/.cpp的编译。注:必须真机运行。效果如下(右图为点击 ShowAlert 后弹出 AlertView):

        

    若运行后没有展示下面的 ToolBar,请修改生成工程中 UnityAppController.mm -->- (void)showGameUI:(UIWindow*)window 方法。

    iOS原生代码调用Unity的脚本代码

    上文已实现了Unity脚本调用iOS原生代码,下面来实现在iOS原生代码中如何调用Unity脚本方法。

    1、UnitySendMessage

    Unity iOS版支持利用UnitySendMessage进行简单的本地管理回调功能:

    UnitySendMessage("GameObjectName1","MethodName1", "Message to send");

    这个方法包含三个参数:目标游戏对象的名称,调用的脚本方法,传递给脚本方法的信息字符串。

    所以,在Demo中,实现点击 ToolBar 右边的 ChangeText 来改变 Unity中GUIText 对象的显示(由 Hello World 变为 Building Plugins for iOS)。在ViewController.m文件中加入ChangeText 点击事件:

    -(IBAction)clickItem2:(id)sender
    {
        UnitySendMessage("Main Camera", [@"changeLabelShow" UTF8String], [@"Building Plugins for iOS" UTF8String]);
    }
    对应的Unity脚本中,实现changeLabelShow 这个方法:

    public void changeLabelShow(string textStr){
    	textObject.text = textStr;
    }
    记住先要声明和关联这个textObject:

    public GUIText textObject;

    最后,按照 3 中步骤,真机编译运行,点击右边Item后效果如下:


    注:

    1、只有符合以下结构的脚本方法才能被从本地方法调用:

                function MethoName(message:string)

    2、调用UnitySendMessage是异步的,会有1帧的延迟。

    总结

    1、在Unity中通过插件的方式实现调用iOS原生代码。

    2、 在Unity中使用原生UI,但是比起在Unity中直接绘制UI,原生UI效率要更低。因为在Unity中绘制UI时, Unity可以尽可能的优化, 用尽量少的draw call去绘制UI, 而NativeUI并不受控制。

    3、编译运行是个麻烦的过程, 从Unity生成一个XCode工程, 然后到XCode编译完成, 再到载入真机的过程是相当的漫长。机子性能不行的,额。。。自己感受吧。




    展开全文
  • 原生js的ajax请求兼容写法

    千次阅读 2017-08-30 11:42:12
    今天就整理一下原生js的ajax请求兼容写法,如有不对之处欢迎指出~~~ //创建ajax的兼容写法 function createXHR() { var req = null; if(window.XMLHttpRequest) { req = new XMLHttpRequest(); } ...

    今天就整理一下原生js的ajax请求兼容写法,如有不对之处欢迎指出~~~

    //创建ajax的兼容写法
    function createXHR()
    {
    	var req = null;
    	
    	if(window.XMLHttpRequest)
    	{
    		req = new XMLHttpRequest();
    	}
    	else
    	{
    		req = new ActiveXObject("Microsoft.XMLHTTP");
    	}
    	return req;
    }
    
    
    var req = createXHR();
    		
    		
    //  open: 只是为数据请求做好准备
    //     参数1: 请求数据的方式: GET, POST, DELETE, PUT 等
    //     参数2: 服务器的信息
    //     参数3: true 代表异步,false 代表同步操作
    req.open("GET", "http://127.0.0.1:8080/ajax/ajaxtest", true);
    
    
    // (3) 向服务器发送请求数据
    req.send();
    
    // 请求的属性,代表请求的状态
    //          0:   尚未请求
    //          1:   开始请求数据,但服务器还没有收到请求
    //          2:   服务收到请求了,但还没处理
    //          3:   已经开始处理数据了
    //         【4】: 服务器已经处理完数据,并返回结果
    // req.readyState
    
    
    // req.status 是 HTTP的状态码
    //    【200】    正常请求到数据
    // req.status
    
    // req.onreadystatechange 是 req 对象中的属性,
    // 当 准备状态 改变时
    // 将这个值设置成一个函数,就相当于 当 准备状态 改变时, 执行这个函数
    // 4. 配置状态发生改变函数
    req.onreadystatechange = function() 
    {
    
    	if (req.readyState == 4 && req.status == 200) 
    	{
    		
    		// 返回的结果,类型是 string 
    		alert(req.responseText);
    		
    		console.log("服务器已正常经返回结果");
    	}
    }
    
    console.log("这是主线程的调用");


    展开全文
  • Flutter经验积累、实战分享、系列教程

    千次阅读 热门讨论 2020-09-27 20:13:35
    本教程从flutter 到精通再独立开发一个App。 第一阶段 UI基础 第二阶段 基础功能篇 如 flutter 中的数据存储、网络访问...第四阶段 高级功能篇 如 flutter 与android ios 之间的双向 互调 第五阶段 flutter开发一个App
  • 本文将学习和原生平台交互,我们通过一个小案例来演示和Android平台的交互 ios? 你让我用window10演示ios? MethodChannel: 用于使用异步方法调用与平台插件通信的通道 “samples.flutter.io/battery” 为通道...
  • 昨天下午做项目遇到一个问题,贴出来方便以后翻阅,也给大家个参考。...一直以为是我后台程序有问题,晚上回到家才想起来ajax的问题,把ajax的异步处理改为同步,就出来效果了,具体的原因请看下文详解。
  • iOS 原生网络请求写法

    千次阅读 2016-02-03 11:46:55
    //网络请求   NSURLSession * mySession = [NSURLSession sharedSession];   NSURL * fullURL = [NSURL URLWithString:[NSString stringWithFormat:@"%@/%@", host, shoplisturl]];   NSMutableURLR
  • 我在前面的博客中《GCD实践——串行队列/并发队列与IOS多线程详解》中对iOS中的同步异步、串行并行做了较为详细的讲解。在之后的几篇GCD实践的博客中对GCD的使用也有较为详细的实现。但是我们要注意的是,那里用到的...
  • button 标签请添加 type='button' 属性,因为浏览器默认会认为 button 的属性是submit.type=‘submit’时会发生提交表单的默认行为。 type='button' class="send_msg" onclick="setData()">send ...
  • 一个电商项目的功能模块梳理2

    千次阅读 2016-07-07 19:22:20
    Web端和运营系统: 界面:HTML、CSS 事件:JS绑定 用户操作:浏览器,点击、拖动、滚动 数据:后端同步时就获得了,AJAX获得 页面渲染 同步模版,Freemarker,支持变量,函数等 异步用的模版:JS组件,
  • iOS NSURLSession 网络请求 重定向 302

    千次阅读 2016-07-26 13:57:54
    有关网络请求的类(该图片来自:developer.apple.com) 一、url请求 网络请求的组成部分有服务器地址、请求参数,以及请求...在iOS中,一个网络请求用NSURLRequest(或者其子类NSMutableURLRequest)来表示。
  • iOS 网络请求 笔记

    千次阅读 2016-07-22 15:10:59
    一、url请求网络请求的组成部分有服务器地址、请求参数,以及请求方式。在iOS中,一个网络请求用NSURLRequest(或者其子类NSURLMutableRequest)来表示。NSURLRequest适合于get请求,NSURLMutableRequest可以是post...
  • uni-app的三种调取接口的方法

    千次阅读 2020-05-04 11:09:43
    uni-app中调取接口的三种方式: 1、 uni.request({ url:'', data:'', method:'', //get、post、delete header:{}, success:res=>{}, fail:()=>{}, complete:=>{} }) 2、...
  • //webview每次加载之前都会调用这个方法,利用该代理方法截取JS的href来调用原生的方法-- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:...
  • 我的文章讲过:(0085)iOS开发之OC与JS交互高级用法(JavaScriptCore) 前言:我们知道OC 在UIWebView 加载 H5中,常常需要OC 与 H5 之间进行交互调用。采取的方法有: WebViewJavascriptBridge ...
  • 之前的代码js调用安卓原生都是用的异步方法,比如callback, promiss,异步的话,我们一般是在安卓原生有耗时操作,才用异步,如果我要离开返回,就需要js调用安卓同步方法 利用callback实现js调用原生可以参考我的这篇...
  • HTTP in iOS你看我就够(转)

    千次阅读 2016-05-16 10:00:29
    HTTP属于老话题了,在项目中我们经常需要往服务端发POST或者GET请求,但是对于HTTP的了解不应只局限于此。千里之行,始于足下。越想走的远,基本原理就应该了解的透彻全面一些,仅仅停留在使用ASIHttpRequest或者...
  • React Native网络请求fetch简单封装

    千次阅读 2017-06-27 22:29:23
    原生应用开发中,为了方便业务开发人员使用,我们一般会对网络库进行一些上传封装,而不是直接使用,例如基于AFNetworking库的ios请求上层封装,Android的诸如volley,retrofit等。在前端开发中,一般使用fetch进行...
  • iOS 中的HTTP(面试前可以记忆一下)

    千次阅读 2018-05-03 14:56:48
    HTTP属于老话题了,在项目中我们经常需要往服务端发POST或者GET请求,但是对于HTTP的了解不应只局限于此。千里之行,始于足下。越想走的远,基本原理就应该了解的透彻全面一些,仅仅停留在使用ASIHttpRequest或者...
1 2 3 4 5 ... 20
收藏数 4,889
精华内容 1,955
关键字:

9原生get异步请求 ios