使用以下路线时:
curl -G \-d 'location_types=["city"]' \
-d 'type=adgeolocation' \
-d 'q=dub' \
-d 'access_token=<ACCESS_TOKEN>' \
https://graph.facebook.com/v2.11/search
控制器如下所示:
config.Routes.MapHttpRoute(
name: "new_device",
routeTemplate: "api/v1/devices",
defaults: new { controller = "Devices", action = "new_device" }
);
config.Routes.MapHttpRoute(
name: "devices_list",
routeTemplate: "api/v1/devices",
defaults: new { controller = "Devices", action = "devices_list", httpMethod = new HttpMethodConstraint(HttpMethod.Get) }
);
我的期望是,路由器将根据所使用的HttpMethod找到正确的路由,因为即使它使用的是相同的URI,也使用不同的HttpMethod。
但是相反,它失败并显示以下内容:
“消息”:“请求的资源不支持http方法'GET'。”
我的猜测是因为它找到了与URI匹配的内容,然后检查该方法是否相同。
是否有一种通过REST准则通过不同的Http方法使用相同URI的方法?我想念什么吗?
答案 0 :(得分:2)
好的,我检查了您的整个代码。我认为您正在尝试以复杂的方式实现通话。
以下代码用于配置:
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/v1/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
下面是您的控制器代码:
public class DevicesController : ApiController
{
[HttpPost]
[ResponseType(typeof(IHttpActionResult))]
[ActionName("newDevice")]
public IHttpActionResult NewDevice([System.Web.Http.FromBody] Device device)
{
return null;
}
[HttpGet]
[ResponseType(typeof(IHttpActionResult))]
[ActionName("devices_list")]
public List<Device> GetAllDevices()
{
return null;
}
}
我删除了ValidateModel。我认为这是您的自定义属性或与内置nuget包相关的某种方式。
无论如何,请使用Postman或任何HTTP客户端工具执行调用。它应该可以正常工作,因为它在我上面使用上述代码时一直有效。
示例呼叫:
https://localhost:44370/api/v1/devices/devices_list =>获取。
https://localhost:44370/api/v1/devices/newDevice =>发布。 提供主体作为对象的调用。