网络编程(GET, POST)

网络编程(GET, POST)

    客户端展示网络数据的过程:

    1.客户端发送请求给服务器端

    2.服务器端收到请求,把数据(XML, JSON)传给客户端

    3.客户端要对数据进行解析, 提取有用数据

    4.然后在控件(label, tableView, imageView等等)上进行展示

    客户端与服务器端进行沟通, 需要一定的规则(所谓的协议), 常用的协议:HTTP, 超文本传输协议

    HTTP请求的方式

    1.GET

    2.POST

    区别: 数据存放的位置不一样

    GET请求数据存放在网址(URL)的后面, ?前是URL, ?后是参数, 参数以key=value的形式出现, 多个键值对用&连接

    POST请求数据存放在请求体(HTTPBody)

    :请求的格式可以看接口文档(API文档)

    发出请求的方式:

    1.同步请求, 发出请求后,必须等待服务器的回应, 才能继续执行

    2.异步请求, 发出请求后, 无需等待服务器回应, 可以继续执行

                   

同步GET请求

- (IBAction)get1:(id)sender {
   NSURL, 网址类
    NSURL *url = [NSURL URLWithString:@"http://api.hudong.com/iphonexml.do?type=focus-c"];
   NSURLRequest, 请求类, 继承于NSObject
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
   NSURLConnection, 网络连接类, 继承于NSObject, 用于发出请求
    //发出同步请求
    NSURLResponse *response = nil;
    NSError *error = nil;
    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
    NSLog(@"response: %@ error: %@", response, error);
    NSLog(@"%@", data);
    将data转成NSString
    NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"%@", string);
    XML解析
//    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
}

同步POST请求

- (IBAction)post1:(id)sender {
    post请求的url后面没有参数
    NSURL *url = [NSURL URLWithString:@"http://api.hudong.com/iphonexml.do"];
    post请求的参数需要放在HTTPBody中, NSURLRequest不允许修改HTTPBody, 需要使用NSMutableURLRequest, 才能修改HTTPBody
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    请求体
    NSString *value = @"type=focus-c";
    request.HTTPBody = [value dataUsingEncoding:NSUTF8StringEncoding];
    请求方式, 默认为@"GET"
    request.HTTPMethod = @"POST";
    NSURLResponse *response = nil;
    NSError *error = nil;
    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
    NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"%@", string);
    [string release];
}

异步GET请求

- (IBAction)get2:(id)sender {
    //1
    NSString *string = @"http://image.zcool.com.cn/56/13/1308200901454.jpg";
    URL中不能出现中文, 如果出现, 需要对字符串中的中文进行转码
    NSString *rightString = [string stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSLog(@"%@", rightString);
    NSURL *url = [NSURL URLWithString: rightString];
    //2
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    //3
    异步请求需要创建connection, 并指定delegate, 当数据返回时, 会调用代理方法
    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
    //开始连接
    [connection start];
    //释放
    [connection release];
}

delegate方法

#pragma mark - NSURLConnectionDelegate
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    NSLog(@"出现错误:%@", error);
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    NSLog(@"收到服务器的回应: %@", response);
    self.mData = [NSMutableData dataWithCapacity:0];
}

服务器传数据给客户端, 会把数据拆分成多个数据包, 这个方法会执行多次, 每次收到一个数据包就执行一次, 并且应该把数据包都拼接在一起, 形成完整的数据
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    NSLog(@"已经收到数据: %@", data);
    [self.mData appendData:data];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    NSLog(@"网络请求已经结束");
    self.imageView.image = [UIImage imageWithData:self.mData];
}

异步POST请求

- (IBAction)post2:(id)sender {
    //1
    NSURL *url = [NSURL URLWithString:@"http://api.tudou.com/v3/gw"];
    //2
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    NSString *valule = @"method=album.channel.get&appKey=myKey&format=json&channel=t&pageNo=1&pageSize=10";
    request.HTTPBody = [valule dataUsingEncoding:NSUTF8StringEncoding];
    request.HTTPMethod = @"POST";
    //3 发出异步请求
    //3.1
    //    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
    //    [connection start];
    //    [connection release];
    //3.2
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
        当请求结束才会执行block, 此时的data是一个完整的数据
        NSLog(@"%@", response);
        NSLog(@"%@", connectionError);
        NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        NSLog(@"%@", string);
    }];
}

