PayPal NVP API模拟器响应格式问题:如何生成可正确解析的NVP结果?
问题描述
我开发了一款与PayPal NVP API交互的应用,同时正在开发模拟器以模拟PayPal NVP API的响应。
调用应用通过以下代码发起PayPal NVP请求:
ResponseEntity<String> response = paypalRestTemplate.postForEntity(paypalEndpoint, request, String.class);
并通过以下代码解析响应获取NVP元素:
List<NameValuePair> responseDataList = URLEncodedUtils.parse(responseContent, Charset.forName("UTF-8"));
模拟器代码:
控制器类签名如下:
@PostMapping (consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, produces = MediaType.TEXT_PLAIN_VALUE) public ResponseEntity<String> transactions( @RequestParam MultiValueMap<String, String> paypalRequest) throws IOException, InterruptedException { return payPalService.processRequest(paypalRequest, delay); }
模拟器服务类中,创建NameValuePair列表并添加字段:
List<NameValuePair> nameValuePairs = new ArrayList<>(); nameValuePairs.add(new BasicNameValuePair("ACK",SUCCESS)); nameValuePairs.add(new BasicNameValuePair("name1","value1")); nameValuePairs.add(new BasicNameValuePair("name2","value2")); ...
然后返回:
return new ResponseEntity<>(nameValuePairs.toString(), HttpStatus.OK);
但在PayPal服务类中,responseDataList解析结果异常:所有内容被解析为ACK=Success,name1=value1,name3=value3,其中ACK为键,其余内容为单个值,而非多个独立的键值对。请问如何让模拟器返回可被正确解析的NVP键值对?
解决方法
问题出在你调用了nameValuePairs.toString()生成响应内容,这个方法返回的是List的默认字符串格式(类似[ACK=Success,name1=value1,...]),并非PayPal NVP API要求的URL编码格式(键值对用&分隔,例如ACK=Success&name1=value1&name2=value2)。
你需要用URLEncodedUtils.format()工具方法生成符合要求的NVP格式字符串,修改服务类的返回代码:
import org.apache.http.client.utils.URLEncodedUtils; import java.nio.charset.StandardCharsets; // ... return new ResponseEntity<>(URLEncodedUtils.format(nameValuePairs, StandardCharsets.UTF_8), HttpStatus.OK);
关键说明:
URLEncodedUtils.format()会将NameValuePair列表转换为标准URL编码格式,自动用&分隔各个键值对,同时对特殊字符做编码处理。- 调用方的
URLEncodedUtils.parse()方法可以正确解析这种格式,得到独立的键值对列表。
内容的提问来源于stack exchange,提问作者user3379502
相关产品推荐
相关产品推荐

