从统一 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
作为输入数据,而不仅仅是WWWForm
。 I 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?的主要内容,如果未能解决你的问题,请参考以下文章
从 Typescript POST 到 Web API API,无法传递 JSON 对象