文档章节

http协议之post请求(socket请求web内容)

pseudo
 pseudo
发布于 2013/05/06 23:07
字数 405
阅读 896
收藏 15

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:



<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="login" method="post">
name :
<input type="text" name="name" /> <br/>
password:
<input type="password" name="pwd" /> <br/>
<input type="submit" value="submit"/>
</form>
</body>
</html>

运行项目,截包:


返回数据包:

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请求头(上面程序中被注释掉的内容)。


© 著作权归作者所有

共有 人打赏支持
pseudo

pseudo

粉丝 79
博文 37
码字总数 35469
作品 3
朝阳
程序员
TCP和Http的区别!我都搞懂了,你就别迷糊了!

相信不少初学手机联网开发的朋友都想知道Http与Socket连接究竟有什么区别,希望通过自己的浅显理解能对初学者有所帮助。 1、TCP连接 手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可...

yzbty23
2015/12/22
1K
2
python用httplib模块和发送get和post请求

httplib是一个相对底层的http请求模块,其上有专门的包装模块,如urllib内建模块,goto等第三方模块,但是封装的越高就越不灵活,比如urllib模块里请求错误时就不会返回结果页的内容,只有头...

天道酬勤VIP
2017/08/26
0
0
动手做webserver的核心之http解析

简介 webserver往小里说核心功能就是socket管理、url处理、http协议处理、业务dll管理等;下面简介绍一下http协议:超文本传输协议(HTTP)是一种通信协议,当时就是为web传输设计的一个基于t...

yswenli
07/17
0
0
Golang Web学习(13)—— 搭建简单的Web服务器

本文为转载,原文:Golang Web学习(13)—— 搭建简单的Web服务器 Golang 1、Web工作方式 我们平时浏览网页的时候,会打开浏览器,输入网址后按下回车键,然后就会显示出你想要 浏览的内容。...

ChainZhang
01/14
0
0
Note of How Tomcat Works (1)

1、Servlet容器是如何工作的 一个servlet容器要为一个servlet的请求提供服务,基本上有三件事要做: (a)创建一个request对象并填充那些有可能被所引用的servlet使用的信息,如参数、头部、coo...

ayesd
2013/02/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Bash各类扩展详解

Bash各类扩展详解 Bash中主要包括大括号扩展、波浪号扩展、变量扩展、子命令扩展、文件名扩展和算数扩展。这些扩展组合在一起为Bash带来了极大的易用性。掌握这些扩展的用法和功能,能够为B...

小陶小陶
今天
1
0
EventBus原理深度解析

一、问题描述 在工作中,经常会遇见使用异步的方式来发送事件,或者触发另外一个动作:经常用到的框架是MQ(分布式方式通知)。如果是同一个jvm里面通知的话,就可以使用EventBus。由于Event...

yangjianzhou
今天
5
0
OpenCV图像处理实例:libuv+cvui显示摄像头视频

#include <iostream>#include <opencv2/opencv.hpp>#define CVUI_IMPLEMENTATION#include <cvui.h>extern "C"{#include <uv.h>}using namespace std;#define WINDOW_NAM......

IOTService
今天
3
0
openJDK之JDK9的String

1.openJDK8的String 先来看下openJDK8的String的底层,如下图1.1所示: 图1.1 底层上使用的是char[],即char数组 每个char占16个bit,Character.SIZE的值是16。 2.openJDK9中的String 图2.1...

克虏伯
今天
3
0
UEFI 模式下如何安装 Ubuntu 16.04

作者:知乎用户 链接:https://www.zhihu.com/question/52092661/answer/259583475 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 针对UEFI模式下安装U...

寻知者
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部