将 json 字符串从 unity C# POST 到 webAPI;HttpClient 还是 UnityWebRequest?

Fea*_*Fox 0 c# json.net unity-game-engine asp.net-web-api

我正在尝试将 json 字符串发布到 Web API,目前得到了以下代码:

async Task<Uri> Post(CapturedImage image)
{
    string json = JsonConvert.SerializeObject(image);
    var content = new StringContent(json.ToString(), Encoding.UTF8, "application/json");
    HttpResponseMessage response = await client.PostAsync(url, content);
    response.EnsureSuccessStatusCode();
    Debug.Log("Request Message Information:- \n\n" + response.RequestMessage + "\n");

    Debug.Log(json.ToString());

    // return URI of the created resource.
    return response.Headers.Location;
}
Run Code Online (Sandbox Code Playgroud)

代码尚未完成,所以我不确定这是否是我最终想要返回的类型(最终我将有一个新的 json 字符串,其中包含有关特定汽车的信息)。

当涉及到线路时,Unity 挂起HttpResponseMessage response = await client.PostAsync(url, content);,我必须强行关闭 Unity 应用程序。

怎样才能httpClient成功使用呢?unityWebRequest我暂时没有使用它,因为我不明白WWWForm发送的方式(就像我猜的对象)。我也不希望发送 byte[],而是发送 json 字符串,我可以假设它WWWForm就像 json 字符串,但是分开的。另外,当它是WWWForm. 就像它是一个 json 字符串一样,我只有像这样的参数(string json)

我不使用unityWebRequest而不是完全错误的想法吗httpClient?如果可能的话我必须使用 json。

der*_*ugo 6

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"));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并与它一起使用

StartCoroutine(Upload(someURL, someJsonData, 
    // e.g. as lambda expression
    result => 
    {
        Debug.Log(result);
    }
));
Run Code Online (Sandbox Code Playgroud)

或者用一种方法

StartCoroutine(Upload(someURL, someJsonData, HandleUploadResult);

...

private void HandleUploadResult(string result)
{
    Debug.Log(result);
}
Run Code Online (Sandbox Code Playgroud)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

它看起来很复杂,但是......你不必对它做任何事情,只需将它放在你的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");
}
Run Code Online (Sandbox Code Playgroud)

还有其他来源可以做类似的事情..也许更好?

  • 还要检查[这个答案](/sf/ask/3182922081/)它在没有“Post”的情况下使用它并手动配置其余部分...特别是尝试 `SetRequestHeader("Content-Type", "application/json");` (2认同)