问卷星API—答卷提交后跳转并获取答卷数据(Java集成)

最近做问卷星的集成的时候碰到一个获取答卷的需求,但是问卷星的文档给的太粗糙了,例子是用的C#写的,我需要的是Java,因此我自己写了一个例子。

问卷星API—答卷提交后跳转并获取答卷数据(Java集成)

打开问卷星的API地址 问卷星API总览_旗舰版服务_API_创建调查问卷入门_使用流程_帮助中心_问卷星

找到我们需要的API 

找到对应的配置端,这里需要有权限,如果没有,需要找负责人开通。

然后看到API中对答卷数据的处理,是加密过的,需要接收和解密。但是例子是用C#写的,和需求不一致,因此要根据API写出一个Java版本的。

注意看这里的解析:

下面是快速书写步骤:
  1. 配置问卷星地址,需要一个可以访问的地址,我用的是公网做测试,做了单点登录的是可以配置内网的,需要有权限。就是去配置一个问卷,然后点击问卷设置的时候有一个post答卷到该地址的选项,那个地址就填需要接收和解析答卷的地址。(由于保密问题,这里配置步骤不能截图)
  2. 得到问卷星的AESKEY,在配置问卷的地方有。
  3. 新建一个SpringBoot项目,导入一些基础的依赖就可以了,这里看个人需求,我测试是把原数据和解析后的数据都存起来,然后保存一下日志,所以用到了这几个依赖:
  4.    <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <scope>runtime</scope>
            </dependency>
    
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>3.4.1</version>
            </dependency>
    
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>2.1.3</version>
            </dependency>
    
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
  5. 写一下保存数据到数据库信息的代码后,进行接收数据和解析,保存数据就不写了,直接看接收和解析。
    
    @RestController
    @RequestMapping("/wjx")
    @Slf4j
    public class WjxContentController {
    
        @Resource
        private WjxContentService contentService;
    
        private String aesKey="xxxxxx";//这里是问卷配置的时候可以获取到的
    
        @PostMapping(value = "/save",consumes = "application/x-www-form-urlencoded")
        public void save(@RequestParam String content) throws Exception {
            System.out.println(content);
            log.info("content:{}",content);
            //获取到被AES加密后的base64编码
            byte[] base64Data = Base64.getDecoder().decode(content);
    
            // 取AES加解密密钥作为AES解密的KEY
            byte[] keyData = aesKey.getBytes(StandardCharsets.UTF_8);
            SecretKeySpec key = new SecretKeySpec(keyData, "AES");
    
            // 取byte[] encryptedData的前16位做为IV
            byte[] iv = new byte[16];
            System.arraycopy(base64Data, 0, iv, 0, 16);
    
            // 取第16位后的字节数组做为待解密内容
            byte[] encryptedText = new byte[base64Data.length - 16];
            System.arraycopy(base64Data, 16, encryptedText, 0, encryptedText.length);
    
            // 解密模式使用CBC,填充模式使用PKCS#7
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv));
    
            // 使用配置好的实例化AES对象执行解密
            byte[] decrypted = cipher.doFinal(encryptedText);
    
            // 使用UTF-8的方式读取二进制数组得到原始数据
            String originalData = new String(decrypted, StandardCharsets.UTF_8);
            System.out.println("解析后的数据:" + originalData);
    
    
            WjxContent wjxContent = new WjxContent();
            wjxContent.setContent(content);
            wjxContent.setCreateTime(new Date());
            wjxContent.setResolveData(originalData);
            contentService.save(wjxContent);
        }

### Java 项目集成问卷 API 使用教程 #### 1. 准备工作 为了在 Java 项目中集成问卷功能,首先需要获取问卷提供的 API 访问权限和密钥。这通常涉及注册开发者账号创建应用来获得必要的凭证。 - **API 密钥**: 这是从问卷平台申请到的一组唯一标识符,用于身份验证。 - **访问令牌 (Access Token)**: 需要通过 OAuth 流程或其他认证方式换取此令牌以便发起请求[^2]。 #### 2. 添加依赖库 为了让 Java 应用能够方便地发送 HTTP 请求与 JSON 数据交互,在 `pom.xml` 文件中加入以下 Maven 依赖: ```xml <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.9.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.12.3</version> </dependency> ``` 这些库可以帮助简化网络通信过程中的编码工作量,提高程序处理效率。 #### 3. 获取 Access Token 下面是一个简单的例子展示如何利用 OkHttp 客户端向问卷服务器提交 POST 请求以交换 access token: ```java import okhttp3.*; public class AccessTokenFetcher { private static final String CLIENT_ID = "your_client_id"; private static final String CLIENT_SECRET = "your_client_secret"; public static void main(String[] args) throws Exception { OkHttpClient client = new OkHttpClient(); MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded"); RequestBody body = RequestBody.create(mediaType, "grant_type=client_credentials&client_id=" + CLIENT_ID + "&client_secret=" + CLIENT_SECRET); Request request = new Request.Builder() .url("https://api.wjx.cn/oauth/token") // 假设这是获取token的URL .post(body) .addHeader("Content-Type", "application/x-www-form-urlencoded") .build(); try (Response response = client.newCall(request).execute()) { if (!response.isSuccessful()) throw new RuntimeException("Failed to get access token"); System.out.println(response.body().string()); } } } ``` 这段代码展示了如何构造一个带有客户端 ID 和秘密参数的表单数据体,将其作为 POST 请求的一部分发送给指定 URL 来接收响应消息。 #### 4. 发送调查请求 一旦获得了有效的 access_token ,就可以用来授权后续的操作了。这里给出一段示范性的代码片段说明怎样查询某个特定用户的答卷列表: ```java import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; // ... 继续上面的例子 ... String accessToken; // 上一步得到的结果解析后的字符串形式access_token Request surveyListRequest = new Request.Builder() .url("https://api.wjx.cn/vm/survey/list?access_token=" + accessToken) .get() .build(); try (Response response = client.newCall(surveyListRequest).execute()) { ObjectMapper mapper = new ObjectMapper(); JsonNode rootNode = mapper.readTree(response.body().string()); ArrayNode surveysArray = (ArrayNode)rootNode.get("data").get("surveys"); for(JsonNode node : surveysArray){ System.out.printf("Survey Title:%s\n",node.get("title")); } } catch(IOException e){ e.printStackTrace(); } ``` 上述示例假设已经成功取得了合法的 access_token 存储于变量 `accessToken` 中;接着构建了一个 GET 类型的新请求对象指向目标资源路径加上附加参数构成完整的 URI 地址;最后执行该调用将返回的数据转换成易于理解的形式打印出来。 #### 5. 错误处理机制 实际开发过程中不可避免会遇到各种异常情况,因此建议为每个可能失败的地方设置合理的错误捕捉逻辑。比如当无法连接远程服务时抛出相应的提示信息告知用户当前状态,或是记录日志便于后期排查问题所在。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值