一、前言
1. 月初公司接到美的的一个单,需要我写一个需要支持USB在线烧录和支持联网上传日志的烧录工具,客户提供服务器接口,
使用Http协议POST 请求方式进行数据交换,交换格式使用JSON.看到这个协议时,觉得应该挺简单的,因为自己最近在学习Java Web 方面的知识,刚好可以自己编写客户端烧录软件,然后自己编写Java 服务端进行测试。于是记录一下自己对于这个项目的经验总结。
二、知识
1. HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。
即:主要时用户传输文本。
2. HTTP默认端口号为80,但是你也可以改为8080或者其他端口。
3. 浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求,服务端响应客户端所有请求。
根据HTTP标准,HTTP请求可以使用多种请求方法。
HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
4.
客户端请求消息
客户端发送一个HTTP请求到服务器的请求消息包括以下格式:请求行(request line)、请求头部(header)、空行和请求数据四个部分组成,下图给出了请求报文的一般格式。
服务器响应消息
HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。
http定义了与服务器交互的不同方法,最常用的方法有2种,分别是GET,POST
其中最重要的两种方法:GET是向服务器发索取数据的一种请求,而POST是向服务器提交数据的一种请求。
抓包可以显示,浏览器输入网址(URL)后,点击回车,第一次访问服务器为GET请求,本地并未保存任何cookies信息,故http请求头部中并未包含任何cookie信息。
5. 使用C# 模拟浏览器发送请求时,根据协议,则请求类型(Content-type) 为 JSON , 请求中提交数据为 JSON 格式字符串,
Java 服务器响应的是,在HttpResponse 中,返回数据的类型 SetContentType 不是 “text/html; Charset=utf-8” 而是 JSON.
三、代码如下
1. C# 模拟浏览器发送POST请求, 请求类型为JSON
/// <summary>
/// http请求
/// </summary>
class HttpWeb
{
public static string HttpSendPostRequest(string url, string param)
{
var result = string.Empty;
//注意提交的编码 这边是需要改变的 这边默认的是Default:系统当前编码
byte[] postData = Encoding.UTF8.GetBytes(param);
// 设置提交的相关参数
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
Encoding myEncoding = Encoding.UTF8;
request.Method = "POST";
request.KeepAlive = false;
request.AllowAutoRedirect = true;
request.ContentType = "application/json"; //请求类型JSON
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)";
request.ContentLength = postData.Length;
request.Timeout = 5000;
// 提交请求数据
System.IO.Stream outputStream = request.GetRequestStream();
outputStream.Write(postData, 0, postData.Length);
outputStream.Close();
HttpWebResponse response;
Stream responseStream;
StreamReader reader;
string srcString;
response = request.GetResponse() as HttpWebResponse;
switch(response.StatusCode)
{
case HttpStatusCode.OK:
break;
default:
response.Close();
throw new Exception("向服务器发送请求失败");
}
responseStream = response.GetResponseStream();
reader = new System.IO.StreamReader(responseStream, Encoding.GetEncoding("UTF-8"));
srcString = reader.ReadToEnd();
result = srcString; //返回值赋值
reader.Close();
response.Close();
return result;
}
}
2. Java WEB 服务端代码
public class RfidSerialNumberServlet extends HttpServlet
{
private static final String TAG = RfidSerialNumberServlet.class.getSimpleName();
/**
* @see HttpServlet#HttpServlet()
*/
public RfidSerialNumberServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
String jsonData = null;
try
{
jsonData = Utils.GetHttpServletRequestData(request); //获取Http请求数据
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
//讲Json 序列化
RfidSerialNumber rfidSerialNumber = (RfidSerialNumber)JsonUtils.jsonToBean(jsonData, RfidSerialNumber.class);
Log.d(TAG, "收到设置线体号和工单号请求 , url = " + request.getRequestURL() + ", 数据 = " + jsonData);
Log.d(TAG, "线体号 = " + rfidSerialNumber.getLineNo());
Log.d(TAG, "工单号 = " + rfidSerialNumber.getWorksheetSn());
RfidSerailNumberResult result = new RfidSerailNumberResult();
result.setDesc("操作成功");
result.setRetCode("0");
RfidSerailNumberResult.Result rst = result.new Result();
rst.setGuid("12345678");
result.setResult(rst);
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json; charset=utf-8"); //设置返回数据类型为JSON
response.getWriter().write(JsonUtils.doMainToJson(result));
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
参考:菜鸟教程网 - http 学习 (一个挺好的网站)