[JAVA REST]REST请求

2023-05-16

[java rest]rest请求

    • 01.说明
    • 02.前端AJAX优化
    • 03.后台的优化
    • 04.数据的处理

01.说明

本系列是对 阿发你好 JAVA教程做的个人笔记总结,如果小伙伴们有兴趣,请移步至阿发你好官网JAVA教程,保姆级视频教学,您值得拥有

02.前端AJAX优化

前端AJAX执行rest请求,代码如下:

$.ajax({
 	method: 'POST' ,  //和POST请求类似,只不过它向后台传输的是JSON数据
 	url: 'Handler1',
 	contentType: 'application/json' ,//指定格式
 	data : JSON.stringify(req) ,//将对象转换为JSON对象
 	processData : false,
 	success : function( ret ){	//后台返回值的处理	
 		console.log( ret );
 		if(ret.error == 0) alert('OK')
 	}
})	

我们不难发现,其中有固定的套路与格式,那么我们能不能将AJAX进行代码优化呢?
阿发老师提供了afquery.js

// 自定义的一些工具方法

var Af = {}

Af.rest = function(url, data, success, error){
	if(data == null) data = {}; // 若data为null,则发送一个默认JSON{}
	
	$.ajax({
		method: 'POST' ,  
		url: url ,
		contentType: 'application/json' ,  // HTTP请求中的 Content-Type
		data : JSON.stringify(data) ,      // HTTP请求正文 
		processData : false,               // 
		dataType: 'json',                  // HTTP应答按JSON处理
		success : success ,
		error : error ,
	})	
}

这样我们只需要简单的调用方法,填入参数就可以实现rest请求

//URL,数据对象,回调方法
Af.rest('Handler6', app.form, function(ret){
	if(ret.error== 0){
		alert( ret.data)
	}
})

03.后台的优化

package my;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;

import my.util.FastJSON;
import my.util.WebUtil;

@WebServlet("/Handler4")
public class Handler4 extends HttpServlet
{
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
	{
		// 1 提取正文
		JSONObject json = null;
		try{
			String requestBody = WebUtil.requestBody(req, "UTF-8");
			json = JSON.parseObject(requestBody);
		} catch (Exception e)
		{
			json = new JSONObject();
		}

		// 2 处理
		JSONObject result = new JSONObject(true);
		result.put("error", 0);
		result.put("reason", "OK");

		try
		{
			// 处理请求
			Object data = this.handle(req, resp, json);
			if (data != null)
			{
				if (data instanceof JSON) // 本身就是 JSONObject 或 JSONArray
					result.put("data", data);
				else
					result.put("data", JSON.toJSON(data));
			}

		} catch (Exception e)
		{
			String reason = e.getMessage();
			if (reason == null)
				reason = e.getClass().getName();
			result.put("error", -1);
			result.put("reason", e.getMessage());
		}
		
		// 3 返回应答数据
		resp.setCharacterEncoding("UTF-8");
		resp.setContentType("application/json");
		resp.getWriter().write(FastJSON.niceFormat( result ));
	}

	// 具体的业务处理
	public Object handle(HttpServletRequest request
			, HttpServletResponse response
			, JSONObject json)throws Exception
	{
		
		return "已成功处理"; 
	}

}

后台的代码也是具有套路和固定格式的,我们只需要在handle方法里做对应的处理就可以了,那么我们就可以使用抽象类的方法实现:

package my;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;

import my.util.FastJSON;
import my.util.WebUtil;

public abstract class RestServlet extends HttpServlet
{
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
	{
		// 1 提取正文
		JSONObject json = null;
		try{
			String requestBody = WebUtil.requestBody(req, "UTF-8");
			json = JSON.parseObject(requestBody);
		} catch (Exception e)
		{
			json = new JSONObject();
		}

		// 2 处理
		JSONObject result = new JSONObject(true);
		result.put("error", 0);
		result.put("reason", "OK");

		try
		{
			// 处理请求
			Object data = this.handle(req, resp, json);
			if (data != null)
			{
				if (data instanceof JSON) // 本身就是 JSONObject 或 JSONArray
					result.put("data", data);
				else
					result.put("data", JSON.toJSON(data));
			}

		} catch (Exception e)
		{
			String reason = e.getMessage();
			if (reason == null)
				reason = e.getClass().getName();
			result.put("error", -1);
			result.put("reason", e.getMessage());
		}
		
		// 3 返回应答数据
		resp.setCharacterEncoding("UTF-8");
		resp.setContentType("application/json");
		resp.getWriter().write(FastJSON.niceFormat( result ));
	}

	// 具体的业务处理
	protected abstract Object handle(HttpServletRequest request
			, HttpServletResponse response
			, JSONObject json)throws Exception;
}

然后在实际使用的时候,继承抽象类,实现handle方法即可:

