toParamStr支持数组

简介: toParamStr支持数组


不登高山,不知天之高也;不临深溪,不知地之厚也;不闻先王之遗言,不知学问之大也。——荀子

import org.springframework.web.reactive.function.client.WebClient;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.*;
public class WebClientExample {
    private static final ObjectMapper objectMapper = new ObjectMapper();
    public static void main(String[] args) {
        // 示例对象
        var searchParams = // 你的复杂对象
        // 将对象转换为查询参数字符串
        String queryParamStr = toParamStr(searchParams);
        // 使用 WebClient 发起请求
        WebClient webClient = WebClient.create("http://example.com/");
        String response = webClient.get()
                .uri(uriBuilder -> uriBuilder
                        .path("/your-api-endpoint")
                        .query(queryParamStr)
                        .build())
                .retrieve()
                .bodyToMono(String.class)
                .block();
        System.out.println(response);
    }
}

这里需要一个toParamStr方法

代码如下:

import cn.hutool.core.net.url.UrlQuery;
import com.fasterxml.jackson.core.type.TypeReference;
import lombok.experimental.UtilityClass;
import org.dromara.streamquery.stream.core.collection.Maps;
import org.dromara.streamquery.stream.core.stream.Steam;
import java.net.URI;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import static org.dromara.streamquery.stream.core.stream.collector.Collective.entryToMap;
/**
 * ParamUtil
 *
 * @author VampireAchao<achao @ hutool.cn>
 * @since 2023/10/21
 */
@UtilityClass
public class ParamUtil {
    public static Map<String, String> getParamMapFrom(String param) {
        var queryMap =
                UrlQuery.of(param, StandardCharsets.UTF_8).getQueryMap();
        return Steam.of(queryMap)
                .map(e -> Maps.entry(String.valueOf(e.getKey()), String.valueOf(e.getValue())))
                .collect(entryToMap());
    }
    public static Map<String, String> getParamMapFrom(URI uri) {
        return getParamMapFrom(uri.getQuery());
    }
    public static String toParamStr(Object object) {
        Map<String, Object> map = JsonUtils.mapper.convertValue(object, new TypeReference<>() {
        });
        Map<String, String> resultMap = new HashMap<>();
        buildQueryMap("", map, resultMap);
        return Steam.of(resultMap)
                .map(entry -> entry.getKey() + "=" + entry.getValue())
                .join("&");
    }
    private static void buildQueryMap(String str, Object value, Map<String, String> resultMap) {
        if (value instanceof Map) {
            ((Map<?, ?>) value).forEach((k, v) -> {
                String newPrefix = str.isEmpty() ? k.toString() : str + "." + k;
                buildQueryMap(newPrefix, v, resultMap);
            });
        } else if (value instanceof Iterable<?>) {
            Steam.of((Iterable<?>) value).forEachIdx((item, index) -> {
                String newPrefix = String.format("%s[%d]", str, index);
                buildQueryMap(newPrefix, item, resultMap);
            });
        } else {
            resultMap.put(str, Objects.toString(value, ""));
        }
    }
}

单测

import cn.hutool.core.util.URLUtil;
import org.dromara.streamquery.stream.core.collection.Maps;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
/**
 * ParamUtilTest
 *
 * @author VampireAchao<achao @ hutool.cn>
 * @since 2023/10/21
 */
