C# 如何正确调用Web API

C# 如何正确调用Web API,c#,.net,asp.net-web-api,C#,.net,Asp.net Web Api,在ASP.NET网站中,他们了解如何从.NET客户端调用Web API 他们使用此方法进行调用以创建新产品: static async Task<Uri> CreateProductAsync(Product product) { HttpResponseMessage response = await client.PostAsJsonAsync("api/products", product); response.EnsureSuccessStatusCode()

在ASP.NET网站中,他们了解如何从.NET客户端调用Web API

他们使用此方法进行调用以创建新产品:

static async Task<Uri> CreateProductAsync(Product product)
{
    HttpResponseMessage response = await client.PostAsJsonAsync("api/products", product);
    response.EnsureSuccessStatusCode();

    // Return the URI of the created resource.
    return response.Headers.Location;
}
如果“path”参数是字符串,则无法在编译时检测可能的错误。此外,如果API发生变化,并且我们有很多调用,则无法快速重建调用


有没有更好的方法来构建调用以避免此类问题?我的意思是,就像我们使用Web服务一样。

就像Nkosi提到的,这就是它的设计方式。但是,您可以使用API URI创建一个类,并使用这些URI而不是文字

public class ApiUris
{
    public const string Products = "api/products";
    public const string Services = "api/services";
    public const string Orders = "api/orders";
    /* ... */
}

这样,如果您的webapi发生变化,您就可以轻松地更改路径。

仅扩展Adam的解决方案,您就可以使用

System.Web.Routing.RouteTable.Routes.ToList();

然后获取路径取决于RouteBase抽象类的具体实现。

如果服务器更改URL或参数的类型和/或结构,即使Web服务和WCF服务也不会保证构建失败。只有当你打电话给服务并且服务中断时,你才会知道这些变化

在调用Web API的情况下,在调用API之前,您肯定无法确定URL或参数表是否不正确

同时,Web API并不是为了频繁更改而构建的。如果它们不可靠,没有人会使用它们。因此,如果您使用的是API,您可以确保他们不会在一夜之间更改URL或停止支持某些输入参数,从而使他们像您这样的消费者应用程序崩溃。他们当然不想被客户起诉

任何API都会逐渐改变,并提前通知客户,以便他们有时间改变实现以支持新版本的API。
因此,您可以依赖正在使用的服务,在配置文件中输入与之相关的值(如URL)就足够了。或者,您可以选择将API URL放入数据库中,这样当它发生更改时,您只需更新数据库中的条目,更改就会立即生效。

简短回答:不,这就是HttpClient的设计方式。您不必使用魔术字符串。如果您将路由存储在配置或数据库等中,那么您可以快速进行更改,但这无助于解决您想要的编译错误。谢谢,但如何处理参数呢。例如,如果您有路由“api/products/{Id}”,并将其保存在另一个类或数据库中,您将有一个类似于“client.PutAsJsonAsync(Routes.products,product)”的调用,该调用可读性不高。看起来不错,但对错误类型和更改仍然太敏感。那么参数呢?我的意思是,想象一下“api/products/getproduct/{ProductId}”,如果是这样设计的,我觉得它设计得不好。。。当然,您可以参数化uri,我不认为这会是一个问题。您是否正在试图找到一种方法以友好的方式构建uri?不,我来自WebServices和WCF,您可以在那里执行
client.Method(parameter)
。我想知道在WebAPI中是否有这样好的东西。我明白了。我想真的没有这种内置的东西。除非你自己模仿它,否则这就是你试图避免的。对不起,但我不明白这怎么可能是我问题的答案。我想你可以用这种方式来填充fx。用于路由的静态类容器。然后您可以开发某种类型的服务契约,但是您又在开发一个类似于SOAP的REST-ish服务的开销。启用生成的服务对我来说非常有用,而且经常被忽略。您只关注“更改”问题。但是干净的代码或编码错误呢?在WebService中,您可以调用任何方法,如
client.method(parameters)
,您绝对不会错过它。如果web服务发生更改,您可以通过两次单击来更新引用。干净的代码是“您不应该仅仅因为更改了一个小值就重新编译您的项目。”这时配置文件就出现了。您只需更改配置文件并重新部署。如果您将配置放在数据库中,甚至可以避免重新部署。关于您提到的web服务用例,这是有效的,但不是现在的标准。您所问的根本不是Web API世界中的用例。当您开始与Web API集成时,您需要确保一切正常,在投入生产之前涵盖所有用例。如果您想在web API的负载不正确的情况下导致编译失败,那么到目前为止还没有做到这一点。在我的公司,我们有40多名开发人员使用另一家公司开发的Web API(相信我,他们会做出改变)。我们有很多问题,如果我们有更多的“Web服务风格”,这些问题可能会少一些。我同意你所面临的困难,因为频繁的变化。如果API在生产环境中被频繁更改,而没有通知消费应用程序,那么这就是API提供程序端的糟糕部分。我会考虑API提供者不担心消费者的唯一用例。过去有没有一个例子,google、Facebook、AWS、Azure和Twitter在生产过程中一夜之间改变了API?不,对吗?因此,如果发生了这种情况,我会说这是一种不好的做法。
System.Web.Routing.RouteTable.Routes.ToList();