点击imageView出现图片

- (IBAction)tap:(id)sender {
    //1
    NSURL *url = [NSURL URLWithString:@"http://image.zcool.com.cn/56/13/1308200901454.jpg"];
    //2
    NSURLRequest *requst = [NSURLRequest requestWithURL:url];
    //3
    NSData *data = [NSURLConnection sendSynchronousRequest:requst returningResponse:nil error:nil];
    NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"%@", string);
    //4. NSData转UIImage
    UIImage *image = [UIImage imageWithData:data];
    //5,在UIImageView上展示图片
    self.imageView.image = image;
}
同步请求的缺点: 当数据比较大时, 由于需要等待服务器端把所有数据传过来, 如果网速比较慢, 就会造成应用程序"假死"状态(不能做其他操作, 必须等待数据全部传过来)实现代码:
#import "NewsTableViewController.h"
#import "XHNews.h"

@interface NewsTableViewController ()
- (IBAction)refresh:(id)sender;
@property (nonatomic, retain) NSMutableArray *dataArray;

@end

@implementation NewsTableViewController

- (void)dealloc
{
    [_dataArray release];
    [super dealloc];
}

- (void)viewDidLoad {
    [super viewDidLoad];

    // Uncomment the following line to preserve selection between presentations.
    // self.clearsSelectionOnViewWillAppear = NO;

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem;
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    // Return the number of sections.
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    // Return the number of rows in the section.
    return self.dataArray.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *identifier = @"identifier1";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:(UITableViewCellStyleSubtitle) reuseIdentifier:identifier] autorelease];
    }

    XHNews *news = [[XHNews alloc] init];
    news = self.dataArray[indexPath.row];
    cell.textLabel.text = news.title;
    cell.detailTextLabel.text = news.desc;
    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:news.hot_pic]];
    cell.imageView.image = [UIImage imageWithData:data];
    return cell;
}

- (IBAction)refresh:(id)sender {
    //异步GET请求
    NSURL *url = [NSURL URLWithString:@"http://www.bjnews.com.cn/api/get_hotlist.php?page=1"];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
        NSLog(@"%@", response);
        NSLog(@"%@", connectionError);
        //JSON解析
        NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
        NSLog(@"%@", dic);
        //数据封装
        self.dataArray = [NSMutableArray arrayWithCapacity:20];
        for (NSDictionary *dictionary in dic[@"list"]) {
            XHNews *news = [[XHNews alloc] init];
            [news setValuesForKeysWithDictionary:dictionary];
            [self.dataArray addObject:news];
            [news release];
        }
        NSLog(@"%@", self.dataArray);
        //展示数据(刷新tableView)
        [self.tableView reloadData];
    }];
}
@end

 
时间: 2024-10-21 07:27:57

网络编程(GET, POST)的相关文章

C#网络编程技术FastSocket实战项目演练

一.FastSocket课程介绍 .NET框架虽然微软提供了socket通信的类库,但是还有很多事情要自己处理,比如TCP协议需要处理分包.组包.粘包.维护连接列表等,UDP协议需要处理丢包.乱序,而且对于多连接并发,还要自己处理多线程等等.本期分享课程阿笨给大家带来的是来源于github开源Socket通信中间件:FastSocket,目的就是把大家从繁琐的网络编程技术中彻底地解放和释放出来. 阿笨只想安安静静的学习下网络编程技术Socket后,将学习的成果直接灵活的运用到自己的实际项目中去.

网络编程 -- RPC实现原理 -- RPC -- 迭代版本V1 -- 本地方法调用

网络编程 -- RPC实现原理 -- 目录 啦啦啦 V2--RPC -- 本地方法调用:不通过网络 入门 1. RPCObjectProxy rpcObjectProxy = new RPCObjectProxy(new LocalRPCClient()); : 绑定目标对象 2. IUserService userService = (IUserService) rpcObjectProxy.create(IUserService.class); :返回代理类 3. List<User> u

