go中url.ParseRequestURI和url.Parse函数的踩坑记

news2024/11/16 23:59:40

使用url.Parse函数

package main

import (
	"fmt"
	"net/url"
)

func main() {
	attrRawUrl := "http://localhost?wifi=true&carrier=#Staysafe AIS&os=android"

	urlObj, _ := url.Parse(attrRawUrl)

	fmt.Printf("urlObj:%#v\n", *urlObj)
}

将解析后的urlObj变量打印出来如下:
go复制代码url.URL{
    Scheme:"http", 
    Opaque:"", 
    User:(*url.Userinfo)(nil), 
    Host:"localhost", 
    Path:"", 
    RawPath:"", 
    OmitHost:false, 
    ForceQuery:false, 
    RawQuery:"wifi=true&carrier=", 
    Fragment:"Staysafe AIS&os=android", 
    RawFragment:"Staysafe AIS&os=android"
}

这里,我们注意解析后的RawQuery字段的值是"wifi=true&carrier=",carrier的值是空,#号后面的值被填充到了Fragment字段中。
在使用urlObj.Values函数将RawQuery字段的字符串解析到map时,发现carrier后面的参数os竟然没有解析到。
使用url.ParseRequestURI函数

package main

import (
	"fmt"
	"net/url"
)

func main() {
	attrRawUrl := "http://localhost?wifi=true&carrier=#Staysafe AIS&os=android"

	urlObj, _ := url.ParseRequestURI(attrRawUrl)

	fmt.Printf("urlObj:%#v\n", *urlObj)
}

我们再来打印出urlObj变量,如下:
go复制代码url.URL{
    Scheme:"http", 
    Opaque:"", 
    User:(*url.Userinfo)(nil), 
    Host:"localhost", 
    Path:"", 
    RawPath:"", 
    OmitHost:false, 
    ForceQuery:false, 
    RawQuery:"wifi=true&carrier=#Staysafe AIS&os=android", 
    Fragment:"", 
    RawFragment:""
}

这里RawQuery字段中的值是"wifi=true&carrier=#Staysafe AIS&os=android",#号后面的字符串并未被阶段。
url.Parse和url.ParseRequestURI的区别
我们再来看下这两个函数的实现是有什么区别

在这里插入图片描述
如上图,在实现上,url.Parse显示以 将 # 符号前后做了截断处理。而ParseRequestURI函数则没有。其他的两个函数基本是一样的。
URL中的#号是什么
#代表网页中的一个位置。其右面的字符,就是该位置的标识符。比如

http://www.example.com/index.html#print

就代表网页index.html的print位置。浏览器读取这个URL后,会自动将print位置滚动至可视区域。
为网页位置指定标识符,有两个方法。一是使用锚点,比如,二是使用id属性,比如


HTTP请求不包括#
#是用来指导浏览器动作的,对服务器端完全无用。所以,HTTP请求中不包括#。
比如,访问下面的网址

http://www.example.com/index.html#print

浏览器实际发出的请求是这样的:

GET /index.html HTTP/1.1

Host: www.example.com

可以看到,只是请求index.html,根本没有"#print"的部分。
#后的字符
在第一个#后面出现的任何字符,都会被浏览器解读为位置标识符。这意味着,这些字符都不会被发送到服务器端。
比如,下面URL的原意是指定一个颜色值:
http://www.example.com/?color=#fff

但是,浏览器实际发出的请求是:

GET /?color= HTTP/1.1

Host: www.example.com

可以看到,"#fff"被省略了。只有将#转码为%23,浏览器才会将其作为实义字符处理。也就是说,上面的网址应该被写成:
go复制代码http://example.com/?color=%23fff

总上所述,#号的面向对象是浏览器,而非服务端。如果是通过服务端给服务端发送url请求,则服务端依然会收到#号后的字符。所以在解析时,就需要注意用对相应的函数。

总结

#号是给浏览器用来定位网页位置用的。在url中包含#号时,浏览器不会将其后面的字符串发送到服务端。但如果是服务端通过程序发送url时,则不受这个限制。所以,在使用url.Parse解析url地址时,需要注意其会以#号为基准,将url地址截取为两部分。 但url.ParseRequestURI则不会。在实际使用中根据自己的使用场景要正确选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1156161.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python 安装 pyquicklz 库函数

问题描述: 安装 pyquicklz 库的时候 报错 error: subprocess-exited-with-error 解决方法: 安装 Cython 库: pip install Cython -i https://pypi.tuna.tsinghua.edu.cn/simple/ 安装 Microsoft C Build Tools Microsoft C Build Tools 的下…

Spring MVC 续

一、拦截器 1.介绍拦截器 1.拦截器(springmvc提供) 2.只拦截控制单元(生效必须配置拦截器) 3.会拦截静态资源,使用拦截器时,尽量使用局部配置,配置拦截的控制单元即可。 注意:只…

python多环境并存

1. 现况简介 1.1 本人windows所存Python版本 Python 2.7 Python 3.6 Python 3.7 1.2 Python 各版本路径如下 Python 2.7Python 3.6Python 3.7C:\Server\Python27C:\Server\Python36C:\Server\Python37 1.3 系统环境变量配置如下 2. 解决方案 2.1 进入目录 cd C:\Server…

