Validation 使用GO中的标准包验证URL

Validation 使用GO中的标准包验证URL,validation,go,Validation,Go,GO中的标准包中是否有允许验证URL的函数 我在最初的搜索中没有发现任何东西, 我不想求助于正则表达式检查。是的,如果URL无效,则返回一个错误,而不是绝对URL,等等。返回的几乎任何内容都有效 import "net/url" ... u, err := url.ParseRequestURI("http://google.com/") if err != nil { panic(err) } 上述示例不会失败,但会: u, err := url.ParseRequestURI(

GO中的标准包中是否有允许验证URL的函数

我在最初的搜索中没有发现任何东西, 我不想求助于正则表达式检查。

是的,如果URL无效,则返回一个错误,而不是绝对URL,等等。返回的几乎任何内容都有效

import "net/url"

...


u, err := url.ParseRequestURI("http://google.com/")
if err != nil {
   panic(err)
}
上述示例不会失败,但会:

u, err := url.ParseRequestURI("http//google.com")

u, err := url.ParseRequestURI("google.com")

u, err := url.ParseRequestURI("/foo/bar")

这帮助我理解了标准库方法是如何工作的,希望它也能帮助你们中的一些人。请注意,所有这些值都不会抛出错误

package main

import (
    "fmt"
    "net/url"
)

func main() {
    urls := []string{
        "https",
        "https://",
        "",
        "http://www",
        "http://www.dumpsters.com",
        "https://www.dumpsters.com:443",
        "/testing-path",
        "testing-path",
        "alskjff#?asf//dfas",
    }
    for _, u := range urls {
        val, err := url.Parse(u)
        scheme := val.Scheme
        host := val.Host
        hostname := val.Hostname()
        path := val.Path
        fmt.Println("val        : "+u+" : ", val)
        fmt.Println("error      : "+u+" : ", err)
        fmt.Println("scheme     : "+u+" : ", scheme)
        fmt.Println("host       : "+u+" : ", host)
        fmt.Println("hostname   : "+u+" : ", hostname)
        fmt.Println("path       : "+u+" : ", path)
        fmt.Println()
    }
}
结果

val        : https :  https
error      : https :  <nil>
scheme     : https :
host       : https :
hostname   : https :
path       : https :  https

val        : https:// :  https:
error      : https:// :  <nil>
scheme     : https:// :  https
host       : https:// :
hostname   : https:// :
path       : https:// :

val        :  :
error      :  :  <nil>
scheme     :  :
host       :  :
hostname   :  :
path       :  :

val        : http://www :  http://www
error      : http://www :  <nil>
scheme     : http://www :  http
host       : http://www :  www
hostname   : http://www :  www
path       : http://www :

val        : http://www.dumpsters.com :  http://www.dumpsters.com
error      : http://www.dumpsters.com :  <nil>
scheme     : http://www.dumpsters.com :  http
host       : http://www.dumpsters.com :  www.dumpsters.com
hostname   : http://www.dumpsters.com :  www.dumpsters.com
path       : http://www.dumpsters.com :

val        : https://www.dumpsters.com:443 :  https://www.dumpsters.com:443
error      : https://www.dumpsters.com:443 :  <nil>
scheme     : https://www.dumpsters.com:443 :  https
host       : https://www.dumpsters.com:443 :  www.dumpsters.com:443
hostname   : https://www.dumpsters.com:443 :  www.dumpsters.com
path       : https://www.dumpsters.com:443 :

val        : /testing-path :  /testing-path
error      : /testing-path :  <nil>
scheme     : /testing-path :
host       : /testing-path :
hostname   : /testing-path :
path       : /testing-path :  /testing-path

val        : testing-path :  testing-path
error      : testing-path :  <nil>
scheme     : testing-path :
host       : testing-path :
hostname   : testing-path :
path       : testing-path :  testing-path

val        : alskjff#?asf//dfas :  alskjff#?asf//dfas
error      : alskjff#?asf//dfas :  <nil>
scheme     : alskjff#?asf//dfas :
host       : alskjff#?asf//dfas :
hostname   : alskjff#?asf//dfas :
path       : alskjff#?asf//dfas :  alskjff
val:https:https
错误:https:
方案:https:
主机:https:
主机名:https:
路径:https:https
val:https://:https:
错误:https://:
方案:https://:https
主机:https://:
主机名:https://:
路径:https://:
瓦尔::
错误::
方案::
主持人:
主机名::
路径::
瓦尔:http://www :  http://www
错误:http://www :  
方案:http://www :http
主持人:http://www :www
主机名:http://www :www
路径:http://www :
瓦尔:http://www.dumpsters.com :  http://www.dumpsters.com
错误:http://www.dumpsters.com :  
方案:http://www.dumpsters.com :http
主持人:http://www.dumpsters.com :www.dumpsters.com
主机名:http://www.dumpsters.com :www.dumpsters.com
路径:http://www.dumpsters.com :
瓦尔:https://www.dumpsters.com:443 :  https://www.dumpsters.com:443
错误:https://www.dumpsters.com:443 :  
方案:https://www.dumpsters.com:443 :https
主持人:https://www.dumpsters.com:443 :www.dumpsters.com:443
主机名:https://www.dumpsters.com:443 :www.dumpsters.com
路径:https://www.dumpsters.com:443 :
val:/testing path:/testing path
错误:/testing路径:
方案:/测试路径:
主机:/testing路径:
主机名:/testing路径:
路径:/testing path:/testing path
val:测试路径:测试路径
错误:测试路径:
方案:测试路径:
主机:测试路径:
主机名:测试路径:
路径:测试路径:测试路径
val:alskjff#?asf//dfas:alskjff#?asf//dfas
错误:alskjff#?asf//dfas:
方案:alskjff#?asf//dfas:
主持人:alskjff#?asf//dfas:
主机名:alskjff#?asf//dfas:
路径:alskjff#?asf//dfas:alskjff

接受的答案允许空
http://
和相关URL,如
/foo/bar
。如果您希望进行更严格的检查,这将拒绝以下内容:

import "net/url"

func IsUrl(str string) bool {
    u, err := url.Parse(str)
    return err == nil && u.Scheme != "" && u.Host != ""
}
例如:

答案是:

最后一个“http:/192.158.1/1”未通过。可能是应该匹配所有允许域,但将是复杂的

这里有一个@Xeoncross的例子,我很确定这是一个有效的URL。看,你是对的@Not_a_Golfer有什么变化吗?相对URL现在通过
u,err:=url.ParseRequestURI(“/foo/bar”)
这将通过Go 1.15。这使我无法实现内置的原样。当str不是ip时,还需要验证str中的if“。”
func IsUrl(str string) bool {
    url, err := url.ParseRequestURI(str)
    if err != nil {
        log.Info(err.Error())
        return false
    }

    address := net.ParseIP(url.Host)
    log.Infow("url-info", "host", address)

    if address == nil {
        log.Infow("url-info", "host", url.Host)

        return  strings.Contains(url.Host, ".") 
    }

    return true
}
func Test_IsAllowUrl(t *testing.T) {
    assert.True(t, IsUrl("http://google.com"))
    assert.True(t, IsUrl("http://w.com/cn"))
    assert.True(t, IsUrl("http://192.158.0.1:90"))
    assert.False(t, IsUrl("http://w"))
    assert.False(t, IsUrl("fsw"))
    assert.False(t, IsUrl("http://192.158.1/1"))

}