随意细解:UI -- 网络编程

网络编程

GET请求方式

同步请求

会造成程序的卡顿(只有当请求完成才会恢复对界面的操作,用户的体验太差)

  1. 宏定义网址

    
    #define kSearchURL @"http://api.map.baidu.com/place/v2/search?query=麦当劳&region=上海&output=json&ak=6E823f587c95f0148c19993539b99295"
    
  2. 把字符串的网址 转换成网址对象
    注意:如果网址中有中文,需要转化格式

    // 注意:如果网址中有中文,需要转化格式
    NSString *newStr = [kSearchURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
     // 把字符串的网址 转换成网址对象
    NSURL *url = [NSURL URLWithString:newStr];
  3. 创建一个请求
    timeoutInterval请求超时的时间 秒为单位

    NSMutableURLRequest *URLRequest = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];
  4. 设置一个请求的标示(这步很重要)

    [URLRequest setHTTPMethod:@"get"];
  5. 利用请求创建一个链接

    NSURLResponse *response = nil;
    // 建立同步链接,并得到返回的数据(data
    NSData *data = [NSURLConnection sendSynchronousRequest:URLRequest returningResponse:&response error:nil];
  6. JSON解析数据
    注意数据类型,数组还是字典

 NSMutableDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:(NSJSONReadingMutableContainers) error:nil];

异步请求

代理方法 异步请求
  1. 获取网址对象(有中文要转码)

    NSString *urlStr = [kSearchURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  2. 利用网址 创建网址对象

    NSURL *url = [NSURL URLWithString:urlStr];
  3. 利用网址对象创建一个请求

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:(NSURLRequestUseProtocolCachePolicy) timeoutInterval:10];
  4. 标识请求类型

    [request setHTTPMethod:@"Get"];
  5. 利用请求创建一个异步链接
    定义属性 @property (nonatomic, retain) NSURLConnection *conn;

    self.conn = [NSURLConnection connectionWithRequest:request delegate:self];
  6. 开始链接

    [self.conn start];
  7. 遵守协议

    <NSURLConnectionDataDelegate, NSURLConnectionDelegate>
    
  8. 链接成功时,创建data

    - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
    {
    NSLog(@"已经接收到服务器的响应信息,链接成功");
    NSLog(@"%@", response);
    
    // 链接成功时,创建data
    self.receiveData = [NSMutableData data];
    }
  9. 多次触发didReceiveData方法 才能接收到 完整的data,所以需要拼接一下data

    - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
    {
    [self.receiveData appendData:data];
    NSLog(@"接收到数据触发的方法");
    }
    
  10. 完成数据加载,解析数据

    - (void)connectionDidFinishLoading:(NSURLConnection *)connection
    {
        NSLog(@"%@", self.receiveData);
        NSLog(@"已经完成数据加载 触发的方法");
        // 解析数据
        NSMutableDictionary *dataDic = [NSJSONSerialization JSONObjectWithData:self.receiveData options:(NSJSONReadingMutableContainers) error:nil];
        // 如果在tableView上展示的话
        // 注意:要刷新界面
    
    }
  11. 请求失败触发的方法

    - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
    {
    NSLog(@"请求失败时触发 %@", error);
    }
block 异步请求
  1. 获取网址对象(有中文要转码)

    NSString *urlStr = [kSearchURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  2. 利用网址 创建网址对象

    NSURL *url = [NSURL URLWithString:urlStr];
  3. 利用网址对象创建一个请求

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:(NSURLRequestUseProtocolCachePolicy) timeoutInterval:10];
  4. 标识请求类型

    [request setHTTPMethod:@"Get"];
  5. 回到主线程

    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
        // 可以对data进行JSON解析
        // 当数据请求完成的时候 会指定这个block
        NSLog(@"%@", data);
        // 判断是否在主线程
        NSLog(@"%d", [NSThread isMainThread]);
    
    }];
    

POST请求方式

POST同步

  1. 利用网址 创建网址对象

    NSURL *url = [NSURL URLWithString:kSearchURL];
  2. 利用网址对象创建一个请求

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:(NSURLRequestUseProtocolCachePolicy) timeoutInterval:10];
  3. 标识请求类型

    [request setHTTPMethod:@"POST"];
  4. 把字符串转化成data使用UTF- 8的编码格式(携带的请求体)

    NSData *data = [kNewsListParam dataUsingEncoding:NSUTF8StringEncoding];
  5. Post请求 携带一个请求体

    [request setHTTPBody:data];
  6. 创建同步链接

    NSData *newData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
  7. 解析数据

    NSMutableDictionary *dataDic = [NSJSONSerialization JSONObjectWithData:newData options:(NSJSONReadingMutableContainers) error:nil];
    

