- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在我们的场景中,外部 API 根据请求是成功还是失败返回用户 XML 或错误 XML。
目前我正在将用户 POCO 传递给 restsharp,并且工作正常。但如果失败,则此对象为 NULL。除非我们手动解析错误 XML,否则我们不会知道失败的原因。
有没有办法解决这个问题?
例如
var restClient = new RestClient(baseURL);
var request = new RestRequest(uri);
request.Method = Method.POST;
var response = restClient.Execute<User>(request);
执行上述方法时,API 可以返回错误 xml 对象。如何在失败时获取错误对象并在成功时获取用户?
最佳答案
这是可以的,虽然代码有点难看。 RestSharp 允许您指定自己的 XML 反序列化器,因此我们需要这样做才能完成这项工作。
不过,首先,您需要一种可以存储 Error
的数据类型或 User
(我将其设为通用,因此它不仅适用于用户):
public class Result<T>
{
public T Data { get; set; }
public Error Error { get; set; }
}
所以想法是,现在当您执行请求时,您向 RestSharp 请求 Result<User>
而不仅仅是 User
,即:
var result = client.Execute<Result<User>>(request);
现在这是反序列化为 Error
所需的魔法或 User
.这是一个自定义反序列化器,继承自 RestSharp 的 XmlDeserializer
.警告:此代码根本没有经过测试,但它有望为您指明正确的方向。
public class XmlResultDeserializer : XmlDeserializer
{
public override T Deserialize<T>(IRestResponse response)
{
if (!typeof(T).IsGenericType || typeof(T).GetGenericTypeDefinition() != typeof(Result<>))
return base.Deserialize<T>(response);
// Determine whether the response contains an error or normal data.
var doc = XDocument.Parse(response.Content);
var result = Activator.CreateInstance<T>();
if (doc.Root != null && doc.Root.Name == "Error")
{
// It's an error
var error = base.Deserialize<Error>(response);
var errorProperty = result.GetType().GetProperty("Error");
errorProperty.SetValue(result, error);
}
else
{
// It's just normal data
var innerType = typeof(T).GetGenericArguments()[0];
var deserializeMethod = typeof(XmlDeserializer)
.GetMethod("Deserialize", new[] { typeof(IRestResponse) })
.MakeGenericMethod(innerType);
var data = deserializeMethod.Invoke(this, new object[] { response });
var dataProperty = result.GetType().GetProperty("Data");
dataProperty.SetValue(result, data);
}
return result;
}
}
然后你会像这样连接起来:
var restClient = new RestClient(baseURL);
client.AddHandler("application/xml", new XmlResultDeserializer());
var request = new RestRequest(uri);
request.Method = Method.POST;
var result = restClient.Execute<Result<User>>(request);
if (response.Data.Data != null)
{
var user = response.Data.Data;
// Do something with the user...
}
else if (response.Data.Error != null)
{
var error = response.Data.Error;
// Handle error...
}
关于c# - 是否可以将两种类型的对象传递给 Restsharp?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29811685/
我正在使用 RestSharp 访问 RubyOnRails API。您可能知道,RoR 喜欢参数名称采用 model_name[property] 形式。另一方面,RestSharp 不喜欢它。 F
我刚刚下载了 DropNet 来尝试使用它。我在尝试执行 new DropNetClient 时遇到异常: Method not found: System.String RestSharp.Rest
当我尝试使用 nuget 将 RestSharp 添加到可移植类库项目时,我得到以下信息: Could not install package 'RestSharp 104.1'. You are t
我有以下代码片段,它一直在我身上失败: ServicePointManager.ServerCertificateValidationCallback += (o, c, ch, er) => tru
当我像这样在 RestSharp 中发出请求时: var response = client.Execute(request); 我收到以下错误: "Unable to cast object of
有什么方法可以从 RestSharp RestRequest 中删除 header 吗? 我在项目页面中偶然发现了这个问题,但看不到它曾经被应用过: https://github.com/restsh
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我正在使用 RestSharp 将信息发送到 API。我想记录发送到此 API 的 XML,以便稍后进行调试。 我想做这样的事情: var request = new RestRequest(reso
下面是使用标准 HttpWebRequest 和 HttpWebResponse 完成的 POST 请求。基本上它发布带有一些参数的二进制文件。 我怎样才能用 RestSharp 做同样的事情? 来源
目前无法解决问题:无法将类型为“RestSharp.JsonArray”的对象转换为类型为“System.Collections.Generic.IDictionary”2[System.String
我使用了在 ASP.NET Framework version 4.5.1 上运行的 MVC Web 应用程序. 我做了 nopcommercePlugin .我正在将版本 3.4 升级到 3.5 更
我用过restsharp对于我的一些 .net 项目。我发现它对于从网络服务获取 Json 数据并将它们转换为 .net 对象非常有用。我需要一个类似的java框架。我想用它来为我的 android
最近我在用 RestSharp消耗我的 Restful 资源。并期望在服务器和客户端之间与 JSon 交换数据。下面是我的 C# 代码。 var client = new RestSharp.Rest
我的应用程序要求是使用签名程序集。我使用 Visual Studio 2012 命令工具签署了 RestSharp 程序集。应用程序构建成功,但运行时出现以下错误: Could not load fi
在特定情况下,我需要能够在请求/响应中禁用压缩。 使用 Firefox RestClient 我能够将一些 xml 发布到 Web 服务并使用单个 header 参数“Accept-Encoding”
我正在尝试使用 RestSharp(我的第一次)。我正在使用他们的示例: var client = new RestClient( "http://example.com" ); var reques
我查看了有关此问题的其他问题,但似乎没有任何内容可以回答我的问题。希望因为我的问题/问题似乎是一个简单的解决方案。 我使用 nuget 安装了 RestSharp。 using RestSharp;
我正在尝试使用 RestSharp 编码示例来连接到 MailGun。在下面的代码中,请参阅: client.Authenticator = new HttpBasicAuthenticator("X
我正在使用 RestSharp。我使用 XML 作为我的数据的传输编码,但后来我 had problems有了这个,所以我转而使用 JSON。现在我也遇到了问题! 在我尝试传递一个包含字节数组 (*)
我刚刚更新了在 ASP.NET Framework 4.5.2 版上运行的 MVC Web 应用程序。我正在使用 Twilio 发送 SMS 消息: var twilio = new TwilioRe
我是一名优秀的程序员,十分优秀!