由于您无法在大多数托管网站上使用Put和Delete,因此我尝试创建一条避免使用这些网站的路由,但我无法让它工作..
我想要一条这样的路线
api/someController/Add/someInt
使用此RESTsharp代码
private RestClient client;
public RESTful()
{
client = new RestClient
{
CookieContainer = new CookieContainer(),
BaseUrl = "http://localhost:6564/api/",
//BaseUrl = "http://localhost:21688/api/",
//BaseUrl = "http://madsskipper.dk/api/"
};
}
public void AddFriend(int userId)
{
client.Authenticator = GetAuth();
RestRequest request = new RestRequest(Method.POST)
{
RequestFormat = DataFormat.Json,
Resource = "Friends/Add/{userId}"
};
request.AddParameter("userId", userId);
client.PostAsync(request, (response, ds) =>
{
});
}
在我的FriendsController中点击此方法
// POST /api/friends/add/Id
[HttpPost] //Is this necesary?
public void Add(int id)
{
}
所以我在路线配置中添加了这个
routes.MapHttpRoute(
name: "ApiAdd",
routeTemplate: "api/{controller}/Add/{id}",
defaults: new { id = RouteParameter.Optional }
);
但是当我这样做时,我只打了我的FriensController的构造函数而不是Add方法
编辑:
还尝试制作此路线配置
routes.MapHttpRoute(
name: "ApiAdd",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { action = "Add", id = RouteParameter.Optional }
);
但是同样的结果,控制器被击中而不是动作
解决方案: 发现参数是用RESTsharp错误添加的,所以不是
RestRequest request = new RestRequest(Method.POST)
{
RequestFormat = DataFormat.Json,
Resource = "Friends/Add/{userId}"
};
request.AddParameter("userId", userId);
应该是
RestRequest request = new RestRequest(Method.POST)
{
RequestFormat = DataFormat.Json,
Resource = "Friends/Add/{userId}"
};
request.AddUrlSegment("userId", userId.ToString());
答案 0 :(得分:2)
您可以在Api路线定义中包含操作名称:
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
然后采取此行动:
[HttpPost]
public void Add(int id)
{
}
现在您可以触发对/api/friends/add/123
网址的POST请求。
[HttpPost]
属性确保只能使用POST谓词调用此操作。如果你删除它,你仍然可以通过GET调用它,但这是你不应该对可能修改服务器状态的动作做的事情。