关于 Unity3D 网络请求的笔记

Unity 脚本 关于网络请求的方法有如下:

public WWW (string url, byte[] postData, Dictionary<string, string> headers)

public WWW (string url, byte[] postData, Hashtable headers)
 ----->  deprecated

public WWW (string url, byte[] postData)

public WWW (string url, WWWForm form)

public WWW (string url)

很多方法呢,从文档中可以看到。

但是正在我看书的过程中发现有个方法已经被弃置了,所以特意写下笔记,增强记忆。

参考《Unity 3D/2D 手机游戏开发》一书自学的。

但遗憾在Unity5 的时候有方法被弃置,本人的思路将会根据该书来记录。

1.创建一个脚本,选C#,名为WebManager。

2.将脚本WebManager.cs 添加到一个对象上,即可触发脚本的事件。

3.开始编写代码。

3.1先编写一个界面。

using UnityEngine;
using System.Collections;

public class WebManager : MonoBehaviour {

	//全局变量,用来接收信息提示,初始化为“Nothing”。
	string m_info = "Nothing";

	void OnGUI() {
		GUI.BeginGroup (new Rect (Screen.width * 0.5f - 100, Screen.height * 0.5f - 100, 500, 200), "");

		//创建一个标签,设置位置、大小,将接收信息提示的全局变量作为标签的文本内容。
		GUI.Label (new Rect (10, 10, 400, 30), m_info);

		//创建一个按钮,设置位置、大小,按钮上的标题为“Get Data”。
		if (GUI.Button (new Rect (10, 50, 150, 30), "Get Data")) {
			//这里写点击按钮所触发的行为、事件。
		}

		//创建一个按钮,设置位置、大小,按钮上的标题为“Post Data”。
		if (GUI.Button (new Rect (10, 100, 150, 30), "Post Data")) {
			//这里写点击按钮所触发的行为、事件。
		}
		GUI.EndGroup();
	}

	// Use this for initialization
	void Start () {

	}

	// Update is called once per frame
	void Update () {

	}
}

首先就来个简单的方法吧。

Get请求是最简单的,所以一般简单的方法都是Get方法的。

3.2Get方法

先写下这个IGetData() 函数。需要注意的是该函数返回类型是迭代器 IEnumerator,通过这个可以进行协同调用。

IEnumerator IGetData() {
	//使用Get方式访问HTTP地址
	WWW www = new WWW ("http://yococoxc.vicp.cc:9999/test/userprint.php?username=yococo&password=123456789");

	//等待服务器的响应
	yield return www;

	//如果出现错误
	if (www.error != null) {
		//获取服务器的错误信息
		m_info = www.error;
		yield return null;
	}

	//获取服务器的响应文本
	m_info = www.text;
}

然后需要将上面的函数在Get对应的按钮上设置好,以便触发。

if (GUI.Button (new Rect (10, 50, 150, 30), "Get Data")) {
	StartCoroutine(IGetData());
}

说明:

StartCoroutine()方法的作用是启动协同程序,执行指定的方法,当然执行的方法的返回类型必须是IEnumerator。

关于程序所使用的PHP代码将会在最后列出。

效果为:

3.3Post方法

Get方法就是如上那么简单,接下来就是Post方法,有些类似,但是比较麻烦,当然Post方法有很多优点的,默认你是知道的。

IEnumerator IPostData() {
	Dictionary<string,string> headers = new Dictionary<string, string> ();
	headers ["Content-Type"] = "application/x-www-form-urlencoded";

	//将要发送的Post文本内容
	string data = "username=yococo&password=123456789";
	//将文本转为byte数组
	byte[] bs = System.Text.UTF8Encoding.UTF8.GetBytes (data);

	//向HTTP服务器提交Post数据
	WWW www = new WWW ("http://yococoxc.vicp.cc:9999/test/userprint.php", bs, headers);

	//等待服务器的响应
	yield return www;

	//如果出现错误
	if (www.error != null) {
		//获取服务器的错误信息
		m_info = www.error;
		yield return null;
	}

	//获取服务器的响应文本
	m_info = www.text;
}

特别提示:

用了 Dictionary 这个类,请引入 using System.Collections.Generic;
否则会出错。

然后按钮对应上执行的方法。

if (GUI.Button (new Rect (10, 100, 150, 30), "Post Data")) {
	StartCoroutine(IPostData());
}

结果:

3.4弃置的方法。

public WWW (string url, byte[] postData, Hashtable headers)

被弃置了,这个编程中不罕见,有弃置就会有相对代替的方法,文档是关键。

3.5另外的Post写法,实现另外的方法。

IEnumerator IPostData() {
	//将要发送的Post文本内容
	string data = "username=yococo&password=123456789";
	//将文本转为byte数组
	byte[] bs = System.Text.UTF8Encoding.UTF8.GetBytes (data);

	//向HTTP服务器提交Post数据
	WWW www = new WWW ("http://yococoxc.vicp.cc:9999/test/userprint.php", bs);

	//等待服务器的响应
	yield return www;

	//如果出现错误
	if (www.error != null) {
		//获取服务器的错误信息
		m_info = www.error;
		yield return null;
	}

	//获取服务器的响应文本
	m_info = www.text;
}

此处少了添加头信息。

IEnumerator IPostData() {

	WWWForm form = new WWWForm ();
	//添加字段(键,值)
	form.AddField ("username", "yococo");
	form.AddField ("password", "123456789");

	//向HTTP服务器提交Post数据,提交表单
	WWW www = new WWW ("http://yococoxc.vicp.cc:9999/test/userprint.php", form);

	//等待服务器的响应
	yield return www;

	//如果出现错误
	if (www.error != null) {
		//获取服务器的错误信息
		m_info = www.error;
		yield return null;
	}

	//获取服务器的响应文本
	m_info = www.text;
}

接下来就是PHP代码:

<?php
	if (isset($_GET['username']) && isset($_GET['password'])) {
		echo "GET -> username is " . $_GET['username'] . " and password is" . $_GET['password'];
	} else if (isset($_POST['username']) && isset($_POST['password'])) {
		echo "POST -> username is " . $_POST['username'] . " and password is" . $_POST['password'];
	} else {
		echo "error";
	}
?>

作者:木子才

iOS开发者俱乐部  232099237  有空可以加入这里一起探讨问题,由于群小,请输入验证信息。

时间: 2024-10-10 06:12:14

关于 Unity3D 网络请求的笔记的相关文章

iOS学习笔记---网络请求

一.HTTP协议的概念 HTTP协议:Hyper Text Transfer Protocol(超文本传输协议)是用于从万维网服务器传送超文本到本地浏览器的传输协议.HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型(c/s) HTTP协议的特点 支持客户/服务器模式(c/s模式) 简单快速 灵活,HTTP允许任意类型的对象进行传输,正在传输的对象类型由Content-type加以标记 iOS学习笔记---网络请求

《android开发进阶从小工到专家》读书笔记--HTTP网络请求

No1: 客户端与服务器的交互流程: 1)客户端执行网络请求,从URL中解析出服务器的主机名 2)将服务器的主机名转换成服务器的IP地址 3)将端口号从URL中解析出来 4)建立一条从客户端与Web服务器的TCP连接 5)客户端通过输出流向服务器发送一条HTTP请求 6)服务器向客户端回送一条HTTP响应报文 7)客户端从输入流获取报文 8)客户端解析报文,关闭连接 9)客户端将结果显示在UI上 No2: HTTP请求方式: 1)GET 获取服务器中某个资源,www.devtf.cn/artic

python学习笔记-day8-3-【python 网络请求及requests模块】

python的网络请求,主要是进行Http协议类接口调用,进行接口测试等. 一.urllib库,python内嵌的库,不太好用. from urllib import request,parse import json # url = 'http://baidu.com' # req = request.urlopen(url) #打开一个url # content = req.read().decode() # fw = open('nnzhp.html', 'w', encoding='ut

Android进阶笔记01:Android 网络请求库的比较及实战(一)

在实际开发中,有的时候需要频繁的网络请求,而网络请求的方式很多,最常见的也就那么几个.本篇文章对常见的网络请求库进行一个总结. 一.使用HttpUrlConnection: 1. HttpUrlConnection 最开始学android的时候用的网络请求是HttpUrlConnection,当时很多东西还不知道,但是在android2.2及以下版本中HttpUrlConnection存在着一些bug,所以建议在android2.3以后使用HttpUrlConnection,之前使用HttpCl

Android学习笔记:Andorid网络请求框架Volley的使用(上)

Volley框架是Google I/O 2013大会上发布的.Volley是Google针对Android平台上的网络通信库而诞生,该框架能使网络通信更快,更简单,更健壮.Volley的特点有: Ⅰ:通信更简单更快捷 ll:Get,Post网络请求及网络图像进行高效异步处理 III:可以对多个网络请求进行优先级排序以级多级别取消操作 IV:网络请求缓存及与Activity生命周期进行联动,在Activity销毁的时候可以对网络请求进行取消操作,防止内存泄露. Volley的使用很简单: 1,下载

iOS 网络请求 笔记

有关网络请求的类(该图片来自:developer.apple.com) 一.url请求 网络请求的组成部分有服务器地址.请求参数,以及请求方式.在iOS中,一个网络请求用NSURLRequest(或者其子类NSURLMutableRequest)来表示. NSURLRequest适合于get请求,NSURLMutableRequest可以是post请求. get方式下,服务器地址和请求参数都可以明文包含在url中,可以直接使用这个url来创建NSURLRequest(或者NSURLMutable

TCP/IP 网络编程 (抄书笔记 4) -- 管道: 进程间通信

TCP/IP 网络编程 (抄书笔记 4) – 管道: 进程间通信 TCP/IP 网络编程 (抄书笔记 4) – 管道: 进程间通信 int fds[2]; pipe(fds); write(fds[1], buf, strlen(buf)); read(fds[0], buf, BUF_SIZE); 如果两个进程的通信只是 单纯的一方写, 然后另一方读 的情况, 那么 我们的管道操作没有问题, 但是: char str1[] = "str1"; char str2[] = "

0806------Linux网络编程----------Echo 网络库 学习笔记

1.Echo网络库的编写 1.1 Echo网络库1.0 1.1.1 Echo网络库 1.0 框架分析 a)class InetAddress: 主要用来定义一个struct sockaddr_in 结构(用自定义端口号初始化),并提供获取这个结构体成员如IP.Port等的接口: b)class Socket : 主要用来把一个普通的 sockfd 变为 listenfd(这里用一个sockfd初始化对象),提供bind .listen.accept 等接口. c)class TcpConnect

【Android】Volley做网络请求的几种用法

前言: 最近在将自己写的烂代码重构,以前使用的网络请求全是基于apache的HttpClient,简单使用还好,使用多了发现重复代码太多,而且每次使用都很繁琐,因此在网上找了半天网络请求的相关类库,最后还是确定使用Volley,于是现在记个使用笔记: Volley几个主要功能: 1. 普通String请求: 既然使用了网络请求,那么网络权限是必不可少的,在AndroidManifest.xml中添加: <uses-permission android:name="android.permi