Private Sub Command1_Click()
创新互联服务项目包括江源网站建设、江源网站制作、江源网页制作以及江源网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,江源网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到江源省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
Dim myurl1 As String, send_data As String, my_head As String
myurl1 = "" '要登录的地址
send_data = "username=#####password=*****" '查看登录网页源文件发现需要post这两个值
'其中一个是username,另外一个是password,并将#位置填写登录名,*位置填写登录代码
my_head = "Content-Type: application/x-www-form-urlencoded "
Inet1.Execute myurl1, "Post", send_data, my_head
Do Until Inet1.StillExecuting = False '这里阻塞前面的Inet1,确保登陆成功之后再取页面,你可以将此Do取消了试一次。
DoEvents
Loop
End Sub
最普遍的答案
回来之后寻思了很久,他到底是想问我什么?我一直就觉得GET和POST没有什么除了语义之外的区别,自打我开始学习Web编程开始就是这么理解的。
可能很多人都已经猜到了,他要的答案是:
GET使用URL或Cookie传参。而POST将数据放在BODY中。
GET的URL会有长度上的限制,则POST的数据则可以非常大。
POST比GET安全,因为数据在地址栏上不可见。
但是很不幸,这些区别全是错误的,更不幸的是,这个答案还是Google搜索的头版头条,然而我根本没想着这些是答案,因为在我看来他们都是错的。我来一一解释一下。
1. GET和POST与数据如何传递没有关系
GET和POST是由HTTP协议定义的。在HTTP协议中,Method和Data(URL, Body, Header)是正交的两个概念,也就是说,使用哪个Method与应用层的数据如何传输是没有相互关系的。
HTTP没有要求,如果Method是POST数据就要放在BODY中。也没有要求,如果Method是GET,数据(参数)就一定要放在URL中而不能放在BODY中。
那么,网上流传甚广的这个说法是从何而来的呢?我在HTML标准中,找到了相似的描述。这和网上流传的说法一致。但是这只是HTML标准对HTTP协议的用法的约定。怎么能当成GET和POST的区别呢?
而且,现代的Web Server都是支持GET中包含BODY这样的请求。虽然这种请求不可能从浏览器发出,但是现在的Web Server又不是只给浏览器用,已经完全地超出了HTML服务器的范畴了。
知道这个有什么用?我不想解释了,有时候就得自己痛一次才记得住。
2. HTTP协议对GET和POST都没有对长度的限制
HTTP协议明确地指出了,HTTP头和Body都没有长度的要求。而对于URL长度上的限制,有两方面的原因造成:
浏览器。据说早期的浏览器会对URL长度做限制。据说IE对URL长度会限制在2048个字符内(流传很广,而且无数同事都表示认同)。 但我自己试了一下,我构造了90K的URL通过IE9访问live.com,是正常的。网上的东西,哪怕是Wikipedia上的,也不能信。
服务器。URL长了,对服务器处理也是一种负担。原本一个会话就没有多少数据,现在如果有人恶意地构造几个几M大小的URL,并不停地访问你的服 务器。服务器的最大并发数显然会下降。另一种攻击方式是,把告诉服务器Content-Length是一个很大的数,然后只给服务器发一点儿数据,嘿嘿, 服务器你就傻等着去吧。哪怕你有超时设置,这种故意的次次访问超时也能让服务器吃不了兜着走。有鉴于此,多数服务器出于安全啦、稳定啦方面的考虑,会给 URL长度加限制。但是这个限制是针对所有HTTP请求的,与GET、POST没有关系。
安全不安全和GET、POST没有关系
我觉得这真是中国特色。我讲个小段子,大家应该可以体会出这个说法多么的可笑。
觉得POST数据比GET数据安全的人会说
“防君子不防小人;中国小白多,能防小白用户就行了。”
“哼,”我不以为然,“那你怎么不说,URL参数都Encode过了,或是Base64一下,小白也看不懂啊。”
那人反驳道,“Encode太简单了,聪明点儿的小白很容易就可以Decode并修改掉。”
我笑道,“五十步笑百步耳,再聪明点儿的小白还会截包并重发呢,Opera就有这功能。”
那人阴险地祭出神器——最终解释权,说,“这个不算小白。”
我日啊。
最后一点儿感想
我之前一直做Windows桌面应用,对Web开发无甚了解,直到一年多前转做服务器端开发,才开始接触到HTTP。(注意,我说的是HTTP,不 是HTML。服务器开放接口是基于REST理念设计的,使用的协议是HTTP,但是传输的内容不是HTML。这不是Web Server,而是一个Web Service)
所以我对于GET和POST的理解,是纯粹地来源于HTTP协议。他们只有一点根本区别,简单点儿说,一个用于获取数据,一个用于修改数据。具体的请参考RFC文档。
如果一个人一开始就做Web开发,很可能把HTML对HTTP协议的使用方式,当成HTTP协议的唯一的合理使用方式。从而犯了以偏概全的错误。
可能有人会觉得我钻牛角尖。我只是不喜欢模棱两可,不喜欢边界不清、概念不明,不喜欢“拿来主义”,也不喜欢被其它喜欢钻牛角尖的人奚落得无地自容。
“知之为知之,不知为不知,是知也。”
业务当中有需要分发http.request.body的场景。比如微信回调消息只能指定一个地址,所以期望可以复制一份消息发给其他服务。由服务B和接收微信回调的服务A一起处理微信回调信息。
最开始考虑的是直接转发http.request。使用 ReverseProxy 直接将http.request由服务A转发给服务B。但是微信涉及到验证等问题,完全调整好非常麻烦。所以转换思路,打算将http.request.body的内容直接post给服务B。
可是http.request是readcloser。我们将http.request readAll的时候讲无法再次读取http.request里面的信息。
其中c表示的是http的上下文
1.我们先将body从http.request里面读取出来,保存到一个变量里面。
2.然后再将变量里面的数据使用ioutil.NopCloser方法写回到http.request里面。
NopCloser returns a ReadCloser with a no-op Close method wrapping the provided Reader r.
NopCloser用一个无操作的Close方法包装Reader r返回一个ReadCloser接口。
这样我们就可以再次使用c.request来进行处理了。
golang复用http-request-body
当客户端在 发出POST请求时/albums,您希望将请求正文中描述的专辑添加到现有专辑数据中。
为此,您将编写以下内容:
1、编写代码
a.添加代码以将专辑数据添加到专辑列表。
在此代码中:
1)用于Context.BindJSON 将请求正文绑定到newAlbum。
2) album将从 JSON 初始化的结构附加到albums 切片。
3)向响应添加201状态代码,以及表示您添加的专辑的 JSON。
b.更改您的main函数,使其包含该router.POST函数,如下所示。
在此代码中:
1)将路径中的POST方法与 /albumspostAlbums函数相关联。
使用 Gin,您可以将处理程序与 HTTP 方法和路径组合相关联。这样,您可以根据客户端使用的方法将发送到单个路径的请求单独路由。
a.如果服务器从上一节开始仍在运行,请停止它。
b.从包含 main.go 的目录中的命令行,运行代码。
c.从不同的命令行窗口,用于curl向正在运行的 Web 服务发出请求。
该命令应显示添加专辑的标题和 JSON。
d.与上一节一样,使用curl检索完整的专辑列表,您可以使用它来确认添加了新专辑。
该命令应显示专辑列表。
当客户端向 发出请求时GET /albums/[id],您希望返回 ID 与id路径参数匹配的专辑。
为此,您将:
a.在您在上一节中添加的函数下方postAlbums,粘贴以下代码以检索特定专辑。
此getAlbumByID函数将提取请求路径中的 ID,然后找到匹配的专辑。
在此代码中:
(1)Context.Param用于从 URL 中检索id路径参数。当您将此处理程序映射到路径时,您将在路径中包含参数的占位符。
(2)循环album切片中的结构,寻找其ID 字段值与id参数值匹配的结构。如果找到,则将该album结构序列化为 JSON,并将其作为带有200 OK HTTP 代码的响应返回。
如上所述,实际使用中的服务可能会使用数据库查询来执行此查找。
(3)如果找不到专辑,则返回 HTTP 404错误。
b.最后,更改您的main,使其包含对router.GET的新调用,路径现在为/albums/:id ,如以下示例所示。
在此代码中:
(1)将/albums/:id路径与getAlbumByID功能相关联。在 Gin 中,路径中项目前面的冒号表示该项目是路径参数。
a.如果服务器从上一节开始仍在运行,请停止它。
b.在包含 main.go 的目录中的命令行中,运行代码以启动服务器。
c.从不同的命令行窗口,用于curl向正在运行的 Web 服务发出请求。
该命令应显示您使用其 ID 的专辑的 JSON。如果找不到专辑,您将收到带有错误消息的 JSON。
恭喜!您刚刚使用 Go 和 Gin 编写了一个简单的 RESTful Web 服务。
本节包含您使用本教程构建的应用程序的代码。
card id="main1" title="登录网站"
p align='left'
select name="nameorid" value="name"
option value="name"用户名/option
option value="id"用户ID/option
/select
br/
input type="text" format="*m" name="logname" maxlength="15"/
br/b密码:/b
br/
input type="password" format="*m" name="logpass" maxlength="15"/
br/
anchor1.登录
go href="%=http_start%waploginchk.asp" method="post"
postfield name="logname" value="$(logname)"/
postfield name="logpass" value="$(logpass)"/
postfield name="logintype" value="1"/
postfield name="nameorid" value="$(nameorid)"/
postfield name="siteid" value="%=siteid%"/
postfield name="classid" value="%=classid%"/
/go
/anchor
可以传套wap程序给你,自己参考,asp的.
用Post,不要用PostForm,至於编码可以自己用2楼的方法然后urlencode,附上代码片段
resp, err := http.Post(reqUrl, "application/x-www-form-urlencoded", strings.NewReader(fmt.Sprintf( "__VIEWSTATE=%s__EVENTVALIDATION=%stxtUid=000000000txtPwd=xxxxxxxxselKind=1selKind=1btLogin=%B5%C7%C2%BD", url.QueryEscape(viewstate), url.QueryEscape(eventvalidation), )),)