【机器学习】三、特征选择与稀疏学习

特征选择和稀疏学习 子集搜索与评价 对象都有很多属性来描述,属性也称为特征(feature),用于刻画对象的某一个特性。对一个学习任务而言,有些属性是关键有用的,而有些属性则可能不必要纳入训练数据。对当前学…

win10 下编译ffmpeg3.36.tar.gz

所需工具: win10 ffmpeg3.36.tar.gz。 或其他版本,下载地址:Index of /releases msys2。 下载地址:http://www.msys2.org。 Visual Studio 2017。 1. 安装MSYS MSYS2像是windows下的一个子系统,…

`.NET Web`新人入门必学项目`EarthChat`

.NET Web新人入门必学项目EarthChat EarthChat是一个基于.NET 7的实战项目,EarthChat提供了很多的最佳实践,EarthChat的目标也是成为一个很多人都喜欢的大型聊天业务系统,并且将结合SKAI大模型进行打造智能业务系统,在EarthChat中…

05_es分布式搜索引擎1

一、初始elasticsearch 1.elasticsearch简单介绍 ①什么是elasticsearch? 开源的分布式搜索引擎,实现海量数据搜索,日志统计,分析,系统监控等功能 ②什么是elastic stack? 是以elasticsearch为核心的技…

【COMP304 LEC4 LEC5】

LEC 4 1. Truth-Functionality Propositional logic 的connectives(连接词)are truth-functional 但是,有时候的描述不是true-functional的,比如:"Knowing that", "It is necessary that",&quo…

微信小程序开发-微信支付退款功能【附有完整代码】

之前有写过详细的微信支付功能:微信支付 我们使用weixin-java-pay的jar包等,配置上的流程同微信支付,可以看上面的文章。 退款使用的WxPayService类的refundV3方法。使用该方法需要在微信支付配置的基础上加上:apiclient_key.pem…

Linux期末复习——多线程编程

线程概述 线程基本编程 函数说明 pthread_create(): 创建线程,成功返回0pthread_exit(): 主动退出线程,成功返回0pthread_join(): 挂起线程等待结束,成功返回0pthread_cancel在别的线程中终止另一个线程的执行,成功返回0 示例…

sql文件批处理程序-java桌面应用

项目效果: 支持sql文件夹批处理,选中文件夹或者sql文件 支持测试连接,可以校验数据库配置 支持报错回显,弹出报错文件名以及问题语句 支持在程序中修改错误语句,用户可以选择保存修改内容继续执行或不保存修改只执行…

线性代数 第四章 线性方程组

一、矩阵形式 经过初等行变换化为阶梯形矩阵。当,有解;当,有非零解。 有解,等价于 可由线性表示 克拉默法则:非齐次线性方程组中,系数行列式,则方程组有唯一解,且唯一解为 其中是…

TestCenter测试管理工具

estCenter(简称TC)一款广受好评的测试管理工具,让测试工作更规范、更有效率,实现测试流程无纸化,测试数据资产化。 产品概述 TC流程图 产品功能 一、案例库 案例库集中化管理,支持对测试用例集中管理&…

Gartner报告 | Mendix再次成为低代码领导者!Mendix在愿景完整性和执行能力领域的排名最为靠前。

本文作者: Hans de Visser, Mendix 首席产品官 在最新发布的2023 Gartner魔力象限图™ 中对于企业级低代码应用程序平台,Gartner指出,企业IT领导者需要满足“应用程序开发向更高抽象级别迈进的步伐,并采用低代码平台来加速应用程序开发。” 此…

【华为】路由器以PPPoE拨号接入广域网

组网需求 用户希望以PPPoE拨号方式接入广域网,如图1所示,Router作为PPPoE客户端,得到PPPoE服务器的认证后获得IP地址,实现用户接入互联网的需求。内网网关地址(即VLANIF1接口的IP地址)为10.137.32.1/24。 …

N-131基于jsp,ssm物流快递管理系统

开发工具:eclipse,jdk1.8 服务器:tomcat7.0 数据库:mysql5.7 技术: springspringMVCmybaitsEasyUI 项目包括用户前台和管理后台两部分,功能介绍如下: 一、用户(前台)功能: 用…

UE5 Android下载zip文件并解压缩到指定位置

一、下载是使用市场的免费插件 二、解压缩是使用市场的免费插件 三、Android路径问题 windows平台下使用该插件没有问题,只是在Android平台下,只有使用绝对路径才能进行解压缩,所以如何获得Android下的绝对路径?增加C文件获得And…

生态扩展:Flink Doris Connector

生态扩展:Flink Doris Connector 官网地址: https://doris.apache.org/zh-CN/docs/dev/ecosystem/flink-doris-connector flink的安装: tar -zxvf flink-1.16.0-bin-scala_2.12.tgz mv flink-1.16.0-bin-scala_2.12.tgz /opt/flinkflink环境…

【c++|opencv】二、灰度变换和空间滤波---5.中值滤波

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 1. 中值滤波 #include<iostream> #include<opencv2/opencv.hpp> #include"Salt.h"using namespace cv; using namespace std;voi…