博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
http协议之post请求(socket请求web内容)
阅读量:6084 次
发布时间:2019-06-20

本文共 2222 字,大约阅读时间需要 7 分钟。

hot3.png

http请求与响应的协议格式在中已经介绍过了,并对get请求进行了模拟测试,下面就对post请求进行测试。

1.首先搭建测试环境:

新建个web项目posttest,编写一个servlet与html页面来进行post访问:

LoginServlet:

import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;@WebServlet(name="login",urlPatterns={"/login"})public class LoginServlet extends HttpServlet {	@Override	protected void doPost(HttpServletRequest req, HttpServletResponse resp)			throws ServletException, IOException {		resp.setContentType("text/html");		PrintWriter out = resp.getWriter();				String name=req.getParameter("name");		String pwd = req.getParameter("pwd");				if(name.equals("hello")&&pwd.equals("world")) {			out.print("welcome," + name);		} else {			out.print("sorry, access denied");		}		out.flush();	}}

login.html:

Insert title here
name :
 
password:
 

运行项目,截包:

返回数据包:

2.编程模拟:

public class PostDate {	public static void main(String[] args) throws UnknownHostException, IOException {		Socket socket = new Socket("127.0.0.1",8080);				String requestLine="POST /posttest/login HTTP/1.1\r\n";        String host="Host: localhost:8080\r\n";        String contentType="Content-Type: application/x-www-form-urlencoded\r\n";        String body = "name=hello&pwd=world";//        String contentLength="Content-Length: "+body.length()+"\r\n";                OutputStream os = socket.getOutputStream();        os.write(requestLine.getBytes());        os.write(host.getBytes());        os.write(contentType.getBytes());//        os.write(contentLength.getBytes());        os.write("\r\n".getBytes());        os.write(body.getBytes());        os.flush();               BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));        String tmp = null;        while((tmp=reader.readLine())!=null) {            System.out.println(tmp);        }        socket.close();	}}

注意,如果直接运行将不能完成请求,并导致服务器出现异常,返回500状态码(内部程序错误),发送的数据包如下 :

这是因为请求数据不完整造成的。若要使程序运行,需加上Content-Length请求头(上面程序中被注释掉的内容)。

转载于:https://my.oschina.net/wisedream/blog/128049

你可能感兴趣的文章
Java多线程系列目录
查看>>
冷门_可变参数方法
查看>>
powerdesigner 外键生成sql语句设置在创建表里面
查看>>
Android之Monkey全参数(包含隐藏参数)
查看>>
可变参数
查看>>
搭建LoadRunner中的场景(三)场景的执行计划
查看>>
[开源]KJFramework.Message 智能二进制消息框架 -- 对于数组的极致性优化
查看>>
Android SDK与ADT版本不匹配的解决
查看>>
ehcache缓存的简单使用
查看>>
tomcat内存溢出
查看>>
DFS Codeforces Round #290 (Div. 2) B. Fox And Two Dots
查看>>
POJ3581:Sequence——题解
查看>>
BZOJ4009 & 洛谷3242 & LOJ2113:[HNOI2015]接水果——题解
查看>>
用dom4j解析xml文件并执行增删改查操作
查看>>
Shell脚本排序总结
查看>>
C++ map<char *,int>
查看>>
在个人笔记本上安装centos6.8
查看>>
python 注册
查看>>
转 python数据类型详解
查看>>
Thread 初学(二)——线程同步
查看>>