1、接口描述

http://50.58.187.80:50001/sms.aspx?action=send&userid=11&account=WJGA&password=wjga1234&mobile=13915890092&content=%E6%B5%8B%E8%AF%95%E5%86%85%E5%AE%B9&sendtime=&extno=

2、依赖引入

hm-manage/pom.xml

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>
BNF

引入这个是为了用WebClient方法。

3、新增配置

hm-admin/src/main/resources/application.yml

# 短信配置
sms:
  url: http://50.58.187.80:50001/sms.aspx
  userid: 11
  account: WJGA
  password: wjga1234
  action: send
Dts

4、构造请求体

这边用到的是.build()直接构造,如果用.encode(),汉字会被解析为UTF-8的编码格式,不是我们想要的。

String url = UriComponentsBuilder.fromHttpUrl("http://50.58.187.80:50001/sms.aspx")
        .queryParam("action", "send")
        .queryParam("userid", "11")
        .queryParam("account", "WJGA")
        .queryParam("password", "wjga1234")
        .queryParam("mobile", "13915890092")
        .queryParam("content", "哈哈哈")
        .queryParam("sendtime", "")
        .queryParam("extno", "")
        //.encode(StandardCharsets.UTF_8) // 显式指定编码格式
        .build()
        .toUriString();
X86asm

5、发送请求

这边直接创建了一个SmsService专门用来处理短信。

package com.hm.manage.utils;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;
import org.springframework.web.util.UriComponentsBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import reactor.core.publisher.Mono;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.StringReader;

@Slf4j
@Service
public class SmsService {

    @Value("${sms.url}")
    private  String smsUrl;
    @Value("${sms.userid}")
    private  String userId;
    @Value("${sms.account}")
    private  String account;
    @Value("${sms.password}")
    private  String password;
    @Value("${sms.action}")
    private  String action;

    public SmsService(
            @Value("${sms.url}") String smsUrl,
            @Value("${sms.userid}") String userId,
            @Value("${sms.account}") String account,
            @Value("${sms.password}") String password,
            @Value("${sms.action}") String action) {
        this.smsUrl = smsUrl;
        this.userId = userId;
        this.account = account;
        this.password = password;
        this.action = action;
    }

    // 创建SmsService的无参构造
    public SmsService() {
        this.smsUrl = smsUrl;
        this.userId = userId;
        this.account = account;
        this.password = password;
        this.action = action;
    }

    public String sendSms(String mobile, String content) {
        // 构建请求URL并自动编码参数
        String url = UriComponentsBuilder.fromHttpUrl(smsUrl)
                .queryParam("action", action)
                .queryParam("userid", userId)
                .queryParam("account", account)
                .queryParam("password", password)
                .queryParam("mobile", mobile)
                .queryParam("content", content)
                .queryParam("sendtime", "")
                .queryParam("extno", "")
                .build()
                .toUriString();

        log.info("------发送短信请求URL:{}", url);
        // 发送GET请求并获取响应
        String block = WebClient.create()
                .get()
                .uri(url)
                .retrieve()
                .bodyToMono(String.class)
                .block();
        return parseXMLString(block);

    }

    public  String parseXMLString(String xmlString) {
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            InputSource is = new InputSource(new StringReader(xmlString));
            Document doc = builder.parse(is);
            // 现在你可以使用doc对象来访问XML结构,例如:
            NodeList returnstatus = doc.getDocumentElement().getElementsByTagName("returnstatus");
            for (int i = 0; i < returnstatus.getLength(); i++) {
                System.out.println("returnstatus: " + returnstatus.item(i).getTextContent());
            }
            return returnstatus.item(0).getTextContent();
            //System.out.println("Root element :" + doc.getDocumentElement().getNodeName().getBytes("returnstatus")[0]);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return xmlString;
    }
}
Kotlin

6、解析返回结果

解析返回结果见解析返回结果见SmsService类的parseXMLString方法。该方法将响应的XML字符串转换为Document对象,并提取出returnstatus标签的文本内容,然后返回该内容作为解析结果。