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);
    }
}
相关文章
|
11天前
|
前端开发 JavaScript Java
ES6中将非数组转换为数组的三种方法
ES6中将非数组转换为数组的三种方法
|
7月前
|
JSON C# 数据格式
数组比较的几种方式
1、string.Equals() ```csharp string[] strList1= new string[3] {"1", "2", "3"}; string[] strList2= new string[3] {"4", "5", "6"}; if (!string.Equals(strList1, strList2)) { // 比较数组的不同之处 } // 涉及到修改日志输出等数组可以直接json序列化然后用上述方法比较即可,如下 if (!string.Equals(JsonConvert.SerializeObject(list1), JsonConvert
45 0
|
存储 Java Go
巧用 Go Map 特性对数组或切片去重
本文介绍了如何利用 Go 的复合数据类型 Map 的特性对数组或切片进行去重。值得注意的一个地方是,在使用 Map 构建 Set 时,Value 的数据类型指定为 struct{},原因是后面在添加键值对的时候,指定的 Value 为空结构体 strcut{}{},空结构体不占用内存空间。
657 1
巧用 Go Map 特性对数组或切片去重
|
10月前
|
C#
C#基础Ⅵ?-数组
C#基础Ⅵ?-数组
|
11月前
|
网络架构 索引
ES6新增扩展:字符串-数值-数组-函数-对象
ES6新增扩展:字符串-数值-数组-函数-对象
63 0
|
JavaScript 前端开发 索引
ES6——类数组转换为数组的几种方法以及for of、forin、for Each的区别
类数组转换为数组的几种方法以及for of、forin、for Each的区别
104 0
|
存储 算法 索引
最基础的数组你真的掌握了吗?
首先要知道数组在内存中的存储方式,这样才能真正理解数组相关的题 数组是存放在连续内存空间上的相同类型数据的集合。 数组可以方便的通过下标索引的方式获取到下标下对应的数据。 举一个字符数组的例子,如图所示:
67 0
|
Java
Java经典编程习题100例:第15例:定义一个int型的一维数组,包含10个元素,分别赋值为1~10, 然后将数组中的元素都向前移一个位置, 即,a[0]=a[1],a[1]=a[2],…最后一个元
Java经典编程习题100例:第15例:定义一个int型的一维数组,包含10个元素,分别赋值为1~10, 然后将数组中的元素都向前移一个位置, 即,a[0]=a[1],a[1]=a[2],…最后一个元
379 0
|
存储 C++ 容器
【C++要笑着学】list 常用接口介绍 | 支持任意位置O(1)插入删除的顺序容器 list(一)
一听 list ,我们就知道是个双向带头循环链表。list 在实际的运用中用的没有 vector 多,包括大家在刷题的时候 list 也出现的很少,因为 list 不支持随机访问,有很多数据堆在那里你可能还需要排序一下,list 要排序,就是一个大问题,所以用 vector 的情况较多。
170 0
【C++要笑着学】list 常用接口介绍 | 支持任意位置O(1)插入删除的顺序容器 list(一)
http://www.vxiaotou.com