C#网络程序设计(1)网络编程常识与C#常用特性

    网络程序设计能够帮我们了解联网应用的底层通信原理!     (1)网络编程常识: 1)什么是网络编程 只有主要实现进程(线程)相互通信和基本的网络应用原理性(协议)功能的程序,才能算是真正的网络编程. 2)网络编程的层次 现实中的互联网是按照"TCP/IP分层协议栈"的体系结构构建的,因此程序员必须搞清楚自己要做的是哪个层次上的编程工作. TCP/IP协议体系的实现情况: 其中,网络接口层已经被大多数计算机生产厂家集成在了主板上,也就是经常所说的网卡(NIC).windows操

9. 网络编程:

网络编程: 端口: 物理端口: 逻辑端口:用于标识进程的逻辑地址,不同进程的标识:有效端口:0~65535,其中0~1024系统使用或保留端口. java 中ip对象:InetAddress. import java.net.*; class  IPDemo{ public static void main(String[] args) throws UnknownHostException{ //通过名称(ip字符串or主机名)来获取一个ip对象. InetAddress ip = InetA

物联网网络编程、Web编程综述

本文是基于嵌入式物联网研发工程师的视觉对网络编程和web编程进行阐述.对于专注J2EE后端服务开发的童鞋们来说,这篇文章可能稍显简单.但是网络编程和web编程对于绝大部分嵌入式物联网工程师来说是一块真空领域. 的确,物联网研发应该以团队协作分工的方式进行,所以有嵌入式设备端.网关.web前端.APP.后端开发等专属岗位.作为系统架构师,自然需要掌握各种岗位的关键技术.作为嵌入式工程师,掌握网络编程.web编程,能够极大地拓展自己的视野和架构思维,能够主动地对系统的各种协议和应用场景提出优化的见解

linux网络编程-(socket套接字编程UDP传输)

今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中,如果我们使用TCP传输,会造成传输速度较慢的情况,所以我们在进行文件传输的过程中,最好要使用UDP传输. 在其中,我们需要写两个程序,一个客户端,一个服务端,在一个终端中,先运行服务端,在运行客户端,在服务端和客户端都输入IP地址和端口号,注意服务端和客户端的端口号要相同,然后选择功能,在linux

UNIX网络编程卷1 回射客户程序 TCP客户程序设计范式

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 下面我会介绍同一个使用 TCP 协议的客户端程序的几个不同版本,分别是停等版本.select 加阻塞式 I/O 版本. 非阻塞式 I/O 版本.fork 版本.线程化版本.它们都由同一个 main 函数调用来实现同一个功能,即回射程序客户端. 它从标准输入读入一行文本,写到服务器上,读取服务器对该行的回射,并把回射行写到标准输出上. 其中,非阻塞式 I/O 版本是所有版本中执行速度最快的,

黑马程序员——网络编程篇

------- android培训.java培训.期待与您交流! ---------- 概述   1.网络模型        (1).OSI参考模型        (2).TCP/IP参考模型   2.网络通讯要素         (1).IP地址        (2).端口号         (3).传输协议    3.过程        1,找到对方IP. 2,数据要发送到对方指定的应用程序上.为了标识这些应用程序,所以给这些网络应用程序都用数字进行标识. 为了方便称呼这个数据,叫做端口(逻

网络编程TCP/IP实现客户端与客户端聊天

一.TCP/IP协议 既然是网络编程,涉及几个系统之间的交互,那么首先要考虑的是如何准确的定位到网络上的一台或几台主机,另一个是如何进行可靠高效的数据传输.这里就要使用到TCP/IP协议. TCP/IP协议(传输控制协议)由网络层的IP协议和传输层的TCP协议组成.IP层负责网络主机的定位,数据传输的路由,由IP地址可以唯一的确定Internet上的一台主机.TCP层负责面向应用的可靠的或非可靠的数据传输机制,这是网络编程的主要对象. 二.TCP与UDP TCP是一种面向连接的保证可靠传输的协议

(一)理解网络编程和套接字

学习<TCP/IP网络编程> 韩 尹圣雨 著 金国哲 译 套接字类似电话 一.服务器端套接字(listening套接字)---接电话套接字 ①调用socket函数---安装电话机 #include <sys/socket.h> int socket(int domain, int type, int protocol); //成功时返回文件描述符,失败时返回-1 ②调用bind函数---分配电话号码 #include <sys/socket.h> int bind(in