C# API请求中的无效返回
此处创建了API请求的客户端和通用方法:C# API请求中的无效返回,c#,dotnet-httpclient,C#,Dotnet Httpclient,此处创建了API请求的客户端和通用方法: public class Client : IDisposable { private HttpClient _client; private void CreateClient() { _client = new HttpClient(); _client.DefaultRequestHeaders.Accept.Clear(); _client.DefaultRequestH
public class Client : IDisposable
{
private HttpClient _client;
private void CreateClient()
{
_client = new HttpClient();
_client.DefaultRequestHeaders.Accept.Clear();
_client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
_client.DefaultRequestHeaders.Add("KEY", token);
}
public void Dispose() => _client?.Dispose();
public enum Method { GET, POST, PUT, DELETE }
public HttpResponseMessage Request(string url, Method method, object data, HttpContent request)
{
if (data != null)
request = new StringContent(Serialize(data), Encoding.UTF8, "application/json");
switch (method)
{
case Method.POST: return _client.PostAsync(url, request).Result;
case Method.PUT: return _client.PutAsync(url, request).Result;
case Method.DELETE: return _client.DeleteAsync(url).Result;
default: return _client.GetAsync(url).Result;
}
}
public Task<HttpResponseMessage> RequestAsync(string url, Method method, object data, HttpContent request)
{
if (data != null)
request = new StringContent(Serialize(data), Encoding.UTF8, "application/json");
switch (method)
{
case Method.GET: return _client.GetAsync(url);
case Method.POST: return _client.PostAsync(url, request);
case Method.PUT: return _client.PutAsync(url, request);
case Method.DELETE: return _client.DeleteAsync(url);
default: return _client.GetAsync(url);
}
}
public string Post(string url, object data) =>
Request(url, Method.POST, data, null).Content.ReadAsStringAsync().Result;
public Task<HttpResponseMessage> PostAsync(string url, object data) =>
RequestAsync(url, Method.POST, data, null);
//UTILS
private static string Serialize(object data) =>
data == null
? string.Empty
: JsonConvert.SerializeObject(data, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });
}
请求需要基于几个模型装载,这些模型可以具有这种结构,我正试图以一种简单的方式生成它,如下所示:
public async Task Test()
{
var transaction = new Transaction
{
PaymentMethod = new PaymentMethod { Code = "1" },
Application = "Test",
Vendor = "Name",
Customer = new Customer
{
//Customer details...
},
Products = new List<TransactionProduct>
{
//Products...
}
};
var teste = Checkout.Credit(transaction);
Console.WriteLine(teste);
}
public async Task<HttpResponseMessage> PostAsync(string url, object data)
{
var result = await Request(url, Method.POST, data, null);
return await result.Content.ReadAsStringAsync();
}
我已尝试添加等待
进行结帐。信用
呼叫,但我得到:
CS0815 Test C# Cannot assign void to an implicitly-typed variable
用一个简单的HttpClient请求进行单元测试非常有效,但我无法确定我的项目结构上的问题,因此非常感谢任何帮助
Task
是没有返回值的async
方法的返回类型
或者,换句话说,async
将T
值包装到Task
(或者void
返回到Task
),然后等待
将这些值展开。由于Credit
返回Task
,表达式Checkout.Credit(transaction)
的类型为Task
,表达式等待签出。Credit(transaction)
的类型为void
。您不能将void
分配给var teste
;这就是编译器错误所说的
要解决此问题,请指定async
方法的返回类型。特别是:
public static async Task<HttpResponseMessage> Credit(object data) =>
await client.PostAsync(url, data);
这就是为什么我会把人们引导到你的任务岗位上…干得好,先生
public static async Task<HttpResponseMessage> Credit(object data) =>
await client.PostAsync(url, data);
public string Post(string url, object data) => ...;
public Task<HttpResponseMessage> PostAsync(string url, object data) => ...;
public async Task<HttpResponseMessage> PostAsync(string url, object data)
{
var result = await Request(url, Method.POST, data, null);
return await result.Content.ReadAsStringAsync();
}