SpringBoot-RestTemplate实现调用第三方API传参问题

SpringBoot-RestTemplate传参请求第三方接口时,参数传不过去,因为我用了 Map<String, String> data = new HashMap<String, String>();这样是不行的,必须使用MultiValueMap<String, String> params= new LinkedMultiValueMap<>();传参。

package com.cn.wtsd.service;

import com.alibaba.fastjson.JSONObject;
import com.cn.wtsd.config.WanTongConfig;
import com.cn.wtsd.constant.CodeConstant;
import com.cn.wtsd.entity.ResultModel;
import com.cn.wtsd.util.DESUtils;
import com.cn.wtsd.util.SignUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;

import java.util.HashMap;
import java.util.Map;

/**
 * @program: Transaction
 * @description: 支付接口
 * @author: hantao
 * @create: 2018-12-28 18:06
 */
@Service
public class PayService {

    @Autowired
    private RestTemplate restTemplate;

    public ResultModel pay(){
        Map<String, String> map = new HashMap<String, String>();
        map.put("OUTTRADENO", System.currentTimeMillis() + "");
        map.put("PAYAMOUNT", "100");
        map.put("PAYTYPE", "01");
        map.put("CHANNEL", "01");
        map.put("SOURCE", "02");
//        map.put("OPENID", "02");
        map.put("ORDERTITLE", "顾客付款");
        map.put("ID", "100013100101");
        map.put("TERMINALID", "YY100013100101");
        String body="";
        try {
            //参数加密
            String encodeByCBC = DESUtils.encodeByCBC(WanTongConfig.ENCRVPTION_KEY, map);
            System.out.println("encodeByCBC:"+encodeByCBC);
//            SIGN加密
            Map<String, String> requestMap = new HashMap<String, String>();
            requestMap.put("PARTNERID", "100013");
            requestMap.put("ENCRYPTEDDATA", encodeByCBC);
            String presign = SignUtil.creatSignContent(requestMap, "UTF-8", false);
            presign = presign + "&key="+WanTongConfig.SINGN_KEY;
            System.out.println("待签名的字符串:"+presign);
            String sign = SignUtil.md5(presign, "UTF-8");
            System.out.println("sign:"+sign);
//            Map<String, String> data = new HashMap<String, String>();
//            data.put("PARTNERID","100013");
//            data.put("ENCRYPTEDDATA",encodeByCBC);
//            data.put("SIGN",sign);
            MultiValueMap<String, String> params= new LinkedMultiValueMap<>();
            //添加请求的参数
            params.add("PARTNERID", "100013");             //必传
            params.add("ENCRYPTEDDATA", encodeByCBC);
            params.add("SIGN", sign);
//            HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(params);
            ResponseEntity<String> responseEntity=restTemplate.postForEntity(WanTongConfig.REQUEST_PAY_URL,params,String.class);
            body=responseEntity.getBody();
        } catch (Exception e) {
//            e.printStackTrace();
            return new ResultModel(CodeConstant.FAIL,"签名或参数加密失败");
        }
        return new ResultModel(CodeConstant.SUCCESS,CodeConstant.SUCCESS_MSG,body);
    }

}
Spring Boot调用第三方API接口通常会用到一些常用的Java库,比如Apache HttpClient、OkHttp或者Spring提供的RestTemplate。下面是使用RestTemplate进行API调用的基本步骤: 1. 引入依赖:在Spring Boot项目的pom.xml中添加`spring-boot-starter-web`依赖,这个依赖中包含了RestTemplate。 ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> ``` 2. 注入RestTemplate:在Spring Boot的主类或配置类上添加`@SpringBootApplication`注解,并在需要使用RestTemplate的类中使用`@Autowired`注解来注入RestTemplate实例。 ```java @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } @Bean public RestTemplate restTemplate() { return new RestTemplate(); } } public class SomeService { @Autowired private RestTemplate restTemplate; // 其他代码... } ``` 3. 调用第三方API:在业务逻辑中使用注入的RestTemplate调用第三方API接口。可以通过GET、POST、PUT、DELETE等方法发送HTTP请求,并处理返回的结果。 ```java public String callThirdPartyApi(String apiUrl, Map<String, String> params) { // 如果API需要参数,可以使用MultiValueMap构建请求参数 MultiValueMap<String, String> map = new LinkedMultiValueMap<>(); map.setAll(params); // 发送GET请求 ResponseEntity<String> response = restTemplate.getForEntity(apiUrl, String.class, map); // 处理响应 return response.getBody(); } ``` 4. 错误处理和配置:在调用第三方API时,需要处理可能出现的异常,如`HttpClientErrorException`或`HttpServerErrorException`。还可以配置RestTemplate,例如自定义连接超时、读取超时等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值