8

我创建了一个非常简单的 REST 微服务,它接收有关电子邮件的信息并发送它。微服务发送方法如下所示:

//EmailController
[HttpPost]
public IHttpActionResult Send(Email email)
{
    // send email via exchange
}

现在在我的应用程序中,我使用 RestSharp 调用它,如下所示:

var client = new RestClient("http://localhost:51467/api/");
var request = new RestRequest("email/send", Method.POST);
request.RequestFormat = DataFormat.Json;
dynamic obj = new ExpandoObject();
obj.FromAddress = from;
obj.ToAddress = to;
obj.Subject = subject;
obj.Body = body;

request.AddBody(obj);
client.Execute(request);

我的问题:

  1. 这是打电话的最佳方式吗?显然,我稍后将不得不添加错误处理等,但我说的更多是我使用 RestSharp 进行调用的方式。

  2. 我发现我的应用程序需要知道微服务期望接收的对象有点不舒服 - 没有任何定义/接口/合同可以用来确定。这是否被普遍接受为 REST 可以接受,还是我应该实现我的应用程序具有的某种接口,以便它可以以更明确的方式调用我的微服务。REST 甚至可以做到这一点吗?

谢谢你的帮助!

4

4 回答 4

4

REST 服务没有模式或 WSDL 类型的函数来定义服务的格式。与传统的 Web 服务相比,这使得它们的重量更轻。

有一种称为 WADL 或 Web 应用程序描述语言的东西,但这并不是真正的标准,也没有得到广泛支持。这也很有争议,因为有很多人觉得它没有必要。

http://en.wikipedia.org/wiki/Web_Application_Description_Language

另请参阅有关程序员的讨论

https://softwareengineering.stackexchange.com/a/133693/4368

于 2015-04-27T06:35:18.547 回答
3

我知道这是超级旧的,但为了货币我忍不住回答。

有两种方法可以将 API 合同与其他 .net 服务进行通信,我发现它们特别有用。

  • 使用合同(描述响应的接口)和可能的一些调用逻辑发送一个 nuget 包,以对您的 api 调用进行方法化
  • 使用 swagger 来描述您的 api(似乎已经成为 API 描述的赢家,Swashbuckle使其在 .net 中无缝),然后在调用者处手动编码您需要的位或使用 codegen

我经常同时做这两件事,swagger 对于文档和其他语言的兼容性也很好,它的好习惯是正式地说明你的合同和向后兼容性。

于 2017-04-24T13:41:32.967 回答
1

我会使用 ASP.NET Web API 客户端库。它适用于任何 REST API,无论是使用 .NET 还是其他框架进行编码。

在这里查看详细信息:http ://www.asp.net/web-api/overview/advanced/calling-a-web-api-from-a-net-client

Nuget 包: Microsoft.AspNet.WebApi.Client

于 2015-04-27T07:36:43.447 回答
0

我通常不会打扰像 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/

于 2015-04-27T07:10:40.830 回答