找回密码
 立即注册

QQ登录

只需一步,快速开始

青岛花帝

金牌服务用户

16

主题

36

帖子

140

积分

金牌服务用户

积分
140
青岛花帝
金牌服务用户   /  发表于:2024-6-11 16:27  /   查看:1099  /  回复:5
1金币
本帖最后由 青岛花帝 于 2024-6-13 20:27 编辑

老师好。
我想使用Java写一个Web API插件,需要根据传入的body内容做一些动作。

我如何在代码里获取传入的参数呢?或者说,我从哪里可以查阅到com.grapecity.forguncy.serverapi.entity.ForguncyApi的帮助文档


附件: 您需要 登录 才可以下载或查看,没有帐号?立即注册

5 个回复

倒序浏览
Joe.xu讲师达人认证 悬赏达人认证 活字格认证
超级版主   /  发表于:2024-6-11 17:43:01
沙发
您好,Java  WebApi中获去参数的逻辑跟平时写代码的逻辑是一样的,
可以参考

public void handleRequest(HttpservletRequest request){0bjectMapper objectMapper =new objectMapper();
try {
String requestBody =getRequestBody(request);
YourDataClass data = objectMapper.readValue(requestBody, YourDataclass.class);
儿 处理接收到的数据
8
}catch(Exception e)f
e.printstackTrace();
}
}


回复 使用道具 举报
青岛花帝
金牌服务用户   /  发表于:2024-6-11 22:21:02
板凳

按照您的提示,在idea设计器当中无法编译,没有找到HttpservletRequest等内容



我通过下图所示的样子,可以提取到请求的Header信息,可以在活字格界面输出想要的内容





根据上面的内容,我猜测获取Body的方法是不是类似 this.getContext().getRequest().get…… 的样式,但是我在自动补全的下拉选择框里面没有见到Body的字样,不知道应该选择哪个,而且逐一尝试也不是个好的办法,所以想问问从哪里可以找到下面这些方法的注释信息



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
Joe.xu讲师达人认证 悬赏达人认证 活字格认证
超级版主   /  发表于:2024-6-12 09:00:23
地板
您参考一下这个的demo,一些方法是引用对应的公共包才能使用

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
青岛花帝
金牌服务用户   /  发表于:2024-6-13 20:25:44
5#
本帖最后由 青岛花帝 于 2024-6-13 20:32 编辑

根据徐老师提供的示例文件,并且参考网上查找的资料,这几天测试了两种解析Body的方法,记录如下,与格友们分享:


第1种方法:使用Java的Jakeson库解析JSON字符串,过程如下:

①在Maven的配置文件pom.xml当中添加依赖项标签
  1. <dependency>
  2.   <groupId>com.fasterxml.jackson.core</groupId>
  3.   <artifactId>jackson-databind</artifactId>
  4.   <version>2.13.4.1</version>
  5. </dependency>
复制代码
②引入依赖库
  1. import com.fasterxml.jackson.databind.JsonNode;
  2. import com.fasterxml.jackson.databind.ObjectMapper;
  3. import java.io.BufferedReader;
  4. import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;
复制代码
③读取请求体
  1. public class CustomApi extends ForguncyApi {
  2.     @Post
  3.     public void helloWorld() throws IOException {
  4.         HttpServletRequest request = super.getContext().getRequest();
  5.         HttpServletResponse response = super.getContext().getResponse();

  6.         ObjectMapper objectMapper = new ObjectMapper();

  7.         // 读取请求体中的JSON数据
  8.         StringBuilder requestBody = new StringBuilder();
  9.         try (BufferedReader reader = request.getReader()) {
  10.             String line;
  11.             while ((line = reader.readLine()) != null) {
  12.                 requestBody.append(line);
  13.             }
  14.         }

  15.         // 解析JSON数据
  16.         JsonNode jsonNode = objectMapper.readTree(requestBody.toString());

  17.         // 从JsonNode中提取所需字段的值
  18.         String name = jsonNode.get("name").asText();
  19.         String dept = jsonNode.get("dept").asText();

  20.         String combineInfo = name + dept;
  21.         response.getWriter().write(combineInfo);
  22.     }
  23. }
复制代码
这种写法对应的请求格式如下面2张图所示,是以JSON字符串方式发送或者以序列化方式发送


第2种方法,使用getParameter方法,过程如下:
①引入依赖库
  1. import javax.servlet.http.HttpServletRequest;
  2. import javax.servlet.http.HttpServletResponse;
复制代码

②代码写法如下
  1.     @Post
  2.     public void combinestring() throws IOException {
  3.         HttpServletRequest request = super.getContext().getRequest();
  4.         HttpServletResponse response = super.getContext().getResponse();

  5.         String name = request.getParameter("name");
  6.         String dept = request.getParameter("dept");

  7.         String combineInfo = name + dept;
  8.         response.getWriter().write(combineInfo);
  9.     }
复制代码
这种写法对应的请求发送格式如下图所示,是以对象的形式发送





对比分析
个人认为第一种写法虽然在编写的时候复杂一点儿,但是兼容性比较大,我所见到的一些API接口基本都是以序列化的方式接收请求数据。而且在进行调试的时候,查看Post请求内容比较直观。建议采用第一种写法。









本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

评分

参与人数 1金币 +66 收起 理由
Joe.xu + 66

查看全部评分

回复 使用道具 举报
Joe.xu讲师达人认证 悬赏达人认证 活字格认证
超级版主   /  发表于:2024-6-14 08:42:27
6#
青岛花帝 发表于 2024-6-13 20:25
根据徐老师提供的示例文件,并且参考网上查找的资料,这几天测试了两种解析Body的方法,记录如下,与格友们 ...

感谢分享
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部