webrequest post 传输百分号‘%’

本文讨论了在使用Web请求进行数据传输时,URL参数包含特殊字符如‘%’时,如何避免出现空指针错误。通过分析参数转义规则并提供解决方案,确保数据正确传递。

       通过webrequest的post传输数据的时候,如果url里面的参数带有‘%’,那么在取地址栏的参数的时候会出现空指针,或者是错误。如下列子

          string URL = http://127.0.0.1/file.do ;

          string postdata = "domethod=list&content=30%";

           byte[] data = Encoding.Default.GetBytes(postData);

             HttpWebRequest myrequest = (HttpWebRequest)WebRequest.Create(url);

            myrequest.Method = "POST";
            myrequest.ContentType = "application/x-www-form-urlencoded";
            myrequest.ContentLength = data.Length;
            Stream stream = myrequest.GetRequestStream();

            //发送数据
            stream.Write(data, 0, data.Length);
            stream.Close();


            //get response
            HttpWebResponse response = (HttpWebResponse)myrequest.GetResponse();
            StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default);
           从上面的例子中看到content的值是30%,那么运行之后在java的servlet中取得的参数值是null,也就是说这里的%被转义了,那么怎么解决呢?我们可以去先了解下百分号的转义是什么样的。如下:

String sss = URLEncoder.encode( "%%%", "gbk" );
  System.out.println( sss );

在控制台打印出来的是%25%25%25   , 从结果上面可以看出百分号的转义字符是%25,那么我们就只需要将上面例子里content的%替换成%25就解决问题了。

### 使用 `UnityWebRequest` 发送 POST 请求的方法 在 Unity 中,`UnityWebRequest` 是一个用于处理 HTTP 请求的强大工具,支持多种请求方法,包括 `POST`。有两种主要方式来创建 `POST` 请求:一种是使用静态方法 `UnityWebRequest.Post()`,另一种是通过构造函数创建并手动设置请求方式为 `POST`。虽然两者都能实现功能,但后者在某些情况下更推荐使用,尤其是在需要避免内存泄漏问题时[^2]。 #### 使用 `UnityWebRequest(url, "POST")` 构造函数 以下是一个完整的示例,展示如何使用构造函数方式发送 `POST` 请求,并处理响应: ```csharp using UnityEngine; using UnityEngine.Networking; using System.Collections; public class PostRequestExample : MonoBehaviour { public void StartPostRequest() { string url = "https://example.com/api/endpoint"; string postData = "{\"username\":\"user123\",\"password\":\"pass123\"}"; StartCoroutine(SendPost(url, postData, (response) => { Debug.Log("Server Response: " + response); })); } private IEnumerator SendPost(string url, string json, System.Action<string> callback) { UnityWebRequest uwr = new UnityWebRequest(url, "POST"); byte[] bodyRaw = System.Text.Encoding.UTF8.GetBytes(json); uwr.uploadHandler = new UploadHandlerRaw(bodyRaw); uwr.downloadHandler = new DownloadHandlerBuffer(); uwr.SetRequestHeader("Content-Type", "application/json"); yield return uwr.SendWebRequest(); if (uwr.isNetworkError || uwr.isHttpError) { Debug.LogError("Error: " + uwr.error); } else { callback(uwr.downloadHandler.text); } uwr.Dispose(); } } ``` 该方法避免了使用 `UnityWebRequest.Post()` 可能导致的内存泄漏问题[^2],同时允许开发者更灵活地控制请求的各个部分。 #### 使用 `UnityWebRequest.Post()` 静态方法 尽管构造函数方式在某些场景下更安全,但 `UnityWebRequest.Post()` 提供了更为简洁的接口,适用于快速发送简单的 `POST` 请求: ```csharp IEnumerator SendPostWithStaticMethod(string url, string postData) { UnityWebRequest www = UnityWebRequest.Post(url, postData); yield return www.SendWebRequest(); if (www.isNetworkError || www.isHttpError) { Debug.Log(www.error); } else { Debug.Log("Form upload complete!"); } } ``` 这种方式适合于不需要复杂配置的请求,但在处理大量或复杂请求时,建议使用构造函数方式以获得更好的控制和性能优化。 ### 注意事项 - 每次请求完成后,调用 `Dispose()` 方法释放资源,有助于防止内存泄漏。 - 设置正确的 `Content-Type` 是确保服务器正确解析请求体的关键。 - 在实际开发中,应根据需要选择合适的方式发送请求,并对错误进行适当处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值