我使用以下代码作为其余客户端的一部分。该代码按预期工作。现在,我想扩展到代码以返回HttpRespnseMessage及其结果。上下文是在错误调用功能的情况下,它将评估响应消息中的状态码和错误(如果有)。如何返回状态代码以及诸如<TResult, HttpResponseMessage>
之类的结果。
public async Task<TResult> MakeApiCall<TResult>(string url, HttpMethod method, bool auth, string data = null) where TResult : class
{
using (var httpClient = new HttpClient())
{
httpClient.Timeout = new TimeSpan(0, 0, 10);
using (var request = new HttpRequestMessage { RequestUri = new Uri(url), Method = method })
{
request.Headers.Accept.Clear();
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
// add content
if (method != HttpMethod.Get)
{
request.Content = new StringContent(data, Encoding.UTF8, "application/json");
}
if (auth)
{
request.Headers.Add("X-Service-Token", _authUser.ServiceApiKey);
}
HttpResponseMessage response = new HttpResponseMessage();
try
{
response = await httpClient.SendAsync(request).ConfigureAwait(false);
}
catch (Exception ex)
{
Debug.WriteLine(ex.ToString());
if (response != null)
{
Debug.WriteLine(response.StatusCode.ToString());
}
return null;
}
var stringSerialized = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
// Debug.WriteLine(stringSerialized);
// deserialize content
try
{
var desrialized_data = JsonConvert.DeserializeObject<TResult>(stringSerialized, Converter.Settings);
return desrialized_data;
}
catch (JsonReaderException ex)
{
Debug.WriteLine("JsonReaderException");
Debug.WriteLine(ex.ToString());
return null;
}
catch (JsonSerializationException ex)
{
Debug.WriteLine("JsonSerializationException");
Debug.WriteLine(ex.ToString());
return null;
}
catch (Exception ex)
{
Debug.WriteLine(ex.ToString());
return null;
}
}
}
}
Edit2:正如Alexei Levenkov指出的,我的问题似乎几乎是重复的。我仍然接受Michael的回答,因为它显示了如何在异步任务的上下文中返回多个值
答案 0 :(得分:3)
只需将 from django.shortcuts import render, redirect, get_object_or_404
from products.models import Product
from .models import Cart
def cart_home(request):
cart_obj, new_obj = Cart.objects.new_or_get(request)
products = cart_obj.products.all()
return render(request, 'carts/home.html', {})
def cart_update(request):
product_id = 1 #request.POST.get('product_id')
# print(Product.objects.get(id=1))
if product_id is not None:
try:
product_obj = Product.objects.get(id=product_id)
except Product.DoesNotExist:
print("show message to user ,Product is gone")
return redirect("cart:home")
cart_obj, new_obj = Cart.objects.new_or_get(request)
if product_id in cart_obj.products.all():
cart_obj.products.remove(product_obj)
else:
cart_obj.products.add(product_obj)
# return redirect(product_obj.get_absolute_url())
return redirect("cart:home")
用于所需的类型
Tuple
更新
Enigmativity正确地说
public async Task<(TResult,string)> MakeApiCall<TResult>(...) { ... return (response,somethingElse); // or return null;
是HttpResponseMessage
,因此不应将其返回到外部 方法的