Use*_*987 3 c# asp.net asp.net-mvc json asp.net-mvc-5
我编写了以下代码,它基本上对我的服务器执行JSON请求:
var client = new RestClient("mysite.com");
var request = new RestRequest(Method.POST);
request.RequestFormat = DataFormat.Json;
request.AddParameter("application/x-www-form-urlencoded", /*params here...*/ ,ParameterType.RequestBody);
return JsonConvert.DeserializeObject<MyCustomType>(client.Execute(request).Content);
Run Code Online (Sandbox Code Playgroud)
请注意最后一行代码:
return JsonConvert.DeserializeObject<MyCustomType>(client.Execute(request).Content);
Run Code Online (Sandbox Code Playgroud)
我将返回的JSON从服务器反序列化到我的应用程序中以前的类结构.
现在问题是服务器可以返回错误响应或成功响应,并且对于每种情况我都需要不同的类结构,以便我可以将它们映射到C#类对象...
所以我认为这样的事情会做:
public object PerformMyAwesomeRequest(string myToken)
{
var response =client.Execute(request).Content;
var statusCode = FetchStatusCode(response);
if(statusCode == 0)//signaling the response returned error
{
return JsonConvert.DeserializeObject<ErrorMessageCustomType>(response);
}
else{
return JsonConvert.DeserializeObject<MyCustomType>(response);
}
}
Run Code Online (Sandbox Code Playgroud)
所以这样它不会给我任何错误......但是这里的问题是这些对象现在只存在于运行时,我无法确定我的.NET MVC Action中返回的类型服务器如下所示:
public ActionResult SomeActon(){
var response = PerformMyAwesomeRequest("mytokenhere...");
//response object is assigned a corresponding type only at runtime...
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:
返回不同类型对象的方法的唯一方法是返回它们的公共基类型.但是,您已经发现常见的超类object对您没有帮助,所以让我们考虑首先返回对象的替代方法:
MyCustomType,并抛出一些异常包装ErrorMessageCustomType.由于返回一个对象而抛出另一个对象,因此不需要关联类型.PerformMyAwesomeRequest方法中仅设置其中一个.这是不是很好,因为它需要的链if- elseS IN来电.out错误的参数 - 如果请求不成功,则返回null并将out参数设置为ErrorMessageCustomType.void PerformMyAwesomeRequest(string tok, Action<MyCustomType> onSuccess, Action<ErrorMessageCustomType> onError).最后一种方法可以像这样使用:
PerformMyAwesomeRequest(
myToken
, data => {
Console.WriteLine("Received data: {0}", data);
}
, error => {
Console.WriteLine("Received error: {0}", error);
}
);
Run Code Online (Sandbox Code Playgroud)
该方法可以这样实现:
public void PerformMyAwesomeRequest(string myToken, Action<MyCustomType> onSuccess, Action<ErrorMessageCustomType> onError) {
var response = client.Execute(request).Content;
var statusCode = FetchStatusCode(response);
if (statusCode != 0) {
onSuccess(JsonConvert.DeserializeObject<MyCustomType>(response));
} else {
onError(JsonConvert.DeserializeObject<ErrorMessageCustomType>(response));
}
}
Run Code Online (Sandbox Code Playgroud)