POST异步

代理方法 异步请求
  1. 获取网址对象

    定义宏 #define kNewsListURL 网址

     NSURL *url = [NSURL URLWithString:kNewsListURL];
  2. 利用网址对象创建请求

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:(NSURLRequestUseProtocolCachePolicy) timeoutInterval:10];
  3. 设置请求标示符

    [request setHTTPMethod:@"Post"];
  4. 给请求添加请求体

    NSData *data = [kNewsListParam dataUsingEncoding:NSUTF8StringEncoding];
    [request setHTTPBody:data];
  5. 利用请求创建一个链接(异步代理方法)

    self.conn = [NSURLConnection connectionWithRequest:request delegate:self];
    [self.conn start];
  6. 代理方法

    参考Get代理方法的异步请求

        - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
        {
            self.receiveData = [NSMutableData data];
            NSLog(@"%@", response);
        }
    
        - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
        {
            [self.receiveData appendData:data];
        }
    
    
            - (void)connectionDidFinishLoading:(NSURLConnection *)connection
        {
            NSMutableDictionary *dataDic = [NSJSONSerialization JSONObjectWithData:self.receiveData options:(NSJSONReadingMutableContainers) error:nil];
    
    
        }
    
        - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
        {
            NSLog(@"请求失败时触发 %@", error);
        }
    
block 异步请求
  1. 获取网址对象

    定义宏 #define kNewsListURL 网址

     NSURL *url = [NSURL URLWithString:kNewsListURL];
  2. 利用网址对象创建请求

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:(NSURLRequestUseProtocolCachePolicy) timeoutInterval:10];
  3. 设置请求标示符

    [request setHTTPMethod:@"Post"];
  4. 给请求添加请求体

    NSData *data = [kNewsListParam dataUsingEncoding:NSUTF8StringEncoding];
    [request setHTTPBody:data];
  5. 回到主线程

    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
        // 可以对data进行JSON解析
        // 当数据请求完成的时候 会指定这个block
        NSLog(@"%@", data);
        // 判断是否在主线程
        NSLog(@"%d", [NSThread isMainThread]);
    
    }];
    

GET请求方式 和POST请求方法对比

相同点:都能给服务器传输数据。

不同点:

  • 给服务器传输数据的⽅式:
    GET:通过⺴址字符串。
    POST:通过data

  • 传输数据的⼤⼩:
    GET:⺴址字符串最多255字节。
    POST:使⽤NSData,容量超过1G

  • 安全性:
    GET:所有传输给服务器的数据,显⽰在⺴址⾥,类似于密码的明⽂输⼊,直接可⻅。
    POST:数据被转成NSData(⼆进制数据),类似于密码的密⽂输⼊,⽆法直接读取。

服务器端PHP简单接⼝

PHP中使⽤不同的函数获取数据,⽀持不同的请求⽅式:

  • GET请求:使⽤ $_GET[“key”] 获取数据⺴址中的数据
  • POST请求:使⽤ $_POST[“key”] 获取上传data中的数据
  • GET、POST请求:使⽤ $_REQUEST[“key”] 获取数据
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' } android { namespace 'com.example.qrtopicture' compileSdk 33 defaultConfig { applicationId "com.example.qrtopicture" minSdk 24 targetSdk 33 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { useSupportLibrary true } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = '1.8' } buildFeatures { compose true } composeOptions { kotlinCompilerExtensionVersion '1.3.2' } packagingOptions { resources { excludes += '/META-INF/{AL2.0,LGPL2.1}' } } } dependencies { implementation 'com.google.zxing:core:3.4.1' implementation 'com.google.zxing:android-core:3.3.0' implementation 'com.google.zxing:android-integration:3.3.0' implementation 'androidx.appcompat:appcompat:1.4.0' implementation 'androidx.core:core-ktx:1.8.0' implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.3.1' implementation 'androidx.activity:activity-compose:1.5.1' implementation platform('androidx.compose:compose-bom:2022.10.00') implementation 'androidx.compose.ui:ui' implementation 'androidx.compose.ui:ui-graphics' implementation 'androidx.compose.ui:ui-tooling-preview' implementation 'androidx.compose.material3:material3' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' androidTestImplementation platform('androidx.compose:compose-bom:2022.10.00') androidTestImplementation 'androidx.compose.ui:ui-test-junit4' debugImplementation 'androidx.compose.ui:ui-tooling' debugImplementation 'androidx.compose.ui:ui-test-manifest' }帮我看看
最新发布
06-10

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值