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

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

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

万字长文讲解调用第三方接口,RestTemplate,urlConnection使用详解,java代码模拟postman发送请求🔊业务场景📕新建springmvc项目,项目结构图🖥️post方式 x-www-form-urlencoded  key-value只能是string🔖get 方式 传递参数拼接在url上📌post 方式 传递参数url拼接📇post 方式 传递参数为json🧣RestTemplate方式📜 post 方式 传递参数为json📘post 方式 传递参数为form-data 并且传递文件并添加请求头📒post 通过流的方式上传文件🖊️最后总结

🔊业务场景

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

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

📕新建springmvc项目,项目结构图

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类

importlombok.AllArgsConstructor;

importlombok.Data;

importlombok.NoArgsConstructor;

@Data

@AllArgsConstructor

@NoArgsConstructor

publicclassUser {

   Stringname;

   intage;

   publicUser(Stringname) {

       this.name=name;

   }

   @Override

   publicStringtoString() {

       return"User{"+

               "name='"+name+'\''+

               ", age="+age+

               '}';

   }

}

UserController类

importcom.alibaba.fastjson.JSON;

importorg.springframework.web.bind.annotation.*;

importorg.springframework.web.multipart.MultipartFile;

importjava.util.LinkedHashMap;

importjava.util.Map;

@RestController

@RequestMapping("/user")

publicclassUserController {

       @GetMapping("/loginGet")

       publicStringloginGet(Stringname,Integerage){

           System.out.println(name+""+age);

           Useruser=newUser(name,age);

           returnJSON.toJSONString(user);

       }

       @PostMapping("/login")

       publicStringlogin(Useruser){

           System.out.println(user);

           returnJSON.toJSONString(user);

       }

       @PostMapping("/upload")

       publicMap<String, String>login(Useruser, @RequestParam("file") MultipartFilefile){

           System.out.println(user);

           System.out.println(file.getName());

           Map<String, String>fileMetadata=newLinkedHashMap<>();

           fileMetadata.put("文件名", file.getOriginalFilename());

           fileMetadata.put("文件类型", file.getContentType());

           fileMetadata.put("文件大小(byte)", String.valueOf(file.getSize()));

           returnfileMetadata;

       }

       @PostMapping("/loginJson")

       publicStringloginJson(@RequestBodyUseruser){

           System.out.println(user);

           returnJSON.toJSONString(user);

       }

}

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

对应java代码

importlombok.extern.slf4j.Slf4j;

importorg.apache.http.HttpEntity;

importorg.apache.http.NameValuePair;

importorg.apache.http.client.entity.UrlEncodedFormEntity;

importorg.apache.http.client.methods.CloseableHttpResponse;

importorg.apache.http.client.methods.HttpPost;

importorg.apache.http.impl.client.CloseableHttpClient;

importorg.apache.http.impl.client.HttpClients;

importorg.apache.http.message.BasicNameValuePair;

importorg.apache.http.util.EntityUtils;

importjava.util.ArrayList;

importjava.util.List;

importjava.util.Map;

/**

* @ClassName JavaNice

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

**/

@Slf4j

publicclassPostUtils {

   privatestaticfinalStringENCODING="UTF-8";

   /**

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

    * @param url

    * @param paramsMap

    * @return

    */

   publicstaticStringsendPost(Stringurl, Map<String, String>paramsMap) {

       CloseableHttpClientclient=HttpClients.createDefault();

       StringresponseText="";

       CloseableHttpResponseresponse=null;

       try {

           HttpPostmethod=newHttpPost(url);

           if (paramsMap!=null) {

               List<NameValuePair>paramList=newArrayList<NameValuePair>();

               for (Map.Entry<String, String>param : paramsMap.entrySet()) {

                   NameValuePairpair=newBasicNameValuePair(param.getKey(), param.getValue());

                   paramList.add(pair);

               }

               method.setEntity(newUrlEncodedFormEntity(paramList, ENCODING));

           }

           response=client.execute(method);

           HttpEntityentity=response.getEntity();

           if (entity!=null) {

               responseText=EntityUtils.toString(entity);

           }

       } catch (Exceptione) {

           log.error("http request failed",e);

       } finally {

           try {

               response.close();

           } catch (Exceptione) {

               log.error("",e);

           }

       }

       returnresponseText;

   }

}

调用代码

@Test

voidpostString() {

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

   Map<String,String>user=newHashMap<>();

   user.put("name","javaNice");

   Stringjson=JSONObject.toJSONString(user);

   Map<String,String>paramsMap=JSONObject.parseObject(json,Map.class);

   System.out.println(json);

   Stringresp=PostUtils.sendPost("http://localhost:8089/user/login",paramsMap);

   System.out.println(resp);

}

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

📌post 方式 传递参数url拼接

📇post 方式 传递参数为json

工具类

importcom.alibaba.fastjson.JSONObject;

importorg.springframework.util.StringUtils;

importjava.io.*;

importjava.net.HttpURLConnection;

importjava.net.URL;

importjava.net.URLConnection;

importjava.net.URLEncoder;

importjava.util.List;

importjava.util.Map;

publicclassHttpRequestUtil {

   publicstaticStringsendGet(Stringurl, Stringparam) {

       Stringresult="";

       BufferedReaderin=null;

       try {

           if (!url.contains("?")) {

               url+="?1=1";

           }

           if (!param.startsWith("&")) {

               url+="&";

           }

           StringurlNameString=url+param;

           URLrealUrl=newURL(urlNameString);

           // 打开和URL之间的连接

           URLConnectionconnection=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=newBufferedReader(newInputStreamReader(

                   connection.getInputStream()));

           Stringline;

           while ((line=in.readLine()) !=null) {

               result+=line;

           }

       } catch (Exceptione) {

           System.out.println("发送GET请求出现异常!"+e);

           e.printStackTrace();

       }

       // 使用finally块来关闭输入流

       finally {

           try {

               if (in!=null) {

                   in.close();

               }

           } catch (Exceptione2) {

               e2.printStackTrace();

           }

       }

       returnresult;

   }

   publicstaticStringsendPost(Stringurl, Stringparam) {

       HttpURLConnectionhttpURLConnection=null;

       OutputStreamout=null; //写

       InputStreamin=null;   //读

       intresponseCode=0;    //远程主机响应的HTTP状态码

       Stringresult="";

       try {

           URLsendUrl=newURL(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();

           BufferedReaderbr=newBufferedReader(newInputStreamReader(httpURLConnection.getInputStream(), "UTF-8"));

           result=br.readLine();

       } catch (Exceptione) {

           e.printStackTrace();

       }

       returnresult;

   }

   publicstaticStringobjectToUrlParam(Objectobject) {

       if (object!=null) {

           StringBuilderbuilder=newStringBuilder();

//            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()));

               }

           }

           returnbuilder.toString();

       }

       return"";

   }

   publicstaticStringencode(Objectobject) {

       if (object!=null) {

           try {

               returnURLEncoder.encode(object.toString(), "utf-8");

           } catch (UnsupportedEncodingExceptione) {

               e.printStackTrace();

               thrownewRuntimeException("字符串编码失败");

           }

       }

       return"";

   }

}

调用代码

@Test

voidget() {

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

   Useruser=newUser("javaNice",666);

   StringparamsMap=HttpRequestUtil.objectToUrlParam(user);

   Stringresp=HttpRequestUtil.sendGet("http://localhost:8089/user/loginGet",paramsMap);

   System.out.println(resp);

}

@Test

voidpostUrl() {

   //post 方式 传递参数url拼接

   Useruser=newUser("javaNice",666);

   StringparamsMap=HttpRequestUtil.objectToUrlParam(user);

   System.out.println("传递参数"+paramsMap);

   Stringurl="http://localhost:8089/user/login?1=1"+paramsMap;

   Stringresp=HttpRequestUtil.sendPost(url,"");

   System.out.println("返回参数"+resp);

}

@Test

voidpost() {

   //post 方式 传递参数为json

   Useruser=newUser("javaNice",666);

   StringparamsMap=JSON.toJSONString(user);

   System.out.println("传递参数"+paramsMap);

   Stringresp=HttpRequestUtil.sendPost("http://localhost:8089/user/loginJson",paramsMap);

   System.out.println("返回参数"+resp);

}

🧣RestTemplate方式

📜 post 方式 传递参数为json

@Test

voidpost() {

   //post 方式 传递参数为json

   RestTemplaterestTemplate=newRestTemplate();

   Stringurl="http://localhost:8089/user/loginJson";

   Userbody=newUser("javaNice", 666);

   Userresult=restTemplate.postForObject(url, body, User.class);

   System.out.println("返回参数"+result);

}

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

@Test

voidpostFormFile() {

   //post 方式 传递参数为form-data 并且传递文件

   RestTemplaterestTemplate=newRestTemplate();

   Stringurl="http://localhost:8089/user/upload";

   //①:表单信息,需要放在MultiValueMap中,MultiValueMap相当于Map<String,List<String>>

   MultiValueMap<String, Object>body=newLinkedMultiValueMap<>();

   //调用add方法放入表单元素(表单名称:值)

   //②:文件对应的类型,需要是org.springframework.core.io.Resource类型的,常见的有[FileSystemResource、InputStreamResource、ByteArrayResource]

   body.add("file", newFileSystemResource("/java/com/example/springmvc/22c017e48ea445199708dc1d2832dae5.pdf"));

   body.add("name", "javaNice");

   body.add("age", "666");

   //③:头

   HttpHeadersheaders=newHttpHeaders();

   headers.add("header1", "v1");

   headers.add("header2", "v2");

   //④:请求实体

   RequestEntity<MultiValueMap<String, Object>>requestEntity=newRequestEntity<>(body, headers, HttpMethod.POST, URI.create(url));

   //⑤:发送请求(请求实体,返回值需要转换的类型)

   ResponseEntity<Map<String, String>>responseEntity=restTemplate.exchange(

           requestEntity,

           newParameterizedTypeReference<Map<String, String>>() {

           });

   Map<String, String>result=responseEntity.getBody();

   System.out.println(result);

}

📒post 通过流的方式上传文件

@Test

voidpostFormFileStream() {

   RestTemplaterestTemplate=newRestTemplate();

   Stringurl="http://localhost:8089/user/upload";

   //①:表单信息,需要放在MultiValueMap中,MultiValueMap相当于Map<String,List<String>>

   MultiValueMap<String, Object>body=newLinkedMultiValueMap<>();

   /**

    * ②:通过流的方式上传文件,流的方式需要用到InputStreamResource类,需要重写2个方法

    * getFilename:文件名称

    * contentLength:长度

    */

   Filefile=newFile("/java/com/example/springmvc/22c017e48ea445199708dc1d2832dae5.pdf");

   //2、建立数据通道

   try {

       InputStreaminputStream=newFileInputStream(file);

       InputStreamResourceinputStreamResource=newInputStreamResource(inputStream) {

           @Override

           publicStringgetFilename() {

               return"22c017e48ea445199708dc1d2832dae5.pdf";

           }

           @Override

           publiclongcontentLength() throwsIOException {

               returninputStream.available();

           }

       };

       body.add("file", inputStreamResource);

       body.add("name", "javaNice");

       body.add("age", "666");

       //③:头

       HttpHeadersheaders=newHttpHeaders();

       headers.add("header1", "v1");

       headers.add("header2", "v2");

       //④:请求实体

       RequestEntity<MultiValueMap<String, Object>>requestEntity=newRequestEntity<>(body, headers, HttpMethod.POST, URI.create(url));

       //⑤:发送请求(请求实体,返回值需要转换的类型)

       ResponseEntity<Map<String, String>>responseEntity=restTemplate.exchange(

               requestEntity,

               newParameterizedTypeReference<Map<String, String>>() {

               });

       Map<String, String>result=responseEntity.getBody();

       System.out.println(result);

   } catch (FileNotFoundExceptione) {

       e.printStackTrace();

   }

}

🖊️最后总结

🖲要熟练掌握技巧,一定多多坚持练习:骐骥一跃,不能十步;驽马十驾,功在不舍


目录
相关文章
|
10天前
|
XML 安全 Java
Java反射机制:解锁代码的无限可能
Java 反射(Reflection)是Java 的特征之一,它允许程序在运行时动态地访问和操作类的信息,包括类的属性、方法和构造函数。 反射机制能够使程序具备更大的灵活性和扩展性
19 5
Java反射机制:解锁代码的无限可能
|
6天前
|
jenkins Java 测试技术
如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例详细说明
本文介绍了如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例,详细说明了从 Jenkins 安装配置到自动构建、测试和部署的全流程。文中还提供了一个 Jenkinsfile 示例,并分享了实践经验,强调了版本控制、自动化测试等关键点的重要性。
30 3
|
11天前
|
存储 安全 Java
系统安全架构的深度解析与实践:Java代码实现
【11月更文挑战第1天】系统安全架构是保护信息系统免受各种威胁和攻击的关键。作为系统架构师,设计一套完善的系统安全架构不仅需要对各种安全威胁有深入理解,还需要熟练掌握各种安全技术和工具。
40 10
|
7天前
|
分布式计算 Java MaxCompute
ODPS MR节点跑graph连通分量计算代码报错java heap space如何解决
任务启动命令:jar -resources odps-graph-connect-family-2.0-SNAPSHOT.jar -classpath ./odps-graph-connect-family-2.0-SNAPSHOT.jar ConnectFamily 若是设置参数该如何设置
|
5天前
|
Java
Java代码解释++i和i++的五个主要区别
本文介绍了前缀递增(++i)和后缀递增(i++)的区别。两者在独立语句中无差异,但在赋值表达式中,i++ 返回原值,++i 返回新值;在复杂表达式中计算顺序不同;在循环中虽结果相同但使用方式有别。最后通过 `Counter` 类模拟了两者的内部实现原理。
Java代码解释++i和i++的五个主要区别
|
13天前
|
搜索推荐 Java 数据库连接
Java|在 IDEA 里自动生成 MyBatis 模板代码
基于 MyBatis 开发的项目,新增数据库表以后,总是需要编写对应的 Entity、Mapper 和 Service 等等 Class 的代码,这些都是重复的工作,我们可以想一些办法来自动生成这些代码。
25 6
|
13天前
|
Java
通过Java代码解释成员变量(实例变量)和局部变量的区别
本文通过一个Java示例,详细解释了成员变量(实例变量)和局部变量的区别。成员变量属于类的一部分,每个对象有独立的副本;局部变量则在方法或代码块内部声明,作用范围仅限于此。示例代码展示了如何在类中声明和使用这两种变量。
|
14天前
|
存储 Java API
优雅地使用Java Map,通过掌握其高级特性和技巧,让代码更简洁。
【10月更文挑战第19天】本文介绍了如何优雅地使用Java Map,通过掌握其高级特性和技巧,让代码更简洁。内容包括Map的初始化、使用Stream API处理Map、利用merge方法、使用ComputeIfAbsent和ComputeIfPresent,以及Map的默认方法。这些技巧不仅提高了代码的可读性和维护性,还提升了开发效率。
36 3
|
14天前
|
存储 Java 开发者
Java中的Map接口提供了一种优雅的方式来管理数据结构,使代码更加清晰、高效
【10月更文挑战第19天】在软件开发中,随着项目复杂度的增加,数据结构的组织和管理变得至关重要。Java中的Map接口提供了一种优雅的方式来管理数据结构,使代码更加清晰、高效。本文通过在线购物平台的案例,展示了Map在商品管理、用户管理和订单管理中的具体应用,帮助开发者告别混乱,提升代码质量。
24 1
|
16天前
|
Java
Java代码解释静态代理和动态代理的区别
### 静态代理与动态代理简介 **静态代理**:代理类在编译时已确定,目标对象和代理对象都实现同一接口。代理类包含对目标对象的引用,并在调用方法时添加额外操作。 **动态代理**:利用Java反射机制在运行时生成代理类,更加灵活。通过`Proxy`类和`InvocationHandler`接口实现,无需提前知道接口的具体实现细节。 示例代码展示了两种代理方式的实现,静态代理需要手动创建代理对象,而动态代理通过反射机制自动创建。