class ParamUtilTest {
    @Test
    void getParamMapFromTest() {
        var uri = URLUtil.toURI("http://localhost:8080/?userId=1&name=achao");
        var paramMapFrom = ParamUtil.getParamMapFrom(uri);
        Assertions.assertEquals("1", paramMapFrom.get("userId"));
        Assertions.assertEquals("achao", paramMapFrom.get("name"));
        paramMapFrom = ParamUtil.getParamMapFrom("?userId=1&name=achao");
        Assertions.assertEquals("1", paramMapFrom.get("userId"));
        Assertions.assertEquals("achao", paramMapFrom.get("name"));
        paramMapFrom = ParamUtil.getParamMapFrom("userId=1&name=achao");
        Assertions.assertEquals("1", paramMapFrom.get("userId"));
        Assertions.assertEquals("achao", paramMapFrom.get("name"));
    }
    @Test
    void toParamStrTest() {
        var map = Maps.of();
        map.put("name", "jack");
        map.put("data", Maps.of("age", 18));
        map.put("parameterTypes", new Class[]{String.class, Integer.class});
        map.put("position", new int[][]{new int[]{1, 2}, new int[]{3, 4}});
        var paramStr = ParamUtil.toParamStr(map);
        Assertions.assertEquals("parameterTypes[1]=java.lang.Integer&name=jack&position[1][0]=3&parameterTypes[0]=java.lang.String&data.age=18&position[1][1]=4&position[0][1]=2&position[0][0]=1", paramStr);
    }
}
相关文章
|
前端开发 Java 数据安全/隐私保护
聊聊 OAuth 2.0 的 Token 续期处理
Token 校验逻辑 // CheckTokenEndpoint.checkToken @RequestMapping(value = "/oauth/check_token") @ResponseBody public Map checkToken(@RequestPara.
2340 0
|
2月前
|
人工智能 JSON 安全
Claude Code插件系统:重塑AI辅助编程的工作流
Anthropic为Claude Code推出插件系统与市场,支持斜杠命令、子代理、MCP服务器等功能模块,实现工作流自动化与团队协作标准化。开发者可封装常用工具或知识为插件,一键共享复用,构建个性化AI编程环境,推动AI助手从工具迈向生态化平台。
526 1
|
9月前
|
数据采集 人工智能 JavaScript
Browser Use:40.7K Star!一句话让AI完全接管浏览器!自动规划完成任务,多标签页同时管理
Browser Use 是一款专为大语言模型设计的智能浏览器自动化工具,支持多标签页管理、视觉识别、内容提取等功能,并能记录和重复执行特定动作,适用于多种应用场景。
2567 21
Browser Use:40.7K Star!一句话让AI完全接管浏览器!自动规划完成任务,多标签页同时管理
|
JSON API 数据格式
Amazon商品详情API,json数据格式示例参考
亚马逊商品详情API接口返回的JSON数据格式通常包含丰富的商品信息,以下是一个简化的JSON数据格式示例参考
|
存储 算法 Java
java制作海报六:Graphics2D的RenderingHints方法参数详解,包括解决文字不清晰,抗锯齿问题
这篇文章是关于如何在Java中使用Graphics2D的RenderingHints方法来提高海报制作的图像质量和文字清晰度,包括抗锯齿和解决文字不清晰问题的技术详解。
539 0
java制作海报六:Graphics2D的RenderingHints方法参数详解,包括解决文字不清晰,抗锯齿问题
|
微服务
SpringCloud OpenFeign 服务调用传递 token
业务场景 通常微服务对于用户认证信息解析有两种方案 在 gateway 就解析用户的 token 然后路由的时候把 userId 等相关信息添加到 header 中传递下去。 在 gateway 直接把 token 传递下去,每个子微服务器自己在过滤器解析 token 现在有一个从 A 服务调用 B 服务接口的内部调用业务场景,无论是哪种方案我们都需要把 header 从 A 服务传递到 B 服务。 RequestInterceptor OpenFeign 给我们提供了一个请求拦截器 RequestInterceptor ,我们可以实现这个接口重写 apply 方法将当前请求的 heade
916 0
|
JSON 前端开发 JavaScript
Vue+Axios+SpringBoot后端同时接收文件和json作为请求参数
Vue+Axios+SpringBoot后端同时接收文件和json作为请求参数
966 0
|
机器学习/深度学习 自然语言处理 算法
【机器学习】生成对抗网络(GAN)应用领域分析
【1月更文挑战第27天】【机器学习】生成对抗网络(GAN)应用领域分析
如何加速打开Axure分享的链接
有两种方式,分别是使用&quot;蓝湖&quot;和“Axhub”
852 0
如何加速打开Axure分享的链接