使用RestTemplate解析URL参数化字符串响应为对象/Map
将URL编码的响应字符串转换为Map
因为你获取的响应是application/x-www-form-urlencoded格式,和请求参数格式一致,直接解析成Map<String, String>是最适合的方案,以下是两种可行的实现方式:
方法一:使用Spring内置工具类(推荐)
Spring的UriComponentsBuilder可以直接解析URL编码的字符串,自动处理解码和参数拆分,代码简洁可靠:
import org.springframework.web.util.UriComponentsBuilder; import java.util.Map; // 假设responseStr是你通过RestTemplate获取的响应字符串 String responseStr = "response=3&responsetext=1006: The specified transaction in the request is not allowed: REJECTED CONTACT CUST SERV\nREFID:1202053070&authcode=&transactionid=&avsresponse=&cvvresponse=&orderid=&type=sale&response_code=300&masked_merchant_number="; // 解析为Map<String, String> Map<String, String> responseMap = UriComponentsBuilder.newInstance() .query(responseStr) .build() .getQueryParams() .toSingleValueMap(); // 示例用法 System.out.println(responseMap.get("responsetext")); // 输出:1006: The specified transaction in the request is not allowed: REJECTED CONTACT CUST SERV // REFID:1202053070
说明:
- 自动处理URL解码,无需手动处理特殊字符
- 响应中包含换行的参数(比如
responsetext)会被完整保留 - 如果存在重复参数名,会自动取最后一个的值
方法二:手动解析(自定义逻辑)
如果不想依赖Spring的Web工具类,可以手动实现解析逻辑,灵活控制细节:
import java.net.URLDecoder; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; public static Map<String, String> parseUrlEncodedResponse(String response) { Map<String, String> resultMap = new HashMap<>(); // 按&拆分所有键值对,忽略响应中的换行符 String[] paramPairs = response.split("&"); for (String pair : paramPairs) { int equalIndex = pair.indexOf('='); if (equalIndex == -1) { // 处理无值的参数(罕见情况) resultMap.put(pair, ""); continue; } String key = pair.substring(0, equalIndex); String value = pair.substring(equalIndex + 1); // 解码URL编码的特殊字符 try { value = URLDecoder.decode(value, StandardCharsets.UTF_8.name()); } catch (Exception e) { // 解码失败时保留原始值 e.printStackTrace(); } resultMap.put(key, value); } return resultMap; } // 调用示例 String responseStr = "你的响应字符串"; Map<String, String> responseMap = parseUrlEncodedResponse(responseStr);
说明:
- 可以自定义处理空值、重复参数的逻辑
- 响应中的换行符会保留在对应参数值中,如需去除可手动添加
value = value.replace("\n", "")
内容的提问来源于stack exchange,提问作者Nimila Hiranya
相关产品推荐
相关产品推荐

