我有一个在WebGL中运行时失败的类,但它在UNITY IDE(5.6.1f1个人(Plus)版)中工作。)代码被修剪了'下面,但产生相同的特征(作为WebGL失败并且在UNITY IDE中没有问题。)我将此指向服务URL并在测试时获得正确的响应,但Post实际上从未发生过从WebGL运行时,如果没有收到响应(甚至没有错误),它将崩溃。我想从社区获得想法(也许我需要设置一个特定的构建参数或修改代码实现?)有用的反馈将非常感激。谢谢。
-------------------- Wrapper和JSON Utility Classes ----------------
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class JsonTest : MonoBehaviour {
JsonCommunicationManager jsonComm;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
public void OnMouseDown()
{
var jsonCommunications = gameObject.AddComponent<JsonCommunicationManager>();
string tempReturn = jsonCommunications.PostStartUpRequest("{\"userId\":1,\"id\":1}");
Debug.Log("JSON RequestStartParms: Response : " + tempReturn);
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class JsonCommunicationManager : MonoBehaviour
{
private WWW wwwForm;
// Use this for initialization
void Start()
{
}
// Update is called once per frame
void Update()
{
}
public string PostStartUpRequest(string JsonPostMessage)
{
Debug.Log("Inside PostMessage:");
string JsonReturnMessage;
StartCoroutine(PostWWWMessage(JsonPostMessage));
bool boolResponse = false;
do
{
Debug.Log("Checking for Response ");
try
{
JsonReturnMessage = wwwForm.text;
boolResponse = true;
}
catch
{
WaitForResponse();
Debug.Log("Inside JsonPost Message: WAIT");
}
} while (!boolResponse);
JsonReturnMessage = wwwForm.text;
Debug.Log("Inside JsonPost Message: Messgae Response Received: ");
Debug.Log("Inside JsonPost Message: Messgae Response Data: " + JsonReturnMessage);
Debug.Log("Inside JsonPost Message: Messgae Response Received: ");
Debug.Log("Inside JsonPost Message: Messgae Response Error: " + wwwForm.error);
Debug.Log("Inside JsonPost Message: Messgae Response Received: ");
return JsonReturnMessage;
}
//private void PostWWWMessage(string JsonPostMessage) {
private IEnumerator PostWWWMessage(string JsonPostMessage)
{
Debug.Log("Inside PostWWWMessage:");
Dictionary<string, string> headers = new Dictionary<string, string>();
headers.Add("Content-Type", "application/json");
byte[] postData = System.Text.Encoding.ASCII.GetBytes(JsonPostMessage.ToCharArray());
string fullyQualifiedURL = "https://jsonplaceholder.typicode.com/posts";
Debug.Log("Inside PostWWWMessage: Posting Message: " + JsonPostMessage);
print("Posting start up request to: " + fullyQualifiedURL);
print("Post Data is: " + postData);
print("Post Header is: " + headers);
wwwForm = new WWW(fullyQualifiedURL, postData, headers);
WaitForResponse();
yield return null;
}
private IEnumerator WaitForResponse()
{
yield return new WaitForSeconds(1);
}
}
答案 0 :(得分:2)
当您尝试在不了解协程的情况下构建完整程序时会发生这种情况。我鼓励您创建一个新项目,找到一个协程教程并研究它是如何工作的。我认为这是了解协程的最佳方式。
代码中的错误:
1 。请在协同程序的void
函数中等待。这是您在WaitForResponse()
函数内调用PostStartUpRequest
的地方。这将不等待,因为PostStartUpRequest
是一个void函数。将PostStartUpRequest
设为IEnumerator
函数,然后等待yield return WaitForResponse();
。
2 。在while
函数中有一个void
循环,等待另一个变量状态在另一个函数中更改。 while (!boolResponse);
不是一个好主意,除非你是从另一个线程做到的,但你不是。这会冻结Unity,因为你没有给其他函数运行机会。您可以通过在while循环中添加yield return null;
来解决此问题,该循环在每次检查后等待帧。这允许运行其他功能。您必须将PostStartUpRequest
功能更改为IEnumerator
功能才能执行此操作。
do
{
//Wait for a frame
yield return null;
....
} while (!boolResponse);
你可能会遇到崩溃。
3 。当您从WaitForResponse();
函数调用PostWWWMessage
函数等待 1 秒时,那不应该工作因为你不屈服。您必须等待WaitForResponse()
功能完成等待。你通过屈服来做到这一点。
应该是yield return WaitForResponse();
而不是WaitForResponse()
。
4 。没有正确等待WWW
请求完成。 Webrequest取决于设备和互联网的速度。有时,它可能需要超过您等待的秒数。您必须提出WWW
请求而不是1秒钟。
//Make request
wwwForm = new WWW(fullyQualifiedURL, postData, headers);
//Wait for request to finish
yield return wwwForm;
//Now you can safely use it:
JsonReturnMessage = wwwForm.text;
5 。在访问网络请求结果之前,请勿检查错误。
您需要在访问结果之前检查可能的错误,否则会发生任何事情,例如从服务器接收null
值。
if (String.IsNullOrEmpty(wwwForm.error))
{
//No Error. Access result
JsonReturnMessage = wwwForm.text;
}else{
//Error while making a request
Debug.Log(wwwForm.error);
}
最后,我无法说明为什么你有这么多函数来处理简单的Web请求。只需使用一个功能即可。
private WWW wwwForm;
// Use this for initialization
void Start()
{
StartCoroutine(PostWWWMessage("Test"));
}
//private void PostWWWMessage(string JsonPostMessage) {
public IEnumerator PostWWWMessage(string JsonPostMessage)
{
Debug.Log("Inside PostWWWMessage:");
Dictionary<string, string> headers = new Dictionary<string, string>();
headers.Add("Content-Type", "application/json");
byte[] postData = System.Text.Encoding.ASCII.GetBytes(JsonPostMessage.ToCharArray());
string fullyQualifiedURL = "https://jsonplaceholder.typicode.com/posts";
Debug.Log("Inside PostWWWMessage: Posting Message: " + JsonPostMessage);
print("Posting start up request to: " + fullyQualifiedURL);
print("Post Data is: " + postData);
print("Post Header is: " + headers);
wwwForm = new WWW(fullyQualifiedURL, postData, headers);
//Wait for the request
yield return wwwForm;
string JsonReturnMessage;
//Check for error
if (String.IsNullOrEmpty(wwwForm.error))
{
//No Error. Access result
JsonReturnMessage = wwwForm.text;
Debug.Log("Received: " + JsonReturnMessage);
}
else
{
//Error while making a request
Debug.Log(wwwForm.error);
}
}