将包含查询字符串的URL作为参数传递给ASP.Net Web API GET?

时间:2014-03-20 10:17:28

标签: asp.net-web-api url-parameters asp.net-web-api-routing

我正在尝试将URL作为字符串参数传递给WEB API GET方法。

控制器:

public class LinksController : ApiController
{
    public HttpResponseMessage Get(string targetUrl)
    {
        //query db with targetURL
    }
}

目的是查询数据库以查看是否存储了URL。这适用于简单的URL和URL,其查询字符串包含单个参数,如:

我遇到的问题特别是当查询字符串包含多个参数时,例如

调试时,targetUrl的值仅为“... / watch?v = nLPE4vhSBx4”,表示& feature = youtube_gdata丢失

GET请求如下所示:

http://localhost:58056/api/links?targetUrl=http://www.youtube.com/watch? v=nLPE4vhSBx4&feature=youtube_gdata

我还尝试在WebApiConfig.cs中添加以下路由:

config.Routes.MapHttpRoute(
    name: "Links",
    routeTemplate: "api/links/{targetUrl}",
    defaults: new { controller = "Links", targetUrl= RouteParameter.Optional }
);

但是GET请求会导致400 Bad Request。

所以我的问题是,不能这样做吗?我想要完整的网址!或者我是否需要更改方法标头以使用[FromBody]属性并将其作为JSON对象传递?

1 个答案:

答案 0 :(得分:0)

您应该URLEncode您的目标网址参数,以便它不会被误认为后续查询字符串参数。这意味着您指定的URL应显示为:

http://localhost:58056/api/links?targetUrl=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DnLPE4vhSBx4%26feature%3Dyoutube_gdata

然后在Get方法中,URLDecode作为参数传递的字符串。

这两种方法都可以在System.Web.HttpUtility

中找到