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。
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)
还有其他来源可以做类似的事情..也许更好?
| 归档时间: |
|
| 查看次数: |
5244 次 |
| 最近记录: |