国外做详情页网站,天津市网站制作建设推广公司,电脑配件电子商务网站设计方案,答辩ppt模板下载免费完整版【日常业务开发】Java调用第三方http接口的常用方式 概述Java调用第三方http接口的方式 通过JDK网络类Java.net.HttpURLConnection通过apache common封装好的HttpClient通过Apache封装好的CloseableHttpClient通过OkHttp通过Spring的RestTemplate通过hutool的HttpUtil 总结 概述… 【日常业务开发】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;charsetutf-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;charsetutf-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?stationid57516);}
} 通过apache common封装好的HttpClient 简介http client到目前为止最新是5.1版官网地址http://hc.apache.org/ 。Http client专为推展而设计同时为基本http协议提供强大支持尽管java.net包提供了通过http访问的基本功能但是未提供许多应用程序所需要功能。 使用步骤 生成一个HttpClient对象并设置相应的参数生成一个GetMethod对象或PostMethod并设置响应的参数用HttpClient生成的对象来执行GetMethod生成的Get方法处理响应状态码若响应正常处理HTTP响应内容释放连接。无论执行方法是否成功都必须释放连接。 dependencygroupIdcom.alibaba/groupIdartifactIdfastjson/artifactIdversion2.0.1/version
/dependency
!--HttpClient--
dependencygroupIdcommons-httpclient/groupIdartifactIdcommons-httpclient/artifactIdversion3.1/version
/dependencyimport 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;charsetutf-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?tel13026194071, 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--
dependencygroupIdorg.apache.httpcomponents/groupIdartifactIdhttpclient/artifactIdversion4.5.2/version
/dependency
dependencygroupIdcom.alibaba/groupIdartifactIdfastjson/artifactIdversion1.2.28/version
/dependencyimport 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?stationid57516, null));}
}通过OkHttp 简介OkHttp是一个默认有效的HTTP客户端有效地执行HTTP可以加快您的负载并节省带宽如果您的服务有多个IP地址如果第一次连接失败OkHttp将尝试备用地址。这对于IPv4 IPv6和冗余数据中心中托管的服务是必需的。OkHttp启动具有现代TLS功能SNIALPN的新连接并在握手失败时回退到TLS 1.0OkHttp支持Android 2.3及更高版本。对于Java最低要求是1.7。 操作步骤 创建OkhttpClient。 mClient执行newCall将Request转化成一个Call。 最后call执行excute同步执行enqueue异步执行。 Request主要通过Request.Builder来构建。 缓存。 取消请求。 导入如下jar包 !--okhttp3--
dependencygroupIdcom.squareup.okhttp3/groupIdartifactIdokhttp/artifactIdversion4.9.1/version
/dependencyimport okhttp3.*;
import java.io.IOException;
/*** ClassName: OkHttpToInterface* Description: 通过OkHttp调用第三方http接口*/
public class OkHttpToInterface {public static final MediaType JSON MediaType.get(application/json; charsetutf-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; charsetutf-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?tel13026194071);
// doPost(https://api.github.com/markdown/raw, I am Jdqm.);doGet(https://weather.cma.cn/api/climate?stationid57516);}
}通过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返回新创建资源的URLput() PUT 资源到特定的URL 注意目前标红的为常用的 操作步骤 使用默认构造方法new一个实例new RestTemplate()。 RestTemplate 内部通过调用 doExecute 方法首先就是获取 ClientHttpRequest。 RestTemplate 实现了抽象类 HttpAccessor 所以可以调用父类的 createRequest。 SimpleClientHttpRequestFactory 实现了 ClientHttpRequest同时实现方法。 执行 requestCallback.doWithRequest(request)。 执行 response request.execute()。 最后解析response。 首先导入springboot的web包 parentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.1.4.RELEASE/version
/parent
dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/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) {ResponseEntityUser 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);ResponseEntityString 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);//组装HttpEntityJSONObject request new HttpEntity(obj, headers);ResponseEntityString responseEntity restTemplate.exchange(url, HttpMethod.POST, request, String.class);String body responseEntity.getBody();return body;}
}通过hutool的HttpUtil 简介关于Hutool工具类之HttpUtil如何使用可以参考官方文档Hutool之HttpUtil dependencygroupIdcn.hutool/groupIdartifactIdhutool-all/artifactIdversion5.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中HashMapString, 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普通请求示例HashMapString, 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);//文件上传示例
// HashMapString, 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非常推荐里面有很多省心的工具类。