unity中使用httppost的两种方式

最近需要在unity中使用http post的方式传递消息,所以做一下记录吧

1、unity自己的www 方式

因为我传递的消息是json字符串所以前期的工作就是 拼字符串然后通过litjson或者newtonsoft.json等库转换成byte数组然后,,,,,直接上代码吧

 IEnumerator SendToTuring()
    {
        JsonMsg jsMsg = new JsonMsg();
        jsMsg.reqType = 0;
        jsMsg.perception = new Perception();
        jsMsg.perception.inputText = new InputText();
        jsMsg.userInfo = new UserInfo();
        jsMsg.perception.inputText.text = "你好";
        jsMsg.userInfo.apiKey = "8bcdd2feb55143b4adc958fed9c9f536";
        jsMsg.userInfo.userId = "284239";
        string input = JsonMapper.ToJson(jsMsg);
        byte[] byteArry = System.Text.Encoding.UTF8.GetBytes(input);
        WWW getData = new WWW(url, byteArry);
        yield return getData;
        if(getData.error != null)
        {
            Debug.Log(getData.error);
        }
        else
        {
            Debug.Log(getData.text);
        }
    }

2、主动post的方法(这个貌似是纯C#的方法)

也是直接上代码

        string PostStr2Unit(string recStr)
    {
        string token = "24.f50db32087fd2**********.1546683946.282335-15076515";
        string url = "https://aip.baidubce.com/rpc/2.0/unit/bot/chat?access_token=";
        //logid++;
        string logId = "Sd" + System.DateTime.Now;
        string str = "{"bot_session":"",";
            str += ""log_id":"785426",";
        str += ""request":";
        str += "{"bernard_level":1,";
        str += ""client_session":";
        str += ""{\\"client_results\\":\\"\\", ";
        str += "\\"candidate_options\\":[]}",";
        str += ""query":"" + recStr + "",";
        str += ""query_info":{"asr_candidates":[],"source":"KEYBOARD","type":"TEXT"},"updates":"","user_id":"88888"},"bot_id":"15554","version":"2.0"}";

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url + token);
        request.Method = "post";
        request.ContentType = "application/json";
        request.KeepAlive = true;
        Debug.Log(str);
        byte[] byteArry = Encoding.UTF8.GetBytes(str);
        request.ContentLength = byteArry.Length;
        request.GetRequestStream().Write(byteArry, 0, byteArry.Length);
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
        string result = reader.ReadToEnd();
        JObject jdata = (JObject)JsonConvert.DeserializeObject(result);
        Debug.Log(jdata);
        string intent = jdata["result"]["response"]["schema"]["intent"].ToString();
      
        return intent;
    }

 

对比发现貌似是www的方法必须得放到协程里面才能使用,但是直接post的方法不用,根据不同场景调用不同的函数吧,也不能说谁优谁劣,毕竟使用合适的函数才是优秀的代码对吧

<think>我们正在讨论Unity中发送HTTP POST请求的实现方法。根据用户需求,我们需要提供在Unity中发送POST请求的代码示例。根据引用内容,有两种方法:使用UnityWebRequest和使用BestHTTP插件。由于用户没有特别说明使用插件,我们将重点放在Unity内置的UnityWebRequest方法上。 用户要求实现POST请求,引用中提供了两种方式的示例: 1. UnityWebRequest方式:通过设置UploadHandlerRaw和设置Content-Type为application/json来发送JSON数据。 2. BestHTTP插件方式:这里只展示了GET请求,但我们可以参考其思路,不过用户明确要求POST,且内置方法更通用,所以我们主要展示UnityWebRequest。 根据用户问题,我们只需要实现POST请求,所以我们将编写一个使用UnityWebRequest发送POST请求的方法,并处理响应。 步骤: 1. 创建一个UnityWebRequest对象,使用Post方法,传入URL和要发送的数据(这里数据可以是JSON字符串)。 2. 设置请求(Content-Type为application/json)。 3. 将JSON字符串转换为字节数组,并赋值给UploadHandlerRaw。 4. 发送请求并等待响应(使用协程)。 5. 处理响应结果(成功或失败)。 注意:UnityWebRequest.Post方法有两个参数,第一个是URL,第二个是表单数据。但当我们发送JSON时,通常不使用表单,而是直接设置body。因此,我们使用UnityWebRequest.Post的第二个参数为一个空字符串(或null),然后手动设置body和Content-Type。 引用中的示例正是这样做的:先创建Post请求,然后设置UploadHandlerRaw,并设置Content-Type。 因此,我们将编写一个协程,如下: ```csharp using UnityEngine; using UnityEngine.Networking; using System.Text; using System.Collections; public class HttpPostExample : MonoBehaviour { // 目标URL private string url = "http://example.com/api/post"; void Start() { // 启动协程发送POST请求 StartCoroutine(PostRequest("{\"name\":\"John\", \"age\":30}")); } IEnumerator PostRequest(string json) { // 创建UnityWebRequest,使用Post方法,第二个参数为表单数据,这里我们不需要,所以用空字符串 UnityWebRequest www = UnityWebRequest.Post(url, ""); // 设置请求为JSON类型 www.SetRequestHeader("Content-Type", "application/json;charset=utf-8"); // 将JSON字符串转换为字节数组 byte[] bodyRaw = Encoding.UTF8.GetBytes(json); // 设置上传处理器为原始数据 www.uploadHandler = new UploadHandlerRaw(bodyRaw); // 设置下载处理器,用于接收响应数据 www.downloadHandler = new DownloadHandlerBuffer(); // 发送请求并等待 yield return www.SendWebRequest(); // 处理结果 if (www.result == UnityWebRequest.Result.ConnectionError || www.result == UnityWebRequest.Result.ProtocolError) { Debug.LogError($"POST请求出错: {www.error}"); } else { Debug.Log("POST请求成功!"); Debug.Log($"响应: {www.downloadHandler.text}"); } } } ``` 注意: - 在UnityWebRequest.Post方法中,第二个参数是用于表单数据的,但我们发送的是JSON,所以这里传入空字符串。然后我们手动设置上传的数据。 - 我们显式设置了downloadHandler为DownloadHandlerBuffer,这样我们可以通过www.downloadHandler.text获取响应文本。 - 在Unity 2020及以上版本,推荐使用www.result来检查错误,而不是www.isNetworkError和www.isHttpError(已过时)。对于旧版本,可以使用www.isNetworkError和www.isHttpError。 如果用户使用的是旧版本Unity(如2018),可以这样写: ```csharp if (www.isNetworkError || www.isHttpError) { Debug.LogError($"POST请求出错: {www.error}"); } ``` 但是为了兼容性和未来考虑,我们使用UnityWebRequest.Result枚举。 另外,如果用户需要发送表单数据而不是JSON,可以使用UnityWebRequest.Post的第二个参数(WWWForm)来添加表单字段。但用户要求的是JSON,所以我们按照上述方式。 用户可能还需要其他内容类型(如application/x-www-form-urlencoded),但问题中要求的是JSON,所以我们按照JSON实现。 相关问题: 1. 如何在Unity中发送HTTP GET请求? 2. 如何处理HTTPS请求和证书问题? 3. 如何异步处理HTTP请求的响应而不阻塞主线程? 4. 如何发送带有文件上传的POST请求?</think>在 Unity 中发送 HTTP POST 请求,推荐使用内置的 `UnityWebRequest` 类,它提供了高效且线程安全的网络通信方案。以下是两种常用实现方式: ### 方法一:发送 JSON 数据(最常用) ```csharp using UnityEngine; using UnityEngine.Networking; using System.Collections; using System.Text; public class HttpPostExample : MonoBehaviour { // 目标 URL private string url = "https://your-api-endpoint.com/data"; void Start() { // 启动协程发送 POST 请求 StartCoroutine(SendPostRequest()); } IEnumerator SendPostRequest() { // 准备 JSON 数据 string jsonData = "{\"username\":\"test\",\"score\":100}"; byte[] rawData = Encoding.UTF8.GetBytes(jsonData); // 创建请求对象 UnityWebRequest request = new UnityWebRequest(url, "POST"); request.uploadHandler = new UploadHandlerRaw(rawData); request.downloadHandler = new DownloadHandlerBuffer(); request.SetRequestHeader("Content-Type", "application/json"); // 发送请求并等待响应 yield return request.SendWebRequest(); // 处理结果 if (request.result == UnityWebRequest.Result.Success) { Debug.Log("POST 成功! 响应: " + request.downloadHandler.text); } else { Debug.LogError($"POST 失败: {request.error} (状态码: {request.responseCode})"); } } } ``` ### 方法二:发送表单数据 ```csharp IEnumerator SendFormPost() { // 创建表单数据 WWWForm form = new WWWForm(); form.AddField("username", "user123"); form.AddField("password", "pass!@#"); // 发送请求 using (UnityWebRequest request = UnityWebRequest.Post(url, form)) { yield return request.SendWebRequest(); if (request.result != UnityWebRequest.Result.Success) { Debug.LogError($"表单提交失败: {request.error}"); } else { Debug.Log("表单提交成功!"); } } } ``` ### 关键参数说明 1. **请求设置** - JSON 请求:`SetRequestHeader("Content-Type", "application/json")` - 表单请求:自动设置为 `application/x-www-form-urlencoded` 2. **数据处理** - `UploadHandlerRaw`:处理原始字节数据(JSON/二进制) - `DownloadHandlerBuffer`:接收文本响应 - `WWWForm`:构建表单键值对 3. **错误处理** - 检查 `request.result` 状态: - `Result.Success`:请求成功 - `Result.ConnectionError`:网络错误 - `Result.ProtocolError`:HTTP 错误 (4xx/5xx) ### 注意事项 1. **协程要求** UnityWebRequest 必须在协程中调用,使用 `StartCoroutine()` 启动 2. **HTTPS 支持** 直接使用 `https://` 开的 URL 即可自动处理加密 3. **性能优化** - 使用 `using` 语句自动释放资源 - 避免每帧创建新请求,复用请求对象 4. **跨平台兼容** iOS/Android 需在 Player Settings 中启用 `Internet Access` 权限 > 示例引用自 Unity 官方网络通信文档[^1],实际使用时请替换为您的 API 地址和有效数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值