Java调用第三方HTTP接口的常用方式
【日常业务开发】Java调用第三方http接口的常用方式
- 概述
- Java调用第三方http接口的方式
-
- 通过JDK网络类Java.net.HttpURLConnection
- 通过apache common封装好的HttpClient
- 通过Apache封装好的CloseableHttpClient
- 通过OkHttp
- 通过Spring的RestTemplate
- 通过hutool的HttpUtil
- 总结
概述
在实际开发过程中,我们经常需要调用对方提供的接口或测试自己写的接口是否合适。很多项目都会封装规定好本身项目的接口规范,所以大多数需要去调用对方提供的接口或第三方接口(短信、天气等)。
在Java项目中调用第三方接口的常用方式有:
-
通过JDK网络类
Java.net.HttpURLConnection -
通过Apache common封装好的
HttpClient -
通过Apache封装好的
CloseableHttpClient -
通过
OkHttp -
通过Spring的
RestTemplate -
通过hutool的
HttpUtil
Java调用第三方http接口的方式
通过JDK网络类Java.net.HttpURLConnection
简介:java.net包下的原生java api提供的http请求。
使用步骤:
-
通过统一资源定位器(java.net.URL)获取连接器(java.net.URLConnection)。
-
设置请求的参数。
-
发送请求。
-
以输入流的形式获取返回内容。
-
关闭输入流。
比较原始的一种调用做法,这里把get请求和post请求都统一放在一个方法里面,直接上代码:
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
/*** @ClassName: HttpUrlConnectionToInterface* @Description: jdk类HttpURLConnection调用第三方http接口*/
public class HttpUrlConnectionToInterface {/*** 以post方式调用对方接口方法* @param pathUrl*/public static void doPost(String pathUrl, String data){OutputStreamWriter out = null;BufferedReader br = null;String result = "";try {URL url = new URL(pathUrl);//打开和url之间的连接HttpURLConnection conn = (HttpURLConnection) url.openConnection();//设定请求的方法为"POST",默认是GET//post与get的不同之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内。conn.setRequestMethod("POST");//设置30秒连接超时conn.setConnectTimeout(30000);//设置30秒读取超时conn.setReadTimeout(30000);// 设置是否向httpUrlConnection输出,因为这个是post请求,参数要放在http正文内,因此需要设为true, 默认情况下是false;conn.setDoOutput(true);// 设置是否从httpUrlConnection读入,默认情况下是true;conn.setDoInput(true);// Post请求不能使用缓存conn.setUseCaches(false);//设置通用的请求属性conn.setRequestProperty("accept", "*/*");conn.setRequestProperty("connection", "Keep-Alive"); //维持长链接conn.setRequestProperty("Content-Type", "application/json;charset=utf-8");//连接,从上述url.openConnection()至此的配置必须要在connect之前完成,conn.connect();/*** 下面的三句代码,就是调用第三方http接口*///获取URLConnection对象对应的输出流//此处getOutputStream会隐含的进行connect(即:如同调用上面的connect()方法,所以在开发中不调用上述的connect()也可以)。out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");//发送请求参数即数据out.write(data);//flush输出流的缓冲out.flush();/*** 下面的代码相当于,获取调用第三方http接口后返回的结果*///获取URLConnection对象对应的输入流InputStream is = conn.getInputStream();//构造一个字符流缓存br = new BufferedReader(new InputStreamReader(is));String str = "";while ((str = br.readLine()) != null){result += str;}System.out.println(result);//关闭流is.close();//断开连接,disconnect是在底层tcp socket链接空闲时才切断,如果正在被其他线程使用就不切断。conn.disconnect();} catch (Exception e) {e.printStackTrace();}finally {try {if (out != null){out.close();}if (br != null){br.close();}} catch (IOException e) {e.printStackTrace();}}}/*** 以get方式调用对方接口方法* @param pathUrl*/public static void doGet(String pathUrl){BufferedReader br = null;String result = "";try {URL url = new URL(pathUrl);//打开和url之间的连接HttpURLConnection conn = (HttpURLConnection) url.openConnection();//设定请求的方法为"GET",默认是GET//post与get的不同之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内。conn.setRequestMethod("GET");//设置30秒连接超时conn.setConnectTimeout(30000);//设置30秒读取超时conn.setReadTimeout(30000);// 设置是否向httpUrlConnection输出,因为这个是post请求,参数要放在http正文内,因此需要设为true, 默认情况下是false;conn.setDoOutput(true);// 设置是否从httpUrlConnection读入,默认情况下是true;conn.setDoInput(true);// Post请求不能使用缓存(get可以不使用)conn.setUseCaches(false);//设置通用的请求属性conn.setRequestProperty("accept", "*/*");conn.setRequestProperty("connection", "Keep-Alive"); //维持长链接conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");//连接,从上述url.openConnection()至此的配置必须要在connect之前完成,conn.connect();/*** 下面的代码相当于,获取调用第三方http接口后返回的结果*///获取URLConnection对象对应的输入流InputStream is = conn.getInputStream();//构造一个字符流缓存br = new BufferedReader(new InputStreamReader(is, "UTF-8"));String str = "";while ((str = br.readLine()) != null){result += str;}System.out.println(result);//关闭流is.close();//断开连接,disconnect是在底层tcp socket链接空闲时才切断,如果正在被其他线程使用就不切断。conn.disconnect();} catch (Exception e) {e.printStackTrace();}finally {try {if (br != null){br.close();}} catch (IOException e) {e.printStackTrace();}}}public static void main(String[] args) {//post请求一般都是把实体对象转为Json字符串doGet("https://weather.cma.cn/api/climate?stationid=57516");}
} 通过apache common封装好的HttpClient
简介:http client到目前为止最新是5.1版,官网地址:http://hc.apache.org/ 。Http client专为推展而设计,同时为基本http协议提供强大支持,尽管java.net包提供了通过http访问的基本功能,但是未提供许多应用程序所需要功能。
使用步骤:
- 生成一个HttpClient对象并设置相应的参数;
- 生成一个GetMethod对象或PostMethod并设置响应的参数;
- 用HttpClient生成的对象来执行GetMethod生成的Get方法;
- 处理响应状态码;
- 若响应正常,处理HTTP响应内容;
- 释放连接。无论执行方法是否成功,都必须释放连接。
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.1</version>
</dependency>
<!--HttpClient-->
<dependency><groupId>commons-httpclient</groupId><artifactId>commons-httpclient</artifactId><version>3.1</version>
</dependency>
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;
import java.io.IOException;
/*** @ClassName: HttpClientToInterface* @Description: HttpClient模拟get、post请求并发送请求参数(json等)*/
public class HttpClientToInterface {/*** httpClient的get请求方式* 使用GetMethod来访问一个URL对应的网页实现步骤:* 1.生成一个HttpClient对象并设置相应的参数;* 2.生成一个GetMethod对象并设置响应的参数;* 3.用HttpClient生成的对象来执行GetMethod生成的Get方法;* 4.处理响应状态码;* 5.若响应正常,处理HTTP响应内容;* 6.释放连接。** @param url* @param charset* @return*/public static String doGet(String url, String charset) {/*** 1.生成HttpClient对象并设置参数*/HttpClient httpClient = new HttpClient();//设置Http连接超时为5秒httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(5000);/*** 2.生成GetMethod对象并设置参数*/GetMethod getMethod = new GetMethod(url);//设置get请求超时为5秒getMethod.getParams().setParameter(HttpMethodParams.SO_TIMEOUT, 5000);//设置请求重试处理,用的是默认的重试处理:请求三次getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler());String response = "";/*** 3.执行HTTP GET 请求*/try {int statusCode = httpClient.executeMethod(getMethod);/*** 4.判断访问的状态码*/if (statusCode != HttpStatus.SC_OK) {System.err.println("请求出错:" + getMethod.getStatusLine());}/*** 5.处理HTTP响应内容*///HTTP响应头部信息,这里简单打印Header[] headers = getMethod.getResponseHeaders();for (Header h : headers) {System.out.println(h.getName() + "---------------" + h.getValue());}//读取HTTP响应内容,这里简单打印网页内容//读取为字节数组byte[] responseBody = getMethod.getResponseBody();response = new String(responseBody, charset);System.out.println("-----------response:" + response);//读取为InputStream,在网页内容数据量大时候推荐使用//InputStream response = getMethod.getResponseBodyAsStream();} catch (HttpException e) {//发生致命的异常,可能是协议不对或者返回的内容有问题System.out.println("请检查输入的URL!");e.printStackTrace();} catch (IOException e) {//发生网络异常System.out.println("发生网络异常!");} finally {/*** 6.释放连接*/getMethod.releaseConnection();}return response;}/*** post请求** @param url* @param json* @return*/public static String doPost(String url, JSONObject json) {HttpClient httpClient = new HttpClient();PostMethod postMethod = new PostMethod(url);postMethod.addRequestHeader("accept", "*/*");postMethod.addRequestHeader("connection", "Keep-Alive");//设置json格式传送postMethod.addRequestHeader("Content-Type", "application/json;charset=utf-8");//必须设置下面这个HeaderpostMethod.addRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36");//添加请求参数postMethod.addParameter("commentId", json.getString("commentId"));String res = "";try {int code = httpClient.executeMethod(postMethod);if (code == 200) {res = postMethod.getResponseBodyAsString();System.out.println(res);}} catch (IOException e) {e.printStackTrace();}return res;}public static void main(String[] args) {doGet("http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=13026194071", "UTF-8");System.out.println("-----------分割线------------");System.out.println("-----------分割线------------");System.out.println("-----------分割线------------");JSONObject jsonObject = new JSONObject();jsonObject.put("commentId", "13026194071");doPost("http://tcc.taobao.com/cc/json/mobile_tel_segment.htm", jsonObject);}
} 通过Apache封装好的CloseableHttpClient
CloseableHttpClient是在HttpClient的基础上修改更新而来的,这里还涉及到请求头token的设置(请求验证),利用fastjson转换请求或返回结果字符串为json格式,当然上面两种方式也是可以设置请求头token、json的,这里只在下面说明。
导入如下jar包:
<!--CloseableHttpClient-->
<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.2</version>
</dependency>
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.28</version>
</dependency>
import com.alibaba.fastjson.JSONObject;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
/*** @ClassName: CloseableHttpClientToInterface* @Description: Apache封装好的CloseableHttpClient*/
public class CloseableHttpClientToInterface {private static String tokenString = "";private static String AUTH_TOKEN_EXPIRED = "AUTH_TOKEN_EXPIRED";private static CloseableHttpClient httpClient = null;/*** 以get方式调用第三方接口** @param url* @return*/public static String doGet(String url, String token) {//创建HttpClient对象CloseableHttpClient httpClient = HttpClientBuilder.create().build();HttpGet get = new HttpGet(url);try {
// if (tokenString != null && !tokenString.equals("")) {
// tokenString = getToken();
// }
// //api_gateway_auth_token自定义header头,用于token验证使用
// get.addHeader("api_gateway_auth_token", tokenString);get.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36");HttpResponse response = httpClient.execute(get);if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {//返回json格式String res = EntityUtils.toString(response.getEntity());return res;}} catch (IOException e) {e.printStackTrace();}return null;}/*** 以post方式调用第三方接口** @param url* @param json* @return*/public static String doPost(String url, JSONObject json) {try {if (httpClient == null) {httpClient = HttpClientBuilder.create().build();}HttpPost post = new HttpPost(url);if (tokenString != null && !tokenString.equals("")) {tokenString = getToken();}//api_gateway_auth_token自定义header头,用于token验证使用post.addHeader("api_gateway_auth_token", tokenString);post.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36");StringEntity s = new StringEntity(json.toString());s.setContentEncoding("UTF-8");//发送json数据需要设置contentTypes.setContentType("application/x-www-form-urlencoded");//设置请求参数post.setEntity(s);HttpResponse response = httpClient.execute(post);if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {//返回json格式String res = EntityUtils.toString(response.getEntity());return res;}} catch (Exception e) {e.printStackTrace();} finally {if (httpClient != null) {try {httpClient.close();} catch (IOException e) {e.printStackTrace();}}}return null;}/*** 获取第三方接口的token*/public static String getToken(){String token = "";JSONObject object = new JSONObject();object.put("appid", "appid");object.put("secretkey", "secretkey");try {if (httpClient == null){httpClient = HttpClientBuilder.create().build();}HttpPost post = new HttpPost("http://localhost/login");post.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36");StringEntity s = new StringEntity(object.toString());s.setContentEncoding("UTF-8");//发送json数据需要设置contentTypes.setContentType("application/x-www-form-urlencoded");//设置请求参数post.setEntity(s);HttpResponse response = httpClient.execute(post);//这里可以把返回的结果按照自定义的返回数据结果,把string转换成自定义类//ResultTokenBO result = JSONObject.parseObject(response, ResultTokenBO.class);//把response转为jsonObjectJSONObject result = JSONObject.parseObject(String.valueOf(response));if (result.containsKey("token")){token = result.getString("token");}} catch (Exception e) {e.printStackTrace();}return token;}public static void main(String[] args) {System.out.println(doGet("https://weather.cma.cn/api/climate?stationid=57516", null));}
}
通过OkHttp
简介:OkHttp是一个默认有效的HTTP客户端,有效地执行HTTP可以加快您的负载并节省带宽,如果您的服务有多个IP地址,如果第一次连接失败,OkHttp将尝试备用地址。这对于IPv4 + IPv6和冗余数据中心中托管的服务是必需的。OkHttp启动具有现代TLS功能(SNI,ALPN)的新连接,并在握手失败时回退到TLS 1.0,OkHttp支持Android 2.3及更高版本。对于Java,最低要求是1.7。
操作步骤:
-
创建OkhttpClient。
-
mClient执行newCall将Request转化成一个Call。
-
最后call执行excute同步执行,enqueue异步执行。
-
Request主要通过Request.Builder来构建。
-
缓存。
-
取消请求。
导入如下jar包:
<!--okhttp3-->
<dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.9.1</version>
</dependency>
import okhttp3.*;
import java.io.IOException;
/*** @ClassName: OkHttpToInterface* @Description: 通过OkHttp调用第三方http接口*/
public class OkHttpToInterface {public static final MediaType JSON = MediaType.get("application/json; charset=utf-8");/*** 以get方式调用第三方接口** @param url*/public static void doGet(String url) {OkHttpClient okHttpClient = new OkHttpClient();final Request request = new Request.Builder().url(url).get()//默认就是GET请求,可以不写.build();Call call = okHttpClient.newCall(request);call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {System.out.println("onFailure: ");}@Overridepublic void onResponse(Call call, Response response) throws IOException {System.out.println("onResponse: " + response.body().string());}});}/*** post请求** @param url* @param json*/public static void doPost(String url, String json) {MediaType mediaType = MediaType.parse("text/x-markdown; charset=utf-8");String requestBody = json;Request request = new Request.Builder().url(url).post(RequestBody.create(mediaType, requestBody)).build();OkHttpClient okHttpClient = new OkHttpClient();okHttpClient.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {System.out.println("onFailure: " + e.getMessage());}@Overridepublic void onResponse(Call call, Response response) throws IOException {System.out.println(response.protocol() + " " + response.code() + " " + response.message());Headers headers = response.headers();for (int i = 0; i < headers.size(); i++) {System.out.println(headers.name(i) + ":" + headers.value(i));}System.out.println("onResponse: " + response.body().string());}});}public static void main(String[] args) {
// doGet("http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=13026194071");
// doPost("https://api.github.com/markdown/raw", "I am Jdqm.");doGet("https://weather.cma.cn/api/climate?stationid=57516");}
}
通过Spring的RestTemplate
RestTemple是前三种方式的集大成者,代码编写更加简单,目前可以采用的调用第三方接口有:
- delete() 在特定的URL上对资源执行HTTP DELETE操作
exchange()在URL上执行特定的HTTP方法,返回包含对象的ResponseEntity,这个对象是从响应体中映射得到的execute()在URL上执行特定的HTTP方法,返回一个从响应体映射得到的对象getForEntity()发送一个HTTP GET请求,返回的ResponseEntity包含了响应体所映射成的对象getForObject()发送一个HTTP GET请求,返回的请求体将映射为一个对象postForEntity()POST 数据到一个URL,返回包含一个对象的ResponseEntity,这个对象是从响应体中映射得到的postForObject()POST 数据到一个URL,返回根据响应体匹配形成的对象- headForHeaders() 发送HTTP HEAD请求,返回包含特定资源URL的HTTP头
- optionsForAllow() 发送HTTP OPTIONS请求,返回对特定URL的Allow头信息
- postForLocation() POST 数据到一个URL,返回新创建资源的URL
- put() PUT 资源到特定的URL
注意:目前标红的为常用的
操作步骤:
-
使用默认构造方法new一个实例new RestTemplate()。
-
RestTemplate 内部通过调用 doExecute 方法,首先就是获取 ClientHttpRequest。
-
RestTemplate 实现了抽象类 HttpAccessor ,所以可以调用父类的 createRequest。
-
SimpleClientHttpRequestFactory 实现了 ClientHttpRequest,同时实现方法。
-
执行 requestCallback.doWithRequest(request)。
-
执行 response = request.execute()。
-
最后解析response。
首先导入springboot的web包
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.4.RELEASE</version>
</parent>
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
</dependencies>
配置类
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RestTemplateConfig {@Beanpublic RestTemplate restTemplate(ClientHttpRequestFactory factory){return new RestTemplate(factory);} @Beanpublic ClientHttpRequestFactory simpleClientHttpRequestFactory(){SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();factory.setConnectTimeout(15000);factory.setReadTimeout(5000);return factory;}
}
import cn.zysheep.domain.entity.User;
import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.*;
import org.springframework.web.client.RestTemplate;
/*** @ClassName: RestTemplateToInterface* @Description: 通过restTemplate调用第三方http接口*/
public class RestTemplateToInterface {@Autowiredprivate RestTemplate restTemplate;/*** 以get方式请求第三方http接口 getForEntity** @param url* @return*/public User doGetWith1(String url) {ResponseEntity<User> responseEntity = restTemplate.getForEntity(url, User.class);User user = responseEntity.getBody();return user;}/*** 以get方式请求第三方http接口 getForObject* 返回值返回的是响应体,省去了我们再去getBody()** @param url* @return*/public User doGetWith2(String url) {User user = restTemplate.getForObject(url, User.class);return user;}/*** 以post方式请求第三方http接口 postForEntity** @param url* @return*/public String doPostWith1(String url) {User user = new User("小白", 20);ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, user, String.class);String body = responseEntity.getBody();return body;}/*** 以post方式请求第三方http接口 postForEntity** @param url* @return*/public String doPostWith2(String url) {User user = new User("小白", 20);String body = restTemplate.postForObject(url, user, String.class);return body;}/*** exchange** @return*/public String doExchange(String url, Integer age, String name) {//header参数HttpHeaders headers = new HttpHeaders();String token = "asdfaf2322";headers.add("authorization", token);headers.setContentType(MediaType.APPLICATION_JSON);//放入body中的json参数JSONObject obj = new JSONObject();obj.put("age", age);obj.put("name", name);//组装HttpEntity<JSONObject> request = new HttpEntity<>(obj, headers);ResponseEntity<String> responseEntity = restTemplate.exchange(url, HttpMethod.POST, request, String.class);String body = responseEntity.getBody();return body;}
}
通过hutool的HttpUtil
简介:关于Hutool工具类之HttpUtil如何使用可以参考官方文档Hutool之HttpUtil
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.1</version>
</dependency> import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.http.HttpUtil;
import java.util.HashMap;
/*** @ClassName: HttpUtilToInterface* @Description: 通过hutool工具类调用第三方http接口*/
public class HttpUtilToInterface {/*** get请求示例*/public static void doGet() {// 最简单的HTTP请求,可以自动通过header等信息判断编码,不区分HTTP和HTTPSString result1 = HttpUtil.get("https://www.baidu.com");// 当无法识别页面编码的时候,可以自定义请求页面的编码String result2 = HttpUtil.get("https://www.baidu.com", CharsetUtil.CHARSET_UTF_8);//可以单独传入http参数,这样参数会自动做URL编码,拼接在URL中HashMap<String, Object> paramMap = new HashMap<>();paramMap.put("city", "北京");String result3 = HttpUtil.get("https://www.baidu.com", paramMap);}public static void main(String[] args) {doGet();}/*** post请求示例*/public static void doPost() {String url = "http://localhost:9001/xss/saveMap";//post普通请求示例HashMap<String, Object> paramMap = new HashMap<>();paramMap.put("city", "北京");// application/x-www-form-urlencodedString result = HttpUtil.post(url, paramMap);System.out.println(result);// application/jsonString body = HttpUtil.createPost(url).body(JSON.toJSONString(paramMap)).execute().body();System.out.println(body);//文件上传示例
// HashMap<String, Object> paramMap1 = new HashMap<>();
// //文件上传只需将参数中的键指定(默认file),值设为文件对象即可,对于使用者来说,文件上传与普通表单提交并无区别
// paramMap1.put("file", FileUtil.file("D:\\face.jpg"));
// String result1 = HttpUtil.post("https://www.baidu.com", paramMap1);
//
// //下载文件(很少用)
// String fileUrl = "http://mirrors.sohu.com/centos/8.4.2105/isos/x86_64/CentOS-8.4.2105-x86_64-dvd1.iso";
// //将文件下载后保存在E盘,返回结果为下载文件大小
// long size = HttpUtil.downloadFile(fileUrl, FileUtil.file("e:/"));
// System.out.println("Download size: " + size);}public static void main(String[] args) {doPost();}
} 总结
日常开发中,我们一般使用spring的resttemplate和hutool的HttpUtil偏多,特别是hutool,非常推荐,里面有很多省心的工具类。
相关文章:
Java调用第三方HTTP接口的常用方式
【日常业务开发】Java调用第三方http接口的常用方式 概述Java调用第三方http接口的方式 通过JDK网络类Java.net.HttpURLConnection通过apache common封装好的HttpClient通过Apache封装好的CloseableHttpClient通过OkHttp通过Spring的RestTemplate通过hutool的HttpUtil 总结 概述…...
DOPE-PEG2000-FITC荧光特性
DOPE-PEG2000-FITC作为一种荧光标记分子,在生物医学领域应用。其荧光特性为生物成像和药物追踪提供了工具应用 FITC,作为荧光团,在受到特定波长的光激发时,能够吸收光能并转化为荧光发射。这一过程中,FITC分子从基态跃…...
华为Pura70支持5G功能吗?看完你就清楚了
随着 5G 技术的普及,现在智能手机市场中的大部分新品都已经支持 5G 网络。相较于 4G,5G 不仅带来了更快的网速,更为用户带来了全新的使用体验。 然而,华为作为智能手机市场的佼佼者,其产品线中的部分手机在配置上却有…...
android 4大组件用法
在Android开发中,应用程序的主要组件包括Activity、Service、Broadcast Receiver和Content Provider。这些组件共同组成了Android应用的基本构架。以下是每个组件的详细用法: 1. Activity Activity是Android应用的主要组成部分,代表一个用户…...
qt pro工程文件通用宏定义
在 Qt .pro 文件中,有一些预定义的宏(或变量),它们代表了特定的路径或与项目、构建环境相关的信息。 以下是一些常用的 .pro 文件宏: 通用宏 $$PWD: 当前 .pro 文件所在的绝对路径。这是一个非常重要的宏,…...
这次让我们隆重的介绍一下
深思熟虑之后,我诚挚地想要全面的介绍自己。若你的需求与我的专长恰好契合,我将以满心的热枕和真诚与你并肩作战,携手解决难题,一同追求卓越,实现我们的垂直成长。我是一名经验丰富且充满热情的技术人员。我热爱编程&a…...
大语言模型系列-Transformer
DeepSeek Transformer模型是深度学习领域中一种革命性的架构,它在自然语言处理(NLP)任务中取得了巨大的成功。Transformer模型由Vaswani等人在2017年的论文《Attention Is All You Need》中提出,其核心思想是利用自注意力&#x…...
Node.js 语言特定指南
Node.js 语言特定指南 本 Node.js 语言特定指南将教您如何使用 Docker 容器化 Node.js 应用程序。在本指南中,您将学习如何: 容器化并运行一个 Node.js 应用程序设置一个本地环境以使用容器开发 Node.js 应用程序使用容器为 Node.js 应用程序运行测试使…...
科普:什么是 BC-404 ?全方位解读最新通缩型 NFT 标准
区块链技术飞速发展的今天,创新从未停歇。继 ERC-404 标准问世后,一个名为 BC-404 的新标准应运而生,为 NFT 市场带来了全新的可能性。BC-404(Bonding Curve 404)—基于对 ERC-404 的改进,加密货币中第一个…...
软件测试学习笔记丨JUnit5执行顺序
本文转自测试人社区,原文链接: https://ceshiren.com/t/topic/28025 指定顺序使用场景 测试用例有业务逻辑相关集成测试(主流程测试) 排序方式 方法排序类排序Suite官方网站没有明确说明默认排序的具体规则 方法排序的类型 方法排序-Order 注解指定排序 …...
解决GPU 显存未能完全释放
一、 现象 算法同学反馈显存未能完全释放。 二、解决方法 一条命令搞定 注意:执行时注意不要误杀其他的python进程,需要确认好。 我的这条命令是将所有python进程都杀死了 ps -elf | grep python | awk {print $4} | xargs kill -s 9...
3D资产爆发,轻量化需求再度冲高,见证下一代3D崛起!
数字经济不断发展,3D资产和实体经济迎来深度融合的窗口期,3D资产应用外延催生大量新场景、新业态,一个3D资产构建的数字世界正出现在我们眼前。 数字经济不断发展,3D资产和实体经济迎来深度融合的窗口期,3D资产应用外…...
AI绘画的10种变现方法,逼你躺平挣钱
AI绘画到底能多挣钱! 马上看证据,知乎和其它平台的收益,AI绘画挣的稿费,还有某音某瓜的稿费。 都是有AI绘画的一大功劳! 接下来介绍AI绘画的十种挣钱方法,有折腾的收益,也有躺平的收益&#x…...
Pura 70 系列超高速风驰闪拍,捕捉美好,告别抓拍模糊
及时而准确的将画面定格,把事件最具有表现力的瞬间直观、真实地传达给观者,以使将抓拍影响的意义发挥最大化,由于抓拍摄影作品大多反映的是比较自然,真实的人和事,得到了社会的广泛认可,抓拍摄影也正日益成…...
AI作画Prompt不会写?Amazon Bedrock Claude3.5来帮忙
最新上线的Claude3.5 Sonnet按照官方介绍的数据来看,在多方面超越了CPT-4o,是迄今为止最智能的模型。 而跟上一个版本相比,速度是Claude 3 Opus的两倍,成本只有其五分之一。 Claude3.5 Sonnet不仅擅长解释图表、图形或者从不完…...
SSL证书类型解析:DV、OV、EV证书的区别与适用场景
在互联网时代,数据安全和用户隐私保护变得尤为重要。SSL证书作为加密网站通信的主要工具,为用户提供了一个安全的浏览环境。然而,面对市场上多种类型的SSL证书,许多网站所有者常常感到困惑。本文将重点解析三种常见的SSL证书类型—…...
WPF 2024 金九银十 最新 高级 架构 面试题 C#
含入门 初级 中级 高级 不同级别WPF的面试题 相关面试题 redis安装说明书 http://t.csdnimg.cn/iM260 单体并发瓶颈 redis sqlsever mysql多少 http://t.csdnimg.cn/DTXIh Redis高频面试题http://t.csdnimg.cn/FDOnv 数据库SqlServer笔试题 数据库SqlServer笔试题-CSDN博客 SQL…...
Linux上使用 git 命令行
在 Github或者 gitee 注册账号 这个比较简单 , 参考着官网提示即可 . 需要进行邮箱校验.以下以创建Github为例。 创建项目 1. 登陆成功后 , 进入个人主页 , 点击下方的 create a new repository 按钮新建项目 2. 在创建好的项目页面中复制项目的链接 , 以备接下来进行下…...
vue 中computed和watch的区别
computed与watch的区别 首先,computed是计算属性,watch是监听,监听data中的数据变化。 computed的计算属性它支持缓存,只有当依赖项发生改变的时候,它才会重新计算,否则它用的就是缓存的值。watch不支持缓…...
富豪王思聪的“爱情喜剧”从万达排片到网红聊天
王思聪,这位人生如戏、戏如人生的富二代, 在爱情的战场上可谓是屡战屡败,屡败屡战。 想当年,他向戚薇发起了猛烈的爱情攻势, 豪言壮语道:“若我以万达25%的排片量换你一笑,你可愿与我共舞&am…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
Vue 模板语句的数据来源
🧩 Vue 模板语句的数据来源:全方位解析 Vue 模板(<template> 部分)中的表达式、指令绑定(如 v-bind, v-on)和插值({{ }})都在一个特定的作用域内求值。这个作用域由当前 组件…...
Sklearn 机器学习 缺失值处理 获取填充失值的统计值
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...
