首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何构建Url?

如何构建Url?
EN

Stack Overflow用户
提问于 2013-11-23 15:44:05
回答 3查看 114.6K关注 0票数 86

在.NET中是否有任何可用的辅助类来允许我构建一个Url?

例如,如果用户输入一个字符串:

代码语言:javascript
复制
stackoverflow.com

我试着把它传递给HttpWebRequest

代码语言:javascript
复制
WebRequest.CreateHttp(url);

它将失败,因为它不是一个有效的url (它没有前缀)。

我希望能够解析用户输入的部分url:

代码语言:javascript
复制
Uri uri = new Uri(url);

然后修复丢失的碎片:

代码语言:javascript
复制
if (uri.Port == 0)
   uri.Port = 3333;
if (uri.Scheme == "")
   uri.Scheme = "https";

.NET是否有可用于解析和操作Uri的类?

UriBuilder类无法完成这项工作

用户输入的值(例如stackoverflow.com:3333)是有效的;我只需要一个类来分离它。我尝试使用UriBuilder类:

代码语言:javascript
复制
UriBuilder uriBuilder = new UriBuilder("stackoverflow.com:3333");

不幸的是,UriBuilder类无法处理URI:

  • uriBuilder.Path = 3333
  • uriBuilder.Port = -1
  • uriBuidler.Scheme = stackoverflow.com

所以我需要一个能够理解host:port的类,当, but could be变得特别重要时,它就变得特别重要了。

奖金喋喋不休

控制台应用程序。

从另一个问题

一些需要解析的URL示例:

  • server:8088
  • server:8088/func1
  • server:8088/func1/SubFunc1
  • http://server
  • http://server/func1
  • http://server/func/SubFunc1
  • http://server:8088
  • http://server:8088/func1
  • http://server:8088/func1/SubFunc1
  • magnet://server
  • magnet://server/func1
  • magnet://server/func/SubFunc1
  • magnet://server:8088
  • magnet://server:8088/func1
  • magnet://server:8088/func1/SubFunc1
  • http://[2001:db8::1]
  • http://[2001:db8::1]:80

Url的格式是:

代码语言:javascript
复制
  foo://example.com:8042/over/there?name=ferret#nose
  \_/   \_________/ \__/\_________/\__________/ \__/
   |         |        |     |           |        |
scheme      host    port   path       query   fragment

奖金喋喋不休

再次指出,UriBuilder不起作用:

EN

回答 3

Stack Overflow用户

发布于 2013-11-23 15:47:10

如果需要确保用户输入时出现的某些字符串是有效的url,则可以使用Uri.TryCreate方法:

代码语言:javascript
复制
Uri uri;
string someUrl = ...
if (!Uri.TryCreate(someUrl, UriKind.Absolute, out uri))
{
    // the someUrl string did not contain a valid url 
    // inform your users about that
}
else
{
    var request = WebRequest.Create(uri);
    // ... safely proceed with executing the request
}

另一方面,如果您想要在.NET中构建urls,那么就有专门为此目的而设计的UriBuilder类。让我们举个例子。假设您希望构建以下url:http://example.com/path?foo=bar&baz=bazinga#some_fragment,其中barbazinga值来自用户:

代码语言:javascript
复制
string foo = ... coming from user input
string baz = ... coming from user input

var uriBuilder = new UriBuilder("http://example.com/path");
var parameters = HttpUtility.ParseQueryString(string.Empty);
parameters["foo"] = foo;
parameters["baz"] = baz;
uriBuilder.Query = parameters.ToString();
uriBuilder.Fragment = "some_fragment";

Uri finalUrl = uriBuilder.Uri;
var request = WebRequest.Create(finalUrl);
... safely proceed with executing the request
票数 78
EN

Stack Overflow用户

发布于 2013-11-23 15:49:15

您可以使用UriBuilder类。

代码语言:javascript
复制
var builder = new UriBuilder(url);
builder.Port = 3333
builder.Scheme = "https";

var result = builder.Uri;
票数 20
EN

Stack Overflow用户

发布于 2017-04-08 02:14:56

要想有效,URI需要有方案组件。"server:8088“不是有效的URI。"http://server:8088“是。请参阅https://www.rfc-editor.org/rfc/rfc3986

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20164298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档