IEnumerator ApiPost(string Json)
{
HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create("https://api-free.deepl.com/v2/translate");
byte[] Jsongby = Encoding.UTF8.GetBytes(Json);
//将ApiKey(String)转化为base64编码添加为消息头
httpWebRequest.Headers.Add(HttpRequestHeader.Authorization, "DeepL-Auth-Key ---");
httpWebRequest.UserAgent = "YourApp/1.2.3";
//定义请求类型(POST)
//内容长度(ContentLength),Timeout(响应时间)
httpWebRequest.Method = "POST";
httpWebRequest.ContentType = "application/json";
httpWebRequest.ContentLength = Jsongby.Length;
httpWebRequest.Timeout = Jsongby.Length + 10000;
//写入数据
Stream writer = httpWebRequest.GetRequestStream();
writer.Write(Jsongby, 0, Jsongby.Length);
writer.Close();
var Task1 = httpWebRequest.GetRequestStreamAsync().Result.WriteAsync(Jsongby, 0, Jsongby.Length);
yield return new WaitUntil(()=> Task1.IsCompleted);
//接受返回值
var Task2 = httpWebRequest.GetResponseAsync();
yield return new WaitUntil(() => Task2.IsCompleted);
Stream stream = ((HttpWebResponse)Task2.Result).GetResponseStream();//报错点
StreamReader reader = new StreamReader(stream, Encoding.UTF8);
string value = reader.ReadToEnd();
Debug.Log(value);
//关闭流和Http连接
stream.Close();
reader.Close();
httpWebRequest.Abort();
yield return null;
}
请问一下,发送POST请求后读取返回值的时候,写入流的字节超出指定的 Content-Length 字节大小
这个怎么办哇
httpWebRequest.ContentLength = Jsongby.Length;
删除这一行看看
看样子你应该发现了官方的一个设定,iexxxx迭代不能了,不让你yield reten await
想想官方为啥有这个设定把。
因为迭代器是延后的,异步的东西上下文会不一样
虽然你变着法没用await骗过了编译器,但你骗不过运行期,运行期上下文变了
【以下回答由 GPT 生成】
问题解决方案:
在你提供的代码中,发送POST请求前已经将Json数据写入流中,所以在以下这行代码中,你无需再次调用GetRequestStreamAsync().Result.WriteAsync(Jsongby, 0, Jsongby.Length)
这段代码:
var Task1 = httpWebRequest.GetRequestStreamAsync().Result.WriteAsync(Jsongby, 0, Jsongby.Length);
yield return new WaitUntil(() => Task1.IsCompleted);
解决方法是:删除上面这段代码。
在读取返回值之前,你已经将Json数据写入请求流中了。所以,在以下这行获取返回值的代码中,可以直接调用httpWebRequest.GetResponseAsync()
获取返回值:
//接受返回值
var Task2 = httpWebRequest.GetResponseAsync();
yield return new WaitUntil(() => Task2.IsCompleted);
Stream stream = ((HttpWebResponse)Task2.Result).GetResponseStream(); //报错点
将以上部分代码修改为以下代码:
//接受返回值
HttpWebResponse response = (HttpWebResponse)httpWebRequest.GetResponse();
Stream stream = response.GetResponseStream();
这样就能够成功获取到返回的数据了。
完整的修改后的代码如下:
IEnumerator ApiPost(string Json)
{
HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create("https://api-free.deepl.com/v2/translate");
byte[] Jsongby = Encoding.UTF8.GetBytes(Json);
//将ApiKey(String)转化为base64编码添加为消息头
httpWebRequest.Headers.Add(HttpRequestHeader.Authorization, "DeepL-Auth-Key ---");
httpWebRequest.UserAgent = "YourApp/1.2.3";
//定义请求类型(POST),内容长度(ContentLength),Timeout(响应时间)
httpWebRequest.Method = "POST";
httpWebRequest.ContentType = "application/json";
httpWebRequest.ContentLength = Jsongby.Length;
httpWebRequest.Timeout = Jsongby.Length + 10000;
//写入数据
Stream writer = httpWebRequest.GetRequestStream();
writer.Write(Jsongby, 0, Jsongby.Length);
writer.Close();
//接受返回值
HttpWebResponse response = (HttpWebResponse)httpWebRequest.GetResponse();
Stream stream = response.GetResponseStream();
StreamReader reader = new StreamReader(stream, Encoding.UTF8);
string value = reader.ReadToEnd();
Debug.Log(value);
//关闭流和Http连接
stream.Close();
reader.Close();
httpWebRequest.Abort();
yield return null;
}
希望以上解决方案能够帮助到你,如果有任何疑问,请随时提出。