青岛花帝 发表于 2024-6-11 16:27:41

【10.0.2】Java插件WebAPI如何获取body?

本帖最后由 青岛花帝 于 2024-6-13 20:27 编辑

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

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


Joe.xu 发表于 2024-6-11 17:43:01

您好,JavaWebApi中获去参数的逻辑跟平时写代码的逻辑是一样的,
可以参考

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的字样,不知道应该选择哪个,而且逐一尝试也不是个好的办法,所以想问问从哪里可以找到下面这些方法的注释信息



Joe.xu 发表于 2024-6-12 09:00:23

您参考一下这个的demo,一些方法是引用对应的公共包才能使用

青岛花帝 发表于 2024-6-13 20:25:44

本帖最后由 青岛花帝 于 2024-6-13 20:32 编辑

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


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

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

      ObjectMapper objectMapper = new ObjectMapper();

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

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

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

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


第2种方法,使用getParameter方法,过程如下:
①引入依赖库
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
②代码写法如下
    @Post
    public void combinestring() throws IOException {
      HttpServletRequest request = super.getContext().getRequest();
      HttpServletResponse response = super.getContext().getResponse();

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

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





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









Joe.xu 发表于 2024-6-14 08:42:27

青岛花帝 发表于 2024-6-13 20:25
根据徐老师提供的示例文件,并且参考网上查找的资料,这几天测试了两种解析Body的方法,记录如下,与格友们 ...

感谢分享:hjyzw::hjyzw:
页: [1]
查看完整版本: 【10.0.2】Java插件WebAPI如何获取body?