`
darrenzhu
  • 浏览: 802589 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

使用 Spring RestTemplate 发送 post 请求

阅读更多

注意点:
1)使用MultiValueMap设置入参,不要使用HashMap
2)构造HttpEntity发送请求
3)请求的参数使用LinkedMultiValueMap,每一个key里面存储的是个list,但是跟理解的有区别。不管入参是单个字符串、是一个对象的JSON字符串,还是一个对象List的JSON字符串,都是把整体的JSON作为第一个元素传递过去的,也就是请求接收方是类似下面的RestTemplatePostResponseParam 对象,但是值永远取第一个元素里的值,不管值代表的是单个字符串还是一个数组对象
4)返回的值同理也是要MultiValueMap,于是接受返回值的对象为RestTemplatePostRequestParam,也是值都只在第一个元素里面




调用方(客户端)代码

@Slf4j
@RestController
@RequestMapping("/sap")
public class SapPullController {
    private final RestTemplate restTemplate;
    private final String SKU_AVALIABLE_FOR_SALE_URL = "http://mms-msm-hub/eccpullskuavailable/checkskuavailableforsale";

    @Autowired
    public SapPullController(RestTemplate restTemplate) {
    	this.restTemplate = restTemplate;
    }

    @ApiOperation(value = "判断商品是否可以销售", tags = {SwaggerConstant.SAP_PULL})
    @RequestMapping(value = "/checkskuavailableforsale", method = RequestMethod.POST)
    public SkuAvailableForSaleOutputVO checkSkuAvailableForSale(@ApiParam(value = "请求参数", required = true) @RequestBody Map<String, Object> data) {
        log.info("--商品是否可销售入参: " + data.toString());
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
        MultiValueMap<String,String> parameters = new LinkedMultiValueMap<String,String>();
        parameters.add("params", JsonUtils.ToJsonString(data.get("item")).toLowerCase());
        HttpEntity<MultiValueMap<String, String>> entity = new HttpEntity<>(parameters, headers);
        log.info("RequestEntity:{}", JsonUtils.ToJsonString(entity));

        ResponseEntity<RestTemplatePostResponseParam> responseEntity = restTemplate.postForEntity(SKU_AVALIABLE_FOR_SALE_URL, entity, RestTemplatePostResponseParam.class);
        log.info("ResponseEntity:{}", JsonUtils.ToJsonString(responseEntity));
		return JSON.parseObject(responseEntity.getBody().getParams().get(0), SkuAvailableForSaleOutputVO.class);
    }
}


@Data
@AllArgsConstructor
@NoArgsConstructor
public class RestTemplatePostResponseParam implements Serializable{
	private static final long serialVersionUID = 1L;
    private List<String> params = new ArrayList<>();
}

@Data
@AllArgsConstructor
@NoArgsConstructor
public class SkuAvailableForSaleOutputVO implements Serializable{
	private static final long serialVersionUID = 1L;
    private List<ITEMBean> ITEM;
    @Data
    public static class ITEMBean {
    	private String shopCode;
    	private String skuCode;
    	private String deliveryLocationCode;
    	private String status;
    	private String description;
    }
}



服务提供方代码


/**
 * 商品是否可销售
 * @author zhudaohui
 * @since 2018-07-20
 *
 */
@RestController
public class FHubEccPullSkuAvailableServiceImpl implements FHubEccPullSkuAvailableService {
	@Autowired
	private SkuAvailableForSaleService skuAvailableForSaleService;
	
    @Override
    @ApiOperation(value = "判断商品是否可销售", response = String.class, tags = {Swagger2Config.msm_Api_OutPut_Through_PI + Swagger2Config.web_Tag})
    @OpenAPI(products = {ProductType.ALLIEDWEB}, authorities = {"mms:*"})
	public MultiValueMap<String,String> checkSkuAvailableForSale(@ApiParam("判断商品是否可销售入参") @RequestBody(required=true) RestTemplatePostRequestParam param) {
    	SkuAvailableForSaleInputVO vo = new SkuAvailableForSaleInputVO();
    	List<SkuAvailableForSaleInputVO.ITEMBean> list = JSON.parseArray(param.getParams().get(0), SkuAvailableForSaleInputVO.ITEMBean.class);
    	vo.setItems(list);
    	SkuAvailableForSaleOutputVO result = skuAvailableForSaleService.checkSkuAvailableForSale(vo);
    	MultiValueMap<String, String> response = new LinkedMultiValueMap<String, String>();
    	response.add("params", JsonUtils.ToJsonString(result).toLowerCase());
    	return response;
	}
}


@Data
@ApiModel("RestTemplate post请求参数接受")
@AllArgsConstructor
@NoArgsConstructor
public class RestTemplatePostRequestParam implements Serializable{
	private static final long serialVersionUID = 1L;
    private List<String> params;
}

@Data
@ApiModel("商品是否可销售入参")
@AllArgsConstructor
@NoArgsConstructor
public class SkuAvailableForSaleInputVO implements Serializable{
	private static final long serialVersionUID = 1L;
    private List<ITEMBean> items;

    @Data
    public static class ITEMBean {
    	private String shopCode;
    	private String skuCode;
    	private String deliveryLocationCode;
    }
}

@Data
@ApiModel("商品是否可销售出参")
@AllArgsConstructor
@NoArgsConstructor
public class SkuAvailableForSaleOutputVO implements Serializable{
	private static final long serialVersionUID = 1L;
    private List<ITEMBean> ITEM = new ArrayList<>();
    
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public static class ITEMBean {
    	private String shopCode;
    	private String skuCode;
    	private String deliveryLocationCode;
    	private String status;
    	private String description;
    }
}




关于fasterxml-jackson发生Can not deserialize instance of异常原因验证
https://blog.csdn.net/li396864285/article/details/54287859


org.springframework.web.client.HttpClientErrorException: 400 null
百度了一下400代表无法解析请求。

说明请求是有问题的,如果发送的请求端没有问题。

那么就去控制器中查看是否有异常。

比如问题是控制器中的参数使用注解异常,

错误注解:@RequestParam

正确注解:@RequestBody


分享到:
评论

相关推荐

    发送Post请求,内容格式为xml,并获取响应内容

    在给定的代码片段中,主要展示了如何使用Java中的Apache HttpClient库发送一个包含XML数据的POST请求,并接收响应。下面是对关键部分的详细分析: 1. **导入必要的库**:代码首先导入了处理网络请求、输入输出流...

    精讲RestTemplate,POST请求方法使用详解.docx

    ### 精讲RestTemplate,POST请求方法使用详解 #### 一、理解RestTemplate POST请求方法 RestTemplate 是 Spring 框架中的一个重要组件,它提供了多种便捷访问远程 HTTP 服务的方法,不仅可以发送请求,还能从...

    java中使用restTemplate发送http请求

    在`RestTemplate`中,GET请求通常用于获取资源,而POST请求则用于创建新的资源。下面分别介绍这两种请求的实现方式: 1. **GET请求**: 使用`RestTemplate`发送GET请求非常简单。首先,你需要创建一个`...

    springRestTemplate

    在 Spring Boot 中,由于其内置的自动配置特性,使用 RestTemplate 更加方便。让我们深入探讨一下 RestTemplate 的核心概念、功能以及如何在实际应用中进行设置和使用。 1. **什么是 RestTemplate?** RestTemplate...

    RestTemplate如何在Spring或非Spring环境下使用.docx

    例如,以下代码展示了如何使用`RestTemplate`发送一个GET请求并获取JSON响应: ```java @Test public void simpleTest() { RestTemplate restTemplate = new RestTemplate(); String url = ...

    精讲RestTemplate自定义请求失败异常处理.docx

    在使用Spring框架中的`RestTemplate`进行HTTP请求时,我们可能会遇到各种异常情况,如服务超时、服务不存在等,这些异常通常会导致程序中断,无法继续执行后续代码。在这种情况下,我们希望即使请求失败,也能获取到...

    RestTemplate请求失败自动重试机制.docx

    总的来说,通过Spring Retry和`RestTemplate`的结合,我们可以实现对远程服务请求的智能重试,提高了系统在面对网络不稳定或服务短暂故障时的健壮性。这种机制对于提高应用的可靠性具有重要意义。

    Spring使用RestTemplate模拟form提交示例

    Spring 使用 RestTemplate 模拟 Form 提交示例 在本文中,我们将介绍如何使用 Spring 的 RestTemplate 来模拟 Form 提交的示例。RestTemplate 是 Spring 框架中的一种模板类,用于在客户端访问 Web 服务。通过提供...

    http、restTemplate请求资源(含带头部信息)

    在Java开发中,`RestTemplate`是Spring框架提供的一种方便的发送HTTP请求的工具,可以用来执行GET、POST等各种HTTP方法,并处理响应。 首先,我们来详细了解GET和POST两种HTTP请求方法: 1. GET请求:GET是最常见...

    如何使用Spring RestTemplate访问restful服务

    "使用Spring RestTemplate访问restful服务" Spring RestTemplate是Spring框架中的一种轻量级客户端,用于访问restful服务。它提供了一种简洁的方式来访问restful接口,简化了HTTP请求和响应处理的过程。 什么是...

    详解使用Spring的restTemplete进行Http请求

    在本篇文章中,我们将详细介绍如何使用 RestTemplate 对象发送 GET 和 POST 请求,并对请求的 headers、参数和 Body 进行自定义设置。 一、RestTemplate 简介 RestTemplate 是 Spring 框架提供的一个用于发送 ...

    4中url请求方式,包括http和spring自带请求

    Spring RestTemplate在这方面提供了便利,例如`UriComponentsBuilder`可以方便地构建和拼接URL,`HttpEntity`可以用于构造POST请求的主体。 实际开发中,选择哪种请求方式取决于具体需求。GET适用于无副作用的查询...

    RestTemplate的使用及需要注意的地方

    对于POST请求,你可以使用`postForEntity`或`exchange`方法。例如,向服务器提交JSON数据: ```java HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); ...

    HttpClient模拟get,post请求并发送请求参数(json等)

    然而,需要注意的是,随着Java生态的发展,Spring Framework中的RestTemplate或WebClient(针对Spring Boot 2.x及以上版本)也成为了常用的HTTP客户端工具,它们提供了更高级别的抽象和更好的集成性。

    Spring Boot RestTemplate提交表单数据的三种方法

    `postForEntity`是`exchange`的一个简化版本,适用于POST请求。我们只需省略HTTP方法参数(即`HttpMethod.POST`),其他部分与`exchange`方法类似。下面是对应的代码: ```java // 使用postForEntity方法替换...

    spring rest mvc使用RestTemplate调用

    - **POST请求**:使用`postForEntity()`,传入URL、请求体和响应类型。例如,发送JSON数据: ```java HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); ...

    Spring RestTemplate基本使用介绍

    Spring RestTemplate 基本使用介绍 Spring RestTemplate 是 Spring 提供的用于访问 Rest 服务的客户端,提供了多种便捷访问远程 HTTP 服务的方法,能够大大提高客户端的编写效率。下面我们将详细介绍 Spring ...

    使用RestTemplate进行feignclient调用

    它可以发送 GET、POST、PUT、DELETE 等各种 HTTP 请求,并处理响应结果。在没有 Feign 的情况下,我们可以使用 RestTemplate 直接构建请求,调用远程服务。 要使用 RestTemplate 进行 FeignClient 调用,你需要完成...

    《深入理解Spring Cloud与微服务构建》学习笔记(十一)~使用RestTemplate和Ribbo消费服务

    RestTemplate是Spring提供的一个用于发送HTTP请求并处理响应的工具类,特别适用于RESTful服务的客户端开发。通过RestTemplate,我们可以方便地进行GET、POST、PUT、DELETE等各种HTTP操作。在Spring Cloud中,...

Global site tag (gtag.js) - Google Analytics