package my;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.alibaba.fastjson.JSONObject;

import my.util.FastJSON;

@WebServlet("/Handler4")
public class Handler6 extends RestServlet
{

	@Override
	protected Object handle(HttpServletRequest request, HttpServletResponse response, JSONObject json) throws Exception
	{
		System.out.println("收到请求: " + FastJSON.niceFormat(json));
		
		return "已经保存数据";
	}

}

04.数据的处理

在前面代码中使用的数据处理方法.仅供参考

package my.util;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.servlet.http.HttpServletRequest;

public class WebUtil
{
	// 读取请求正文 
	// JavaIO技术较难,新人不宜深入研究。具体可以参考《网络通信篇》或《JavaIO公开课》
	public static String requestBody(HttpServletRequest req, String charset) throws IOException
	{
		ByteArrayOutputStream result = new ByteArrayOutputStream(1024*16);  
		
		InputStream inputStream = req.getInputStream();
        byte[] data = new byte[1024];  
        while (true)
        {
        	int n = inputStream.read(data); // n, 实际读取的字节数
        	if(n <= 0) break; // 读取完毕
        	
        	result.write(data, 0, n);  // 缓存起来      	
        	if(result.size() > 1024*1024) // 上限, 最多读取1M
        		break;
        }  
        
        return result.toString(charset);
	}
	
	// 
	public static int paramInt(HttpServletRequest req, String key, int defValue)
	{
		String str = req.getParameter(key);
		if(str == null || str.length()==0)
			return defValue;
		try {
			return Integer.valueOf(str);
		}catch(Exception e) {
			return defValue;
		}
	}
	
	public static long paramLong(HttpServletRequest req, String key, long defValue)
	{
		String str = req.getParameter(key);
		if(str == null || str.length()==0)
			return defValue;
		try {
			return Long.valueOf(str);
		}catch(Exception e) {
			return defValue;
		}
	}
	
	public static boolean paramBoolean(HttpServletRequest req, String key, boolean defValue)
	{
		String str = req.getParameter(key);
		if(str == null || str.length()==0)
			return defValue;
		try {
			return Boolean.valueOf(str);
		}catch(Exception e) {
			return defValue;
		}
	}
	
	public static String paramString(HttpServletRequest req, String key, String defValue)
	{
		String str = req.getParameter(key);
		if(str == null || str.length()==0)
			return defValue;
		
		return str;
	}
}

package my.util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;

public class FastJSON
{
	public static String niceFormat(Object j)
	{
		return JSON.toJSONString(j, SerializerFeature.PrettyFormat);
	}
	
	
	///
	
	public static int intValue(JSONObject j, String key, int defValue)
	{
		try {
			return j.getIntValue(key);
		}catch(Exception e) {
			return defValue;
		}
	}
	
	public static long longValue(JSONObject j, String key, long defValue)
	{
		try {
			return j.getLongValue(key);
		}catch(Exception e) {
			return defValue;
		}
	}
	
	public static boolean booleanValue(JSONObject j, String key, boolean defValue)
	{
		try {
			return j.getBooleanValue(key);
		}catch(Exception e) {
			return defValue;
		}
	}
	
	public static String stringValue(JSONObject j, String key, String defValue)
	{
		try {
			return j.getString(key);
		}catch(Exception e) {
			return defValue;
		}
	}
	
	public static double doubleValue(JSONObject j, String key, double defValue)
	{
		try {
			return j.getDoubleValue(key);
		}catch(Exception e) {
			return defValue;
		}
	}
	
	public static float floatValue(JSONObject j, String key, float defValue)
	{
		try {
			return j.getFloatValue(key);
		}catch(Exception e) {
			return defValue;
		}
	}	
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[JAVA REST]REST请求 的相关文章

随机推荐

  • 【Linux】实验四 进程信号通信

    文章目录 一 实验目的二 实验内容三 实验原理1 信号3 1 1 信号的基本概念3 1 2 信号的发送 2 所涉及的系统函数调用3 2 1 fork 3 2 2 kill This is my question 3 2 3 signal 代
  • 报错.SO文件找不到

    此报错大多数可以通过设置环境变量解决 原因 xff1a 当执行函数动态链接 so时 xff0c 此文件不在缺省目录下 lib and usr lib 里 缺省 61 61 默认 解决方案 xff1a 1 find name so文件名 2
  • 头文件(.h) 和实现文件(.cpp)区别

    简单讲 xff0c 一个Package就是由同名的 h和 cpp文件组成 当然可以少其中任意一个文件 xff1a 只有 h文件的Package可以是接口或模板 template 的定义 xff1b 只有 cpp文件的Package可以是一个
  • 坚持学习100天:STL(头大的英文,一个模板库,非得写得我看不懂)

