restful接口,入参以流的形式接收,出参流返回

本文介绍了一个HTTP回调接口的实现细节,包括如何从请求中读取并解析参数,将其转换为Map对象,进一步转化为特定类实例的过程,以及如何处理异常情况,并最终将结果返回给调用方。

@PostMapping("Statusback")
  public void Statusback(HttpServletRequest request, HttpServletResponse response) {
    StringBuilder sb = new StringBuilder();
    try {
      request.getReader().lines().forEach(sb::append);
    } catch (IOException e) {
      log.error("回传解析异常:{}", Throwables.getStackTraceAsString(e));
      writeResponse(response, "<request><flag>F</flag><msg>参数解析异常!</msg></request>");
    }
    log.info("-----接口回调入参--------:  ", sb.toString());
    Map<String, String> map = getParamMap(sb.toString());
    Return ReturnParam = JSON.parseObject(JSON.toJSONString(map), Return.class);
    String responseStr = storageNotifyService.acceptNotify(ReturnParam);
    log.info("-----接口回调返回参数--------:  ", responseStr);
    writeResponse(response, responseStr);
  }

  private void writeResponse(HttpServletResponse response, String str) {
    try {
      response.getWriter().println(str);
    } catch (IOException ex) {
      log.error("回传结果报错!{}", Throwables.getStackTraceAsString(ex));
    }
  }

  private Map<String, String> getParamMap(String str) {
    String[] kvArray = str.split("&");
    Map<String, String> map = new HashMap<>();
    Arrays.stream(kvArray).forEach(kvStr -> {
      String[] kv = kvStr.split("=", 2);
      String key = kv[0];
      String value = kv[1];
      map.put(key, value);
    });
    return map;
  }

### 实现方案 为了满足需求,可以采用如下方法来生成二维码并通过HTTP响应将其作为字节或Base64编码发送至客户端浏览器。此过程涉及到了Java后端编程以及ZXING库的应用。 #### Maven依赖配置 首先,在项目的`pom.xml`文件里加必要的Maven依赖项以便能够正常使用ZXING库以及其他可能需要用到的支持类库[^1]: ```xml <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.4.0</version> </dependency> <!-- 如果还需要额外功能比如图像处理 --> <dependency> <groupId>com.google.zxing</groupId> <artifactId>javase</artifactId> <version>3.4.0</version> </dependency> ``` #### 创建服务接口 定义一个RESTful API用于接收来自前端的请求数,并据此创建对应的QRCode对象实例。以下是基于Spring Boot框架下的简单示例代码片段[^2]: ```java import com.google.zxing.BarcodeFormat; import com.google.zxing.WriterException; import com.google.zxing.client.j2se.MatrixToImageWriter; import com.google.zxing.common.BitMatrix; import com.google.zxing.qrcode.QRCodeWriter; @RestController @RequestMapping("/api/qrcode") public class QRCodeController { @GetMapping(value = "/generate", produces = MediaType.IMAGE_PNG_VALUE) public ResponseEntity<byte[]> generateQrCode(@RequestParam String content) throws WriterException, IOException { int width = 300; // 图片宽度 int height = 300; // 图片高度 QRCodeWriter qrCodeWriter = new QRCodeWriter(); BitMatrix bitMatrix = qrCodeWriter.encode(content, BarcodeFormat.QR_CODE, width, height); ByteArrayOutputStream pngOutputStream = new ByteArrayOutputStream(); MatrixToImageWriter.writeToStream(bitMatrix, "PNG", pngOutputStream); byte[] imageBytes = pngOutputStream.toByteArray(); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.IMAGE_PNG); return new ResponseEntity<>(imageBytes, headers, HttpStatus.OK); } } ``` 上述例子展示了如何通过GET方式获取URL路径中的查询字符串作为要编码的内容,进而构建相应的二维码位图数据结构(BitMatrix),最后再转存为PNG格式的数据并设置合适的HTTP头信息一同返回给调用者。 对于希望得到Base64编码的情况,则可以在原有基础上稍作修改,即不再直接输原始二进制数组而是对其进行BASE64编码后再封装成JSON格式的对象传递回去[^5]: ```java @GetMapping("/toBase64") @ResponseBody public Map<String,Object> toBase64(@RequestParam String text){ try{ QRCodeWriter writer=new QRCodeWriter(); BitMatrix matrix=writer.encode(text,BarcodeFormat.QR_CODE,400,400); BufferedImage bufferedImage=MatrixToImageWriter.toBufferedImage(matrix); ByteArrayOutputStream baos=new ByteArrayOutputStream(); ImageIO.write(bufferedImage,"png",baos ); byte[] bytes=baos.toByteArray(); BASE64Encoder encoder=new sun.misc.BASE64Encoder(); String base64Str="data:image/png;base64,"+encoder.encode(bytes).replaceAll("\n","").replaceAll("\r",""); HashMap<String ,Object> resultMap=new HashMap<>(); resultMap.put("qrcode",base64Str); return resultMap; }catch (Exception e){ throw new RuntimeException(e.getMessage()); } } ``` 这样做的好处是可以让前端更容易地嵌到HTML页面内显示来而无需考虑跨域资源共享(CORS)等问题。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值