下面是我们用来进行 API 调用的通用类。我有几个调用需要下面的语句
var notSureWhyWeNeedThisButWeDo = response.Result;
才能使其工作,而其他调用则根本不需要它。有人可以解释为什么需要这个并且必须有更好的方法来编码吗?
public class APICallClass
{
private static HttpClient client = new HttpClient();
public static async Task<HttpResponseMessage> APICall(AccessTokenObject root, string json, string paCode, string url, string type)
{
try {
var data = new StringContent(json, Encoding.UTF8, "application/json");
data.Headers.Add("securityToken", root.access_token);
if (paCode.Length > 0) {
data.Headers.Add("X-POS-MerchantID", paCode);
}
Task<HttpResponseMessage> response;
switch (type) {
case "put":
response = client.PutAsync(url, data);
break;
case "post":
response = client.PostAsync(url, data);
break;
default:
response = client.PostAsync(url, data);
break;
}
var notSureWhyWeNeedThisButWeDo = response.Result;
return await response.ConfigureAwait(false);
} catch (Exception ex) {
Logging.WriteErrorMessage(Priority.High, string.Empty, "APICall", "APICall.cs",url, ex, "client.xxxxAsync", false);
return null;
}
}
}
我正在用这样的语句来调用这个:
var response = await TalechAPI.APICall(root, json, pa.storeId, "https://mapi.talech.com/managemenu/menuitem/allmenuitems", "post");
通话结束后,我们会做这样的事情:
using (HttpContent content = response.Content)
{
var result = await response.Content.ReadAsStringAsync();
AddMenuItem.AddMenuItemRoot hd = JToken.Parse(result).ToObject<AddMenuItem.AddMenuItemRoot>();
if ((int) response.StatusCode != 200) {
Logging.WriteErrorMessage(Priority.High, string.Empty, "Talech", "Items.cs", "RootInsertItem", response.StatusCode.ToString(), "TalechBatchUser", false);
return null;
}
在您的示例中,我认为您正在获取等待程序并配置它,但这不会等待执行(您等待配置等待响应)。 您为读取结果而进行的调用会强制调用同步,因为结果在完成后才可用。
switch (type) {
case "put":
return await client.PutAsync(url, data);
case "post":
return await client.PostAsync(url, data);
default:
return await client.PostAsync(url, data);
}
这就是完成后返回响应所需的全部内容。