手动构造HTTP请求实例讲解

本文详细讲解了如何手动构造HTTP请求,包括GET和POST两种方式,特别是POST中application/x-www-form-urlencoded和multipart/form-data的形式。同时,介绍了常见的HTTP请求头如Accept、Content-Type、Cache-Control等的作用,帮助读者理解HTTP请求的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过本文,你能明白:

        1. HTTP 数据请的的方式GET与POST;

        2. GET与POST请求体的结构;

        3. 常用的HTTP请求头及其意义。

1. 带参数的普通页面请求

如果我们想向百度请求查询关键字“你好世界”并将结果页返回。
GET方式
浏览器地址栏中直接输入:http://www.baidu.com/s?wd=%C4%E3%BA%C3%CA%C0%BD%E7,wd后的内容即是我们想查询的“你好世界”,其内容请务必进行URIEncode。Encode的编写这里是GBK,这与请求的WEB服务器接收的编码有关,如果不手动进行encode,浏览器也会帮你encode的,如Chrome默认的encode是UTF-8,如果对方器恰好只支持GBK的话,那么就悲剧了。例如虽然百度GBK与UTF-8都支持,但我们以UTF-16进行编码的话,结果就是:




如果有多个数据的话,可以使用“&”进行连接,如:http://www.baidu.com/s?wd=%C4%E3%BA%C3%CA%C0%BD%E7&type=image。尽管RFC2616没有对请求的参数进行限制,每种浏览器或WEB服务器对它的限制也不同,但最安全是不超过255Bytes[http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.2.1]。

===============================延伸阅读================================
+许多web服务器或代理服务器会以日志方式记录下访问的URL,因此使用GET进行敏感数据传输是一件非常不理智的事。
+MSIE与Safari对URL长度的限制大约是2KB,Opera则是4KB,Firefox大约是8KB

=============================================================
POST方式——application/x-www-form-urlencoded 方式
这里我们使用Fiddler来构造请求,同上,向www.renren.com发送相同的请求。



RAW 数据如下:

POST /ajax/ShowCaptcha HTTP/1.1\r\n
Content-Type: application/x-www-form-urlencoded\r\n
Host: www.renren.com\r\n
Content-Length: 36\r\n
\r\n
email=%E5%B7%A5&password=asdasdsadas

这里的参数同样需要URIEncode,头与Playload必须有一行间距。MIME类型:application/x-www-form-urlencoded 是RFC2616规定的表单类型之一,其参数表示类似GET,即是key=value成对出现的,与GET方式相同,另一个是multipart/form-data(http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4),如果想要传入图片等富元素application/x-www-form-urlencoded 就无能为力了,这时需要使用multipart/form-data,下面会讲。这里顺便说说常用的HTTP请求头:

  1. Accept:
    text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 //浏览器告知其能解析的文件mime类型,q是权值,0<q<=1,不写的话,默认为1
  2. Accept-Charset:
    GBK,utf-8;q=0.7,*;q=0.3 //浏览器告知其能解析的字符,这里GBK是首选
  3. Accept-Encoding:
    gzip,deflate,sdch //返回文件的编码gzip压缩,DeflateSDCH压缩
  4. Cache-Control:
    no-cache // 缓存控件,表示不进行缓存,除此之外,还有max-age,s-maxagemust-revalidate可填,具体请参数延伸阅读[1]
  5. Connection:
    keep-alive // 表示保持TPC连接,另外还有close可选,如果是短请求,即请求之后不大可能再请求数据,可以用之
  6. Referer:
    http://www.taobao.com/index_global.php // 请求发送时所在的页面,可以用这个来记录用户的访问路径,用于分析非常有效
  7. User-Agent:
    Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.168 // 浏览器标识

===============================延伸阅读================================
+关于HTTP头更详细信息可以阅读:

============================ =================================

POST方式——multipart/form-data 方式
同样我们向人人发送登录请求。构造的HTTP请求如下:

可以使用使用multipart/form-data比application/x-www-form-urlencoded要复杂得多,当然其也要强大许多,这里需要注意的是这种方法需要一个Boundry,通常是随机的字符串,这里是“xffxwqkxrgviutbruvdlniiluvhlqcjq”,就申明在Content-Type之后,别与发送的内容重复就好了。每两个分隔符之间就是一项表单数据,如Content-Disposition: form-data; name="email",name指的是该项的name,相当于<input name="email"/>,在后端可以使用这个name来得到数据,Content-Type: text/plain 指的是数据的类型,这里是纯文本的,如果是文件之类的就要靠这个了。例如我们抓取头像上传时的请求,如下:




绿色部分就是上传的头像的二进制数据了,注意它的MIME类型是application/octet-stream,也就是字节流信息,如果需要在Java代码里获取到这个文件,可以使用 org.apache.commons.fileupload 包。 需要注意的是,结束分隔符稍稍有点不一样,后面要多加两个dash,即"--"。如下图:



这里以我的ActionScript脚本为例子,展示手动构造HTTP multipart/form-data类型的POST请求:

public function uploadImage(bitmapData_:BitmapData):void
{
            ...
            
            var urlRequest_:URLRequest = new URLRequest(_requestURL);
            urlRequest_.method = URLRequestMethod.POST;
            
            urlRequest_.contentType = "multipart/form-data; boundary=" + UploadPostHelper.getBoundary();
            urlRequest_.data = UploadPostHelper.getPostData("image.jpg", jpgeEncoder_.encode(bitmapData_), urlVariables_);
            
            ...
}

UploadPostHelper.getPostData 的作用就是构造PlayLoad的主体

public static function getPostData(fileName:String, byteArray:ByteArray, parameters:Object = null):ByteArray {

			...
			//写入输入的参数
			for(var name:String in parameters) {
				postData = BOUNDARY(postData); //写入分隔符

				postData = LINEBREAK(postData); // 换行

				bytes = 'Content-Disposition: form-data; name="' + name + '"';
				for ( i = 0; i < bytes.length; i++ ) {
					postData.writeByte( bytes.charCodeAt(i) );
				}
				postData = LINEBREAK(postData);
				postData = LINEBREAK(postData); //数据与描述信息之间必须空一行

				postData.writeUTFBytes(parameters[name]);
				postData = LINEBREAK(postData);
			}

			
			postData = BOUNDARY(postData);
			postData = LINEBREAK(postData);
			bytes = 'Content-Disposition: form-data; name="Filedata"; filename="';
			for ( i = 0; i < bytes.length; i++ ) {
				postData.writeByte( bytes.charCodeAt(i) ); //写入字节

			}
			
			...
//关闭playload
			postData = BOUNDARY(postData);
			postData = DOUBLEDASH(postData); //写入 "--" 以表示结束

			return postData;
		}


===============================延伸阅读================================
+关于POST提交更详细的信息可以参考: http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1
+这里你可以找到上述UploadFileHelper的源代码: http://labs.findsubstance.com/d/as3-upload-encode-images/
============================ ==========================================


Fiddler作为一款广泛使用的网络请求抓包工具,其强大的功能对于开发者来说是不可或缺的。为了帮你更深入地理解如何使用Fiddler,这里会向你介绍操作步骤和分析方法。建议参考《Telerik fiddler使用》这本书,它将为你提供从基础到高级的使用教程和配置方法。 参考资源链接:[Telerik fiddler使用](https://wenku.youkuaiyun.com/doc/6412b6a2be7fbd1778d476c5?spm=1055.2569.3001.10343) 首先,确保已安装Fiddler,并启动程序。它会自动设置系统的网络配置,将所有HTTPHTTPS请求重定向到Fiddler代理。开启Fiddler后,在浏览器中访问你想要分析的网站或API,Fiddler会开始记录所有的网络通信数据。 在Fiddler界面中,你可以看到会话列表,每个会话代表一个HTTP请求和响应对。点击任何一个会话,下方的窗口会展示请求的详细信息,包括请求方法、URL、请求头、响应状态码和响应体等。对于JSON格式的数据,Fiddler支持格式化显示,这使得分析数据变得更为简单。 另外,Fiddler还提供了断点功能,允许你在请求发送前或响应返回前暂停请求或响应,从而进行手动的修改或分析。这对于调试复杂的应用场景非常有帮助。 通过Fiddler的Composer功能,你可以手动构造请求发送到服务器,并观察返回的响应。这在测试API时尤其有用。 学习如何使用Fiddler进行网络请求的抓包分析,不仅能够帮助你诊断网络问题,还能让你深入理解网络协议和应用程序的通讯机制。推荐《Telerik fiddler使用》这本书,它详细地讲解了Fiddler的各种功能和高级应用,能够帮助你在实际工作中更高效地使用Fiddler。在掌握了这些技能之后,你将能够更好地进行网络数据分析和问题定位。 参考资源链接:[Telerik fiddler使用](https://wenku.youkuaiyun.com/doc/6412b6a2be7fbd1778d476c5?spm=1055.2569.3001.10343)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值