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

Posted

技术标签:

【中文标题】从统一 C# POST json 字符串到 webAPI; HttpClient 还是 UnityWebRequest?【英文标题】:POST json string to webAPI from unity C#; HttpClient or UnityWebRequest? 【发布时间】:2019-08-24 16:07:01 【问题描述】:

我正在尝试将一个 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;

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

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

我怎样才能成功使用httpClient 我暂时没有使用unityWebRequest,因为我不明白WWWForm 是以哪种方式发送的(就像一个对象我猜)。而且我也不希望发送一个 byte[],而是发送一个 json 字符串,我可以假设 WWWForm 就像一个 json 字符串,但是是分开的。此外,当它是WWWForm 时,我也不知道在 Web API 中接收哪种类型。就像它是一个 json 字符串一样,我只有 (string json) 这样的参数。

我认为不使用unityWebRequest 而不是httpClient 是完全错误的吗?如果可能,我必须使用 json。

【问题讨论】:

使用unitywebrequest可能是首选,发送json,代码没有什么不同,你可以像上面一样在body中发布json。 UnityWebRequest.Post(string URL, string data) 也将简单的string 作为输入数据,而不仅仅是WWWFormI don't want a byte[] to be sent either - 最后您发送的所有内容都将被编码为byte[] ... 但是使用StartCoroutine() 等而不是等待异步?我可以在代码中用什么交换UnityWebRequest?你能展示一些代码示例吗? @BugFinder @derHugo 好的!我会试试看的! 你可以使用this(没用过但看起来很有前途) 【参考方案1】:

UnityWebRequest.Post(string URL, string data) 也将string 作为数据输入,而不仅仅是WWWForm

通常你会在Coroutine中使用它

为了返回结果,您可以添加一个简单的回调

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 一起使用,正如this 所说,看起来很有希望(尽管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");

有 other sources 做类似的事情......也许更好?

【讨论】:

我特别要使用的是json,所以只用协程尝试了你的第一个例子。我确实得到了一些回应。尽管404 not found 是一个错误。我的网址在邮递员中有效,所以我真的不明白为什么找不到该页面。我想我只需要goole它^^再次感谢您的所有帮助 Hugo! 还结帐this answer 它在没有Post 的情况下使用它并手动配置其余部分......尤其是尝试SetRequestHeader("Content-Type", "application/json");

以上是关于从统一 C# POST json 字符串到 webAPI; HttpClient 还是 UnityWebRequest?的主要内容,如果未能解决你的问题,请参考以下文章

C# Web API:迭代数组并追加到 HTML 表

如何从 C# Web 服务返回数据表/数据集作为 JSON

从 Typescript POST 到 Web API API,无法传递 JSON 对象

将信息从 ios 应用程序保存到 Web 服务器 (POST JSON)

Web API JSON 属性长度限制?

C#用httpclient模拟post到web网站上