    前言 Hello 我是修齊 学习C 43 43 的第一百零一十八天 18是个美好的数字 xff0c 18岁刚刚好 xff0c 28岁也要用心学习 在这里记录一些学习的东西和学习的心情 内容主要是一些自己学习整理的小笔记 一 指针与引用 1
  • Ubuntu20.04以及ROS系统的安装(避坑指南)

    一 Ubuntu20 04的安装 暑期在我导那里确认好研究方向后 xff0c 一个人摸爬滚打走来确实走了不少弯路 xff0c 遂决定写下这篇文章来帮助有需要的朋友来避坑 本次安装是通过VMware来创建一台虚拟机进行后续操作 xff0c 之
  • Rplidar A2单线雷达实现Cartographer建图

    首先安装rplidar2 xff0c 在工作空间src目录下git clone xff0c catkin make编译后即可使用了 git clone https github com robopeak rplidar ros git 在使
  • 解决Ubuntu非root用户登录时,无法打开Firefox浏览器

    在使用Ubuntu操作系统时 xff0c 创建了一个普通用户 xff0c 登录该用户后发现无法打开Firefox浏览器 xff0c 进行如下步骤可解决问题 提示 Your Firefox profile cannot be loaded I
  • 【C语言】 链表 超详细解析

    目录 一 xff1a 静态存储和动态存储 二 xff1a 存储类别 三 xff1a malloc函数 四 xff1a free函数 五 xff1a 内存初始化函数memset 六 xff1a calloc函数 七 xff1a realloc
  • 2.stm32freeRTOS---创建一个任务

    文章目录 前言一 创建一个任务需要注意哪些 xff1f 1 任务创建函数xTaskCreate2 代码分析 二 动态 静态分配1 动态分配2 静态分配 xff1a 三 删除任务四 一个函数创建两个任务总结 前言 上一次是初步接触实时系统 x
  • 世界上最详细的Linux C udp实现文件传输

    最重要的是掌握UDP的基本概念和使用 UDP h span class token macro property span class token directive hash span span class token directive
  • LidarPointCloud保存PCD文件的方法

    在牵扯到Lidar点云数据相关的开发时 难免需要将LidarPointCloud数据转为PCD文件 来查看点云效果 本文介绍两种办法 1 写文件的方法 根据PCD文件的协议 本样例中使用的数据类型为ara lidar LidarPointC
  • SSD算法解析

    目标检测算法主要分为两类 xff1a Two stage方法 xff1a 如R CNN系列算法 xff0c 主要思路就是通过Selective Search或者CNN网络产生一系列的稀疏矩阵的候选区域 xff0c 然后对这些候选区域进行分类
  • Oracle获取日期&天数

    一 获取当年所有日期 span class token comment select from span span class token keyword select span trunc span class token punctua
  • Oracle where if

    一 where case when Oracle where不能如其他sql直接添加if逻辑 只能使用case when span class token keyword select span span class token opera
  • ASP.net GridView控件(删除/更新功能)

    一 说明 部分代码的运用放在以往的教程中 本部分只讲解删除 更新功能 二 前端 我们在其控件上添加事件 红色为行删除事件 绿色为行更新事件 双击后 即可在后台自动生成对应的方法体 其代码显示 lt 64 Page Language 61 3
  • ASP.net 简单登录界面

    一 说明 此文是小白在学习张晨光老师的视频教学 lt lt Asp Net WEB服务器编程技术 gt gt 中做的学习笔记 一些知识点也是跟着教程走的 大家也可以去老师的主页去学习 谢谢大家 这一篇要练习的是 如下课程的代码 新建项目 因
  • ASP.net 简单注册界面

    一 说明 此文是小白在学习张晨光老师的视频教学 lt lt Asp Net WEB服务器编程技术 gt gt 中做的学习笔记 一些知识点也是跟着教程走的 大家也可以去老师的主页去学习 谢谢大家 这一篇要练习的是 如下课程的代码 先新建img
  • oracle 一行转多行+多行转一行

    1 说明 在一行转多行时 我们多半将一张维护表分成单列的维护数据 然后再进行汇总 关联 这样能避免一些不必要的错误 一个table中 只有要拆分的数据和主键 如果要拆分多行 即将他们拆分为不同的table 2 简单的拆分 此语句是以逗号拆分
  • [vue element-ui]JAVA POST请求+eclipse创建项目

    01 前端 span class token doctype span class token punctuation lt span span class token doctype tag DOCTYPE span span class
  • [JAVA REST]REST请求

    java rest rest请求 01 说明02 前端AJAX优化03 后台的优化04 数据的处理 01 说明 本系列是对 阿发你好 JAVA教程做的个人笔记总结 如果小伙伴们有兴趣 请移步至阿发你好官网JAVA教程 保姆级视频教学 您值得