Springboot使用RestTemplate发送Post请求postForEntity (application/json)的坑

当使用RestTemplate进行http请求时,的确很方便,但是当需要进行post请求时遇到了坑

1POST传递参数 :采用 LinkedMultiValueMap ,不能使用HashMap

 
  1. String url = 'http://posturl';

  2. MultiValueMap<String, String> map= new LinkedMultiValueMap<String, String>();

  3. map.add("shopid","1");

  4. HttpHeaders headers = new HttpHeaders();

  5. headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

  6. HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(map, headers);

  7. return restTemplate.postForEntity(url, request,String.class);

  • 注意 上面的请求支持参数类型均为String类型,如果MultiValueMap<String, Object>  LinkedMultiValueMap 会将value放进list中,key --> [value]

2 采用JSONObject或者实体类传递参数

 
  1. RestTemplate restTemplate = new RestTemplate();

  2. HttpHeaders headers = new HttpHeaders();

  3. MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");

  4. headers.setContentType(type);

  5. headers.add("Accept", MediaType.APPLICATION_JSON.toString());

  6.  
  7. JSONObject param = new JSONObject();

  8. param.put("username", "123");

  9.  
  10. HttpEntity<String> formEntity = new HttpEntity<String>(param, headers);

  11.  
  12. String result = restTemplate.postForObject(url, formEntity, String.class);

  • 使用这种方式可以传递任意类型的参数,避免上面的情况

总结,遇到这种问题时多看看源码会很有帮助。

 
  1. public class LinkedMultiValueMap<K, V> implements MultiValueMap<K, V>, Serializable, Cloneable {

  2. private static final long serialVersionUID = 3801124242820219131L;

  3. private final Map<K, List<V>> targetMap;

  4.  
  5. public LinkedMultiValueMap() {

  6. this.targetMap = new LinkedHashMap();

  7. }

  8.  
  9. public LinkedMultiValueMap(int initialCapacity) {

  10. this.targetMap = new LinkedHashMap(initialCapacity);

  11. }

  12.  
  13. public LinkedMultiValueMap(Map<K, List<V>> otherMap) {

  14. this.targetMap = new LinkedHashMap(otherMap);

  15. }

  16.  
  17. @Nullable

  18. public V getFirst(K key) {

  19. List<V> values = (List)this.targetMap.get(key);

  20. return values != null && !values.isEmpty() ? values.get(0) : null;

  21. }

  22.  
  23. public void add(K key, @Nullable V value) {

  24. List<V> values = (List)this.targetMap.computeIfAbsent(key, (k) -> {

  25. return new LinkedList();

  26. });

  27. values.add(value);

  28. }

  29.  
  30. public void addAll(K key, List<? extends V> values) {

  31. List<V> currentValues = (List)this.targetMap.computeIfAbsent(key, (k) -> {

  32. return new LinkedList();

  33. });

  34. currentValues.addAll(values);

  35. }

  36.  
  37. public void addAll(MultiValueMap<K, V> values) {

  38. Iterator var2 = values.entrySet().iterator();

  39.  
  40. while(var2.hasNext()) {

  41. Entry<K, List<V>> entry = (Entry)var2.next();

  42. this.addAll(entry.getKey(), (List)entry.getValue());

  43. }

  44.  
  45. }

  46.  
  47. public void set(K key, @Nullable V value) {

  48. List<V> values = new LinkedList();

  49. values.add(value);

  50. this.targetMap.put(key, values);

  51. }

  52.  
  53. public void setAll(Map<K, V> values) {

  54. values.forEach(this::set);

  55. }

  56.  
  57. public Map<K, V> toSingleValueMap() {

  58. LinkedHashMap<K, V> singleValueMap = new LinkedHashMap(this.targetMap.size());

  59. this.targetMap.forEach((key, values) -> {

  60. if (values != null && !values.isEmpty()) {

  61. singleValueMap.put(key, values.get(0));

  62. }

  63.  
  64. });

  65. return singleValueMap;

  66. }

转自:https://blog.csdn.net/justin_bob/article/details/103019115

猜你喜欢

转载自blog.csdn.net/anita9999/article/details/108833191