UnityWebRequest.Post(string URL, string data)
также принимает string
в качестве ввода данных не только WWWForm
.
Обычно вы используете его в сопрограмме
Чтобы получить результат обратно, вы можете добавить простой обратный вызов
IEnumerator Upload(string URL, string jsonData, Action<string> callback)
{
using (UnityWebRequest www = UnityWebRequest.Post(URL, jsonData))
{
www.SetRequestHeader("Content-Type", "application/json");
yield return www.SendWebRequest();
if (www.isNetworkError || www.isHttpError)
{
Debug.Log(www.error);
}
else
{
Debug.Log("Form upload complete!");
callback?.Invoke(www.GetResponseHeader("Location"));
}
}
}
и используйте его с
StartCoroutine(Upload(someURL, someJsonData,
// e.g. as lambda expression
result =>
{
Debug.Log(result);
}
));
или методом
StartCoroutine(Upload(someURL, someJsonData, HandleUploadResult);
...
private void HandleUploadResult(string result)
{
Debug.Log(result);
}
Но если вам действительно нужно использовать его с await
, как сказано , то выглядит многообещающе (хотя neevr и пробовал):
public class UnityWebRequestAwaiter : INotifyCompletion
{
private UnityWebRequestAsyncOperation asyncOp;
private Action continuation;
public UnityWebRequestAwaiter(UnityWebRequestAsyncOperation asyncOp)
{
this.asyncOp = asyncOp;
asyncOp.completed += OnRequestCompleted;
}
public bool IsCompleted { get { return asyncOp.isDone; } }
public void GetResult() { }
public void OnCompleted(Action continuation)
{
this.continuation = continuation;
}
private void OnRequestCompleted(AsyncOperation obj)
{
continuation();
}
}
public static class ExtensionMethods
{
public static UnityWebRequestAwaiter GetAwaiter(this UnityWebRequestAsyncOperation asyncOp)
{
return new UnityWebRequestAwaiter(asyncOp);
}
}
Это выглядит сложно, но ... с этим ничего не нужно делать, просто положите это куда-нибудь в свой Assets
.
Тогда, насколько я понимаю, вы можете просто использовать что-то вроде
www = UnityWebRequest.Post(URL, jsonData);
www.SetRequestHeader("Content-Type", "application/json");
await www.SendWebRequest();
if (www.isNetworkError || www.isHttpError)
{
Debug.Log(www.error);
}
else
{
Debug.Log("Form upload complete!");
var result = www.GetResponseHeader("Location");
}
Есть другие источники , которые делают что-то подобное ... может быть, лучше?