万字长文讲解调用第三方接口,RestTemplate,urlConnection使用详解,java代码模拟postman发送请求

这篇具有很好参考价值的文章主要介绍了万字长文讲解调用第三方接口,RestTemplate,urlConnection使用详解,java代码模拟postman发送请求。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

业务场景:在日常开发中,经常需要调用第三方接口,例如调用物流接口,此时需要利用urlConnection或者restTemplate模拟postman发送请求,请求支持加header ,设置content-type支持传递json;请求方式get,post,也可以需要传递文件,或者传递文件流;

下面这个例子就包含日常开发中大部分的请求,可以直接运行,觉得有用收藏点赞不迷路。

新建springmvc项目,项目结构图

java 模拟postman,java,postman,开发语言

pom文件

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.5.7</version>
    </dependency>

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.68</version>
    </dependency>
</dependencies>

配置文件

server.port=8089
spring.servlet.multipart.max-file-size = 100MB
spring.servlet.multipart.max-request-size = 1000MB

User类

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    String name;
    int age;

    public User(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

UserController类

import com.alibaba.fastjson.JSON;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.LinkedHashMap;
import java.util.Map;
@RestController
@RequestMapping("/user")
public class UserController {

        @GetMapping("/loginGet")
        public String loginGet(String name,Integer age){
            System.out.println(name+""+age);
            User user=new User(name,age);
            return JSON.toJSONString(user);
        }

        @PostMapping("/login")
        public String login(User user){
            System.out.println(user);
            return JSON.toJSONString(user);
        }

        @PostMapping("/upload")
        public Map<String, String> login(User user, @RequestParam("file") MultipartFile file){
            System.out.println(user);
            System.out.println(file.getName());
            Map<String, String> fileMetadata = new LinkedHashMap<>();
            fileMetadata.put("文件名", file.getOriginalFilename());
            fileMetadata.put("文件类型", file.getContentType());
            fileMetadata.put("文件大小(byte)", String.valueOf(file.getSize()));
            return fileMetadata;
        }


        @PostMapping("/loginJson")
        public String loginJson(@RequestBody User user){
            System.out.println(user);
            return JSON.toJSONString(user);
        }
}

post方式 x-www-form-urlencoded key-value只能是string

java 模拟postman,java,postman,开发语言

对应java代码

import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @ClassName JavaNice
 * post x-www-form-urlencoded  key-value只能是string
 **/
@Slf4j
public class PostUtils {
    private static final String ENCODING = "UTF-8";

    /**
     * post x-www-form-urlencoded  key-value只能是string*
     * @param url
     * @param paramsMap
     * @return
     */
    public static String sendPost(String url, Map<String, String> paramsMap) {
        CloseableHttpClient client = HttpClients.createDefault();
        String responseText = "";
        CloseableHttpResponse response = null;
        try {
            HttpPost method = new HttpPost(url);
            if (paramsMap != null) {
                List<NameValuePair> paramList = new ArrayList<NameValuePair>();
                for (Map.Entry<String, String> param : paramsMap.entrySet()) {
                    NameValuePair pair = new BasicNameValuePair(param.getKey(), param.getValue());
                    paramList.add(pair);
                }
                method.setEntity(new UrlEncodedFormEntity(paramList, ENCODING));
            }
            response = client.execute(method);
            HttpEntity entity = response.getEntity();
            if (entity != null) {
                responseText = EntityUtils.toString(entity);
            }
        } catch (Exception e) {
            log.error("http request failed",e);
        } finally {
            try {
                response.close();
            } catch (Exception e) {
                log.error("",e);
            }
        }
        return responseText;
    }
}

调用代码

@Test
void postString() {
    //post x-www-form-urlencoded  key-value只能是string
    Map<String,String> user=new HashMap<>();
    user.put("name","javaNice");
    String json = JSONObject.toJSONString(user);
    Map<String,String> paramsMap = JSONObject.parseObject(json,Map.class);
    System.out.println(json);
    String resp = PostUtils.sendPost("http://localhost:8089/user/login",paramsMap);
    System.out.println(resp);
}

get 方式 传递参数拼接在url上

java 模拟postman,java,postman,开发语言

post 方式 传递参数url拼接

java 模拟postman,java,postman,开发语言

post 方式 传递参数为json

java 模拟postman,java,postman,开发语言

工具类

import com.alibaba.fastjson.JSONObject;
import org.springframework.util.StringUtils;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.List;
import java.util.Map;

public class HttpRequestUtil {

    public static String sendGet(String url, String param) {
        String result = "";
        BufferedReader in = null;
        try {
            if (!url.contains("?")) {
                url += "?1=1";
            }
            if (!param.startsWith("&")) {
                url += "&";
            }
            String urlNameString = url + param;
            URL realUrl = new URL(urlNameString);
            // 打开和URL之间的连接
            URLConnection connection = realUrl.openConnection();
            // 设置通用的请求属性
            connection.setRequestProperty("accept", "*/*");
            connection.setRequestProperty("connection", "Keep-Alive");
            connection.setRequestProperty("user-agent",
                    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            // 建立实际的连接
            connection.connect();
            // 获取所有响应头字段
            Map<String, List<String>> map = connection.getHeaderFields();
            // 遍历所有的响应头字段
//            for (String key : map.keySet()) {
//                System.out.println(key + "--->" + map.get(key));
//            }
            // 定义 BufferedReader输入流来读取URL的响应
            in = new BufferedReader(new InputStreamReader(
                    connection.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
                result += line;
            }
        } catch (Exception e) {
            System.out.println("发送GET请求出现异常!" + e);
            e.printStackTrace();
        }
        // 使用finally块来关闭输入流
        finally {
            try {
                if (in != null) {
                    in.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
        return result;
    }


    public static String sendPost(String url, String param) {
        HttpURLConnection httpURLConnection = null;
        OutputStream out = null; //写
        InputStream in = null;   //读
        int responseCode = 0;    //远程主机响应的HTTP状态码
        String result = "";
        try {
            URL sendUrl = new URL(url);
            httpURLConnection = (HttpURLConnection) sendUrl.openConnection();
            //post方式请求
            httpURLConnection.setRequestMethod("POST");
            //一定要设置 Content-Type 要不然服务端接收不到参数
            httpURLConnection.setRequestProperty("Content-Type", "application/json");
            //指示应用程序要将数据写入URL连接,其值默认为false(是否传参)
            httpURLConnection.setDoOutput(true);
            //httpURLConnection.setDoInput(true);
            httpURLConnection.setUseCaches(false);
            httpURLConnection.setConnectTimeout(30000); //30秒连接超时
            httpURLConnection.setReadTimeout(30000);    //30秒读取超时
            //获取输出流
            out = httpURLConnection.getOutputStream();
            //输出流里写入POST参数
            out.write(param.getBytes());
            out.flush();
            out.close();
            responseCode = httpURLConnection.getResponseCode();
            BufferedReader br = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream(), "UTF-8"));
            result = br.readLine();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    public static String objectToUrlParam(Object object) {
        if (object != null) {
            StringBuilder builder = new StringBuilder();
//            JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(object));
            Map<String, Object> map = JSONObject.parseObject(JSONObject.toJSONString(object), Map.class);
            for (Map.Entry<String, Object> entry :
                    map.entrySet()) {
                if (entry.getValue() != null && !StringUtils.isEmpty(entry.getValue().toString())) {
                    builder.append("&").append(entry.getKey()).append("=").append(encode(entry.getValue()));
                }
            }
            return builder.toString();
        }
        return "";
    }

    public static String encode(Object object) {
        if (object != null) {
            try {
                return URLEncoder.encode(object.toString(), "utf-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
                throw new RuntimeException("字符串编码失败");
            }
        }
        return "";
    }

}

调用代码

@Test
void get() {
    //get 方式 传递参数拼接在url上
    User user=new User("javaNice",666);
    String paramsMap = HttpRequestUtil.objectToUrlParam(user);
    String resp = HttpRequestUtil.sendGet("http://localhost:8089/user/loginGet",paramsMap);
    System.out.println(resp);
}


@Test
void postUrl() {
    //post 方式 传递参数url拼接
    User user=new User("javaNice",666);
    String paramsMap = HttpRequestUtil.objectToUrlParam(user);
    System.out.println("传递参数"+paramsMap);
    String url="http://localhost:8089/user/login?1=1"+paramsMap;
    String resp = HttpRequestUtil.sendPost(url,"");
    System.out.println("返回参数"+resp);
}

@Test
void post() {
    //post 方式 传递参数为json
    User user=new User("javaNice",666);
    String paramsMap = JSON.toJSONString(user);
    System.out.println("传递参数"+paramsMap);
    String resp = HttpRequestUtil.sendPost("http://localhost:8089/user/loginJson",paramsMap);
    System.out.println("返回参数"+resp);
}

RestTemplate方式

post 方式 传递参数为json

java 模拟postman,java,postman,开发语言

@Test
void post() {
    //post 方式 传递参数为json
    RestTemplate restTemplate = new RestTemplate();
    String url = "http://localhost:8089/user/loginJson";
    User body = new User("javaNice", 666);
    User result = restTemplate.postForObject(url, body, User.class);
    System.out.println("返回参数" + result);
}

post 方式 传递参数为form-data 并且传递文件并添加请求头

java 模拟postman,java,postman,开发语言

java 模拟postman,java,postman,开发语言

@Test
void postFormFile() {
    //post 方式 传递参数为form-data 并且传递文件
    RestTemplate restTemplate = new RestTemplate();
    String url = "http://localhost:8089/user/upload";
    //①:表单信息,需要放在MultiValueMap中,MultiValueMap相当于Map<String,List<String>>
    MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
    //调用add方法放入表单元素(表单名称:值)
    //②:文件对应的类型,需要是org.springframework.core.io.Resource类型的,常见的有[FileSystemResource、InputStreamResource、ByteArrayResource]
    body.add("file", new FileSystemResource("/java/com/example/springmvc/22c017e48ea445199708dc1d2832dae5.pdf"));
    body.add("name", "javaNice");
    body.add("age", "666");
    //③:头
    HttpHeaders headers = new HttpHeaders();
    headers.add("header1", "v1");
    headers.add("header2", "v2");
    //④:请求实体
    RequestEntity<MultiValueMap<String, Object>> requestEntity = new RequestEntity<>(body, headers, HttpMethod.POST, URI.create(url));
    //⑤:发送请求(请求实体,返回值需要转换的类型)
    ResponseEntity<Map<String, String>> responseEntity = restTemplate.exchange(
            requestEntity,
            new ParameterizedTypeReference<Map<String, String>>() {
            });
    Map<String, String> result = responseEntity.getBody();
    System.out.println(result);
}

post 通过流的方式上传文件

java 模拟postman,java,postman,开发语言

java 模拟postman,java,postman,开发语言文章来源地址https://www.toymoban.com/news/detail-745564.html

@Test
void postFormFileStream() {
    RestTemplate restTemplate = new RestTemplate();
    String url = "http://localhost:8089/user/upload";
    //①:表单信息,需要放在MultiValueMap中,MultiValueMap相当于Map<String,List<String>>
    MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
    /**
     * ②:通过流的方式上传文件,流的方式需要用到InputStreamResource类,需要重写2个方法
     * getFilename:文件名称
     * contentLength:长度
     */
    File file = new File("/java/com/example/springmvc/22c017e48ea445199708dc1d2832dae5.pdf");
    //2、建立数据通道
    try {
        InputStream inputStream = new FileInputStream(file);

        InputStreamResource inputStreamResource = new InputStreamResource(inputStream) {
            @Override
            public String getFilename() {
                return "22c017e48ea445199708dc1d2832dae5.pdf";
            }

            @Override
            public long contentLength() throws IOException {
                return inputStream.available();
            }
        };
        body.add("file", inputStreamResource);
        body.add("name", "javaNice");
        body.add("age", "666");
        //③:头
        HttpHeaders headers = new HttpHeaders();
        headers.add("header1", "v1");
        headers.add("header2", "v2");
        //④:请求实体
        RequestEntity<MultiValueMap<String, Object>> requestEntity = new RequestEntity<>(body, headers, HttpMethod.POST, URI.create(url));
        //⑤:发送请求(请求实体,返回值需要转换的类型)
        ResponseEntity<Map<String, String>> responseEntity = restTemplate.exchange(
                requestEntity,
                new ParameterizedTypeReference<Map<String, String>>() {
                });
        Map<String, String> result = responseEntity.getBody();
        System.out.println(result);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
}

到了这里,关于万字长文讲解调用第三方接口,RestTemplate,urlConnection使用详解,java代码模拟postman发送请求的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 借助HttpWebRequest 调用第三方接口,获取Token和数据

    1、传入语句获取数据 2、获取token 3、获取设置身份认证及请求超时时间 4、在我使用的时候出现了下面的错误,通过查找是证书的问题,因为客户的web访问使用的IP地址访问,所以在代码中要加入跳过ssl验证的一行代码

    2024年03月18日
    浏览(41)
  • SAP PO 接口配置1:连通WebService-通过PO调用第三方接口

    SAP 通过 PO 中间件进行接口调用,调用外部接口。 外部接口可以用任意方式生成,常见的REST类型接口即可,关于如何使用python生成接口,其他章节另述。 本教程的前置条件,PO中已配置Business Systems,并与SAP环境连通。 这里以常见的post接口做示例,如有其他类型接口,需要每

    2024年02月05日
    浏览(81)
  • SpringBoot调用第三方WebService接口的两种实现方式

    WebService接口的发布通常一般都是使用WSDL(web service descriptive language)文件的样式来发布的,该文档包含了请求的参数信息,返回的结果信息,我们需要根据WSDL文档的信息来编写相关的代码进行调用WebService接口。接下来我将采用常见的两种方式调用WebService接口。 目前我需要

    2024年02月12日
    浏览(52)
  • JAVA调用第三方接口的GET/POST/PUT请求方式

    GET请求 POST请求 POST请求(JSON传参) PUT请求(传TOKEN)

    2024年02月03日
    浏览(47)
  • Java以form-data(表单)的形式调用第三方接口

    之前写的调用第三方接口: Java使用原生API调用第三方接口 但是其中只包含了简单的接口(传递数据为JSON)调用。也就是 Content-Type 的值是设置成: 当第三方接口需要包含 文件 类型的参数,我们要设置成以 表单形式 提交,就要那么该属性就应该设置成 表示是以 表单形式

    2024年02月02日
    浏览(47)
  • Springboot实现上传文件,并实现调用第三方接口post请求多文件上传文件

    项目过程中,经常会有和第三方接口打交道的过程,今天实现调用第三方上传文件的接口!! 通常拿到第三方的接口文档的时候,不是第一时间先写代码,而是详细阅读接口文档。若接口需要第三方提供的基本参数,例如signkey, secrect等,也可以是其他的,查看文档里是否提

    2024年02月16日
    浏览(38)
  • 【Springboot系列】Springboot系列-调用第三方接口的五种方式汇总,代码实例

    在开发中,经常需要调用第三方接口或者其他的应用接口来完成业务需求。今天分享下Spring Boot中调用第三方接口的多种方式。 1、使用OpenFeign进行调用(推荐) 2、使用原始httpClient请求 3、使用RestTemplate方法 4、使用hutool.httputil 5、使用OkHttp3 Feign是一个声明式的Web Service客户端

    2024年02月11日
    浏览(35)
  • feign自定义第三方接口;配置化Feign接口URL;调用指定IP的feign服务

    最近接手一个项目,各子工程之间通过feign调用;各服务部署在K8S上,通过nacos管理配置;由于服务部署的机器无法开放端口等原因,导致本机服务与测试环境网络端口无法互通,故需要重写feign的调用地址;个人总结的方法有以下几种: 目录  第一种:feignclient配置URL 第二种

    2024年02月04日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包