我通常不会打扰像 RestSharp 这样的额外客户端库。我觉得 REST 的目的是尽可能接近黄金的旧 HTTP,不需要 HttpWebRequest/Response 以外的任何东西。直接处理请求/响应可以提供很好的控制,并鼓励您思考实际发生的情况,而不是像使用传统 WCF 或 ASMX 服务那样抽象所有内容。
对于我过去构建的微服务,我将请求和响应对象保存在单独的库中,并将源代码分发给我组织内的其他开发人员,让他们在调用服务时有帮助,但它可能不会对外部消费者不实用;再次,我想在完整的 WCF 服务上使用微服务的意义在于,就其性质而言,传递的请求/响应是小而简单的。一开始我也对这种做法感到有些不舒服;然而,当我开始使用 javascript(通常是 jquery)像传统的 .NET 一样容易地获得真正响应迅速的 Web 应用程序调用微服务时,我开始看到我们内部系统的一些非常好的集成的潜力。
HttpWebRequest webRequest = WebRequest.Create("http://localhost:51467/api/email/send") as HttpWebRequest;
webRequest.Method = "POST";
webRequest.Credentials = CredentialCache.DefaultCredentials; //or account you wish to connect as
webRequest.PreAuthenticate = true;
webRequest.ContentType = "application/json"; // or xml if it's your preference
string jsonData = Newtonsoft.Json.JsonConvert.SerializeObject(requestObject);
using (StreamWriter streamWriter = new StreamWriter(webRequest.GetRequestStream()))
{
streamWriter.Write(jsonData);
streamWriter.Flush();
streamWriter.Close();
}
HttpWebResponse webResponse = webRequest.GetResponse() as HttpWebResponse;
if (webResponse.StatusCode != HttpStatusCode.Accepted)
throw new ApplicationException("Unexpected Response Code. - " + webResponse.StatusCode);
string response;
using (System.IO.StreamReader readResponse = new System.IO.StreamReader(webResponse.GetResponseStream()))
{
response = readResponse.ReadToEnd();
}
//swap out for regular xml serializer if you've used xml
dynamic responseObject = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(response);
还有另一个提示,如果您正在使用 web api,我真的建议添加 web api 帮助页面和测试客户端。您不会拥有使用 WCF 和 ASMX 获得的自动生成的 wsdl,但您可以获得一些非常好的关于您的微服务的文档,供其他开发人员使用(在我看来,自动生成的代理类更好)和一个可以让您练习的测试工具来自您的浏览器的服务
https://github.com/wuchang/WebApiTestClient
https://www.nuget.org/packages/Microsoft.AspNet.WebApi.HelpPage/