应用场景:一个游戏可能会衍生出其他APP或小程序之类的软件,例如王者营地是王者荣耀的官方APP,王者营地提供资讯、赛事、社区、战绩等功能。所以游戏端会和衍生出来的软件端做一些数据互通。这里把软件端称为中台系统。
Get请求和Post请求的区别
特性 | GET 请求 | POST 请求 |
---|---|---|
参数传递方式 | URL 查询字符串 | 请求体 |
安全性 | 较低(参数暴露在 URL 中) | 较高(参数在请求体中) |
幂等性 | 是(多次请求结果相同) | 否(多次请求可能产生不同结果) |
缓存 | 支持 | 不支持 |
使用场景 | 查询数据 | 提交数据、执行操作 |
请求体 | 不允许 | 允许 |
URL 长度限制 | 有 | 无 |
浏览器行为 | 可直接输入 URL,可收藏、分享 | 通常通过表单提交或 AJAX 发起 |
服务器处理 | 只读取参数,不修改资源状态 | 根据请求体修改资源状态 |
举例我在王者营地签到会有奖励,获得后需要在游戏内获取,这就需要游戏后端请求中台系统获得了什么奖励。分别用Get请求和Post请求实现。(实际上这个需求是Get请求,我们不修改中台系统的资源只获取数据)
Get请求实现
Get请求参数是暴露在URL中的,根据中台系统接口定义返回值类型
public class GetSignInAwardResponse
{public int code;public string msg;public Dictionary<string,Dictionary<int,long>> data;
}
发送Get请求获取奖励数据
public static async ETTask<Dictionary<int,long>> GetSignInAward(long unitId,string telephone)
{Dictionary<int,long> getAward = new Dictionary<int,long>();//最基础不包含参数的URLstring baseUrl = GetUrl(); //拼接玩家ID和手机号,中台系统用来验证玩家身份从而确定哪些奖励string url = $"{baseUrl}?telephone={telephone}&uid={unitId}"; HttpClient client = new HttpClient();//发送Get请求HttpResponseMessage responseMessage = await client.GetAsync(url);responseMessage.EnsureSuccessStatusCode();//获取返回值string resultText = await responseMessage.Content.ReadAsStringAsync();//Log.Warning(resultText);//序列化返回值GetSignInAwardResponse result = JsonHelper.FromJson<GetSignInAwardResponse>(resultText);if (result.code != ErrorCode.ERR_Success){return null;}getAward = result.data["signInAward"];return getAward;
}
Post请求实现
Post请求参数在请求体中,我们除了定义返回值还需要定义请求体。
public class GetSignInAwardRequest
{public string telephone;public string uid;
}public class GetSignInAwardResponse
{public int code;public string msg;public Dictionary<string,Dictionary<int,long>> data;
}
发送请求获取返回值
public static async ETTask<GetSignInAwardResponse> GetSignInAward(long unitId,string telephone)
{string url = GetUrl(); //最基础不带参数的URL//给请求体参数赋值GetSignInAwardRequest requestData = new GetSignInAwardRequest();requestData.uid = unitId.ToString();requestData.telephone = telephone;HttpClient client = new HttpClient();//序列化请求参数var data = new StringContent(requestData.ToJson(), Encoding.UTF8, "application/json");//发送Post请求和参数HttpResponseMessage responseMessage = await client.PostAsync(url, data);responseMessage.EnsureSuccessStatusCode();string resultText = await responseMessage.Content.ReadAsStringAsync();return JsonHelper.FromJson<GetSignInAwardResponse>(resultText);
}