RestTemplate接口请求总结

喵你奶奶个爪,踩坑了记录一下解决方案,坑填上了,坑已经无法重现。

一、获取接口返回状态码

使用getForEntity调用接口,返回结果调用getStatusCode()方法取得HttpStatus对象,然后就可以调用里面的各种方法来满足你的需求了

//判断接口返回是否为200
    public static Boolean ping(){
        String url = domain + "/it/ping";
        try{
            ResponseEntity<String> responseEntity = template.getForEntity(url,String.class);
            HttpStatus status = responseEntity.getStatusCode();//获取返回状态
            return status.is2xxSuccessful();//判断状态码是否为2开头的
        }catch(Exception e){
            return false; //502 ,500是不能正常返回结果的,需要catch住,返回一个false
        }
    }

 二、什么都不带,将参数拼接在请求url后面

将参数拼接在请求url后面,postForObject请求参数为null

public static void login(String userCode,String md5Password,int companyId,WebDriver driver){
        RestTemplate template = new RestTemplate();
        String url = "https://login.dooioo.net/api/autotest/userLogin";//请求地址
        String param ="?userCode=" + userCode + "&md5Password=" + md5Password + "&companyId=" + companyId;
        try{
                String  str = template.postForObject(url+param,null, String.class);//所得结果为调整成String类型
           }catch(Exception e){
                System.out.println("登录失败");
                e.printStackTrace();
            }
    }

 

三、带cookie,header,参数

带cookie实际也是将参数塞入header中:

1、定义header对象: HttpHeaders headers = new HttpHeaders()
2、将要的cookie塞入header:headers.put(HttpHeaders.COOKIE,cookieList)(注意cookie需要是一个list,内容为 name=value 例如:loginticket=sldjfas112sadfsd)
3、也可以在Header中塞入其他值:headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED)

/*
        获取浏览器的cookie,将其塞入header中
     */
    public static HttpHeaders getHeader(WebDriver driver){
        HttpHeaders headers = new HttpHeaders();
        Set<Cookie> cookies = driver.manage().getCookies();//获取浏览器cookies
        List<String> cookieList = new ArrayList<String>();
        for(Cookie cookie:cookies){ //将浏览器cookies放入list中
            //System.out.println("当前cookies为:" +  cookie.getDomain() + " " + cookie.getName() + ":" + cookie.getValue());
            cookieList.add(cookie.getName() + "=" + cookie.getValue());
        }
        //System.out.println("cookie为:" + cookieList.toString());
        headers.put(HttpHeaders.COOKIE,cookieList); //将cookie放入header
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); //post表单 ,如果是个json则设置为MediaType.APPLICATION_JSON
        return headers;
    }

放入参数:

1、使用MultiValueMap用来放参数,(使用HashMap不行,具体原因可见http://www.cnblogs.com/shoren/p/RestTemplate-problem.html ),
2、根据header和参数实例化HttpEntity ,然后调用postForEntity方法调用接口

HttpEntity<MultiValueMap<String,String>> request = new HttpEntity<MultiValueMap<String,String>>(param,headers)

 完整代码如下(使用方法可参考:https://segmentfault.com/a/1190000007778403):

 public static void gitUpLoad(WebDriver driver,String uploadUrl,String fileName,String content,String branch,String requestUrl) throws  Exception{

        String authenticity_token = getToken(driver,uploadUrl);//获取token
        RestTemplate template = new RestTemplate();
        HttpHeaders headers = getHeader(driver);//获取header
        MultiValueMap<String,String> param = new LinkedMultiValueMap<String, String>();//参数放入一个map中,restTemplate不能用hashMap
        //将请求参数放入map中
        param.add("authenticity_token",authenticity_token);
        param.add("file_name",fileName);
        param.add("encoding","text");
        param.add("commit_message","addFile");
        param.add("target_branch",branch);
        param.add("original_branch",branch);
        param.add("content",content);
        param.add("utf8","✓");
        //System.out.println("参数内容为:" + param.toString());
        HttpEntity<MultiValueMap<String,String>> request = new HttpEntity<MultiValueMap<String,String>>(param,headers);//将参数和header组成一个请求
        ResponseEntity<String> response = template.postForEntity(requestUrl, request, String.class);

    }

四、使用exchange指定调用方式

使用exchange方法可以指定调用方式

需要注意的一点是对于返回结果为204 no content,这种没有返回值的请求,RestTemplate会抛错,有需要的话可以使用httpClient的fluent

public  void  deleteQueue(String vhost,String queue){

        HttpHeaders headers = new HttpHeaders();//header参数
        headers.add("authorization",Auth);
        headers.setContentType(MediaType.APPLICATION_JSON);

        JSONObject content = new JSONObject();//放入body中的json参数
        content.put("mode","delete");
        content.put("name",queue);
        content.put("vhost","/" + vhost);

        String newVhost = "%2F" + vhost;
        String newUrl = url + "/api/queues/" + newVhost + "/" + queue;

        HttpEntity<JSONObject> request = new HttpEntity<>(content,headers); //组装
  
        ResponseEntity<String> response = template.exchange(newUrl,HttpMethod.DELETE,request,String.class);
    }

 

RestTemplate是Spring框架提供的一个用于发送HTTP请求的模板类。通过RestTemplate,我们可以方便地发送GET、POST、PUT、DELETE等不同类型的请求,并获取响应结果。在进行请求转发时,可以使用RestTemplate来发送请求到目标后台接口。[1] 要进行请求转发,首先需要引入相关的依赖包,如Apache HttpClient和Spring Boot Web。可以在项目的pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.10</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> ``` 接下来,可以使用RestTemplate发送请求。例如,如果需要将文件上传接口请求通过RestTemplate转发到另一个后台接口上,可以使用RestTemplate的postForObject方法发送POST请求,并将文件作为参数传递给目标接口。[2] ```java @PostMapping("/xxxx/fileUpload") String fileUpload(@RequestParam(value = "files") MultipartFile[] multipartFiles) { // 使用RestTemplate发送请求转发 RestTemplate restTemplate = new RestTemplate(); String targetUrl = "http://目标后台接口URL"; String response = restTemplate.postForObject(targetUrl, multipartFiles, String.class); return response; } ``` 需要注意的是,根据请求参数的形式,如form-data和raw参数,参数的附加位置可能会有所不同。此外,为了避免出现转码问题,可以先将URL构造为String,然后再创建URI,或直接将URL赋给RestTemplate。[3] 总结起来,使用RestTemplate进行请求转发的步骤包括引入相关依赖、创建RestTemplate实例、构造目标接口的URL,并使用RestTemplate发送请求获取响应结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值