天天看点

C# 模拟浏览器 发生 JSON 格式 Http请求,Java 服务端响应Json 格式的Http 请求

一、前言

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 学习 (一个挺好的网站)