Java使用OkHttps工具类调用外部接口
前言
现在公司业务已止不是传统的增删改查等简单的业务处理操作,而是对数据各种联调三方接口与其他系统进行交互等,那么就需要我们在后台java中进行外部接口的调用,本文采用OkHttps工具类对接微信接口为大家简单介绍下,java调用外部接口进行数据交互。
第一步新建接口Demo
本文采用Idea作为开发工具
依次按照 file---new---project
紧接着如下
如果这样写就会提示
因为Idea中创建项目-项目名称必须小写
接着继续勾选Jar依赖
Jar依赖选择完成之后,确认项目名称跟所在目录
更具体的步骤请查看公众号之前写的
学习栈新年献礼-SpringBoot第一弹
项目创建好之后,创建两个package,用来存放我们的工具类,与接口
先引入项目所需jar包依赖
buildscript {
ext {
springBootVersion = '2.1.2.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
} apply plugin: 'java'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'war'
group = 'com.ahdd99.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
repositories {
mavenCentral()
} dependencies {
compile 'org.springframework.boot:spring-boot-starter-data-jpa'
compile 'org.springframework.boot:spring-boot-starter-jdbc'
compile 'org.springframework.boot:spring-boot-starter-web'
compile 'mysql:mysql-connector-java'
compile 'org.springframework.boot:spring-boot-starter-test'
compile 'com.squareup.okhttp3:okhttp:3.5.0'
compile group: 'com.google.code.gson', name: 'gson', version: '2.7'
compile 'com.xiaoleilu:hutool-all:3.1.0'
compile 'com.squareup.okhttp3:okhttp:3.5.0'
compileOnly 'org.projectlombok:lombok:1.16.6'
testCompile 'org.springframework.boot:spring-boot-starter-test'
providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
providedRuntime 'org.apache.tomcat:tomcat-jasper:8.5.28'
}
紧接着,在util包里面引入我们的okhttps工具类
OkHttps工具类中主要封装了get与post请求,这里简单让大家看下,源代码会贴在文章末尾
/**
* OkHttpUtils 工具类
*/
@Slf4j
public class OkHttpUtils { private final static OkHttpClient client = new OkHttpClient().newBuilder()
.writeTimeout(60, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.build();
public static JsonObject doGetRetJson(String url) throws IOException {
return doGetRetJsonElement(url).getAsJsonObject();
} public static JsonElement doGetRetJsonElement(String url) throws IOException {
Request request = new Request.Builder().url(url).build();
return sendSyncRequestRetJsonElement(request);
} public static JsonObject doPostRetJson(String url, String jsonBody) throws IOException {
return doPostRetJsonElement(url, jsonBody).getAsJsonObject();
} public static JsonElement doPostRetJsonElement(String url, String jsonBody) throws IOException {
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), jsonBody);
Request request = new Request.Builder().url(url).post(requestBody).build();
return sendSyncRequestRetJsonElement(request);
}
public static String doPostRetJsonString(String url, String jsonBody) throws IOException {
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), jsonBody);
Request request = new Request.Builder().url(url).post(requestBody).build();
return sendSyncRequestRetString(request);
}
public static String doPostRetString(String url, String textBody) throws IOException {
RequestBody requestBody = RequestBody.create(MediaType.parse("application/x-www-form-urlencoded; charset=utf-8"), textBody);
Request request = new Request.Builder().url(url).post(requestBody).build();
return sendSyncRequestRetString(request);
} public static void doPost(String url, Map<String, String> params) throws IOException {
FormBody.Builder formBuilder = new FormBody.Builder();
for (String key : params.keySet()) {
formBuilder.add(key, params.get(key));
}
Request request = new Request.Builder().url(url).post(formBuilder.build()).build();
sendSyncRequestRetString(request);
} public static JsonObject doPostRetJson(String url, Map<String, String> params) throws IOException {
FormBody.Builder formBuilder = new FormBody.Builder();
for (String key : params.keySet()) {
formBuilder.add(key, params.get(key));
}
Request request = new Request.Builder().url(url).post(formBuilder.build()).build();
return sendSyncRequestRetJson(request);
} /**
* 支付宝请求返回form
*
* @param url
* @param params
* @return
* @throws IOException */
public static String doPostResString(String url, Map<String, String> params) throws IOException {
FormBody.Builder formBuilder = new FormBody.Builder();
for (String key : params.keySet()) {
formBuilder.add(key, params.get(key));
}
Request request = new Request.Builder().url(url).post(formBuilder.build()).build();
return sendSyncRequestRetString(request);
} public static JsonObject doPostRetJsonForUploadFile(String url, Map<String, Object> params) throws IOException {
MultipartBody.Builder formBuilder = new MultipartBody.Builder();
formBuilder.setType(MultipartBody.FORM);
params.forEach((key, value) -> {
if (value instanceof File) {
File file = (File) value;
formBuilder.addFormDataPart(key, file.getName(), RequestBody.create(MediaType.parse("application/pdf; charset=utf-8"), file));
} else {
formBuilder.addFormDataPart(key, value.toString());
}
});
Request request = new Request.Builder().url(url).post(formBuilder.build()).build();
return sendSyncRequestRetJson(request);
} private static JsonObject sendSyncRequestRetJson(Request request) throws IOException {
return sendSyncRequestRetJsonElement(request).getAsJsonObject();
} private static JsonElement sendSyncRequestRetJsonElement(Request request) throws IOException {
return JsonUtils.toJsonElement(sendSyncRequestRetString(request));
} private static String sendSyncRequestRetString(Request request) throws IOException {
Response response = client.newCall(request).execute();
if (!response.isSuccessful()) { throw new IOException("请求出错,出错信息:" + response.message());
}
String retString = response.body().string();
if (StrUtil.isEmpty(retString)) {
return "";
}
return retString;
}
}
kHttps工具类引入完成之后,引入JsonUtils工具类,这个主要是帮助我们吧参数封给JSON,免去我们在每个接口中再进行单独封装
/**
* 参数转json工具类
*/
public class JsonUtils { private static final JsonParser JSON_PARSER = new JsonParser();
public static String toJson(Object object) {
Gson gson = new GsonBuilder().create();
return gson.toJson(object);
} public static JsonObject toJsonObject(String json) {
return JSON_PARSER.parse(json).getAsJsonObject();
} public static JsonArray jsonObjectToJsonArray(JsonObject jsonObject) {
JsonArray jsonArray = new JsonArray();
jsonArray.add(jsonObject);
return jsonArray;
} public static JsonElement toJsonElement(String json) {
return JSON_PARSER.parse(json);
}
}
工具类都引入完毕之后,就是我们的重头戏了
接口开发第一步,抽离接口Api工具类
将所有的接口路径抽离为工具类,并且定义为常量,方便后期维护
/**
* 接口api路径
* @author gyk
* @date 2019-03-27 11:27
*/
public class WxPortApi { /**
* 接口请求路径
*/
public final static String WX_API = "https://api.weixin.qq.com";
/**
* 学习栈appID
*/
public final static String WX_APP_ID = "";
/**
* 学习栈AppSecret
*/
public final static String AppSecret = "";
/**
* 获取access_token接口
*/
public final static String ACCESS_TOKEN = "/cgi-bin/token";
}
下来就是接口调用
创建package service
编写接口service层业务处理
/**
* 获取公众号的access_token
* @param appId --- 微信appId
* @param secret --- 微信秘钥
* @return
*/
public JsonObject getAccessTocken(String appId, String secret){
JsonObject resultJson = new JsonObject();
Map<String, String> params = new HashMap<>(3);
//赋值接口需传递参数
//获取access_token填写client_credential
params.put("grant_type", "client_credential");
// 第三方用户唯一凭证
params.put("appid", appId);
// 第三方用户唯一凭证密钥,即appSecret
params.put("secret", secret);
try {
//调用okHttps工具类进行接口调用
return OkHttpUtils.doPostRetJson(WxPortApi.WX_API + WxPortApi.ACCESS_TOKEN, params);
} catch (IOException e) {
//赋值失败结果
resultJson.addProperty("result","-1");
resultJson.addProperty("msg",msg +"获取access_token失败");
return resultJson;
} }
然后编写单元测试
/**
* 测试获取公众号的access_token
*/
@Test
public void getAccessTocken() {
WxPortService wxPortService = new WxPortService();
JsonObject jsonObject = wxPortService.getAccessTocken(WxPortApi.WX_APP_ID, WxPortApi.AppSecret);
//获取错误码
String error_code = String.valueOf(jsonObject.get("errcode"));
//如果errcode 为空,那么证明获取的正确,不然获取失败
if("null".equals(error_code)){
//打印得到的access_token
System.out.println(String.valueOf(jsonObject.get("access_token")));
} }
在这里有一个小坑大家要注意,java中String.valueOf() 如果你传入的是NULL 那么java会给你返回"Null" 字符串
剩下的微信接口对接将于后面进一步详细讲解
添加小编微信,加入技术交流群or招聘交流群
QQ千人技术交流群: 710566091 一起学习一起成长
源码地址 https://gitee.com/DaiDaiDeXiaoMaNong/port.git
Java使用OkHttps工具类调用外部接口的更多相关文章
- HttpTool.java(在java tool util工具类中已存在) 暂保留
HttpTool.java 该类为java源生态的http 请求工具,不依赖第三方jar包 ,即插即用. package kingtool; import java.io.BufferedReader ...
- java导出excel工具类
java导出excel须要使用HSSFWorkbook这个类,须要导入poi-3.6-20091214.jar 工具类调用例如以下: package com.qlwb.business.util; i ...
- Java基础-DButils工具类(QueryRunner)详解
Java基础-DButils工具类(QueryRunner)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 如果只使用JDBC进行开发,我们会发现冗余代码过多,为了简化JDBC ...
- Java集合——Collections工具类
Java集合——Collections工具类 摘要:本文主要学习了Collections工具类的常用方法. 概述 Collections工具类主要用来操作集合类,比如List和Set. 常用操作 排序 ...
- Java多线程并发工具类-信号量Semaphore对象讲解
Java多线程并发工具类-Semaphore对象讲解 通过前面的学习,我们已经知道了Java多线程并发场景中使用比较多的两个工具类:做加法的CycliBarrier对象以及做减法的CountDownL ...
- Java并发编程工具类 CountDownLatch CyclicBarrier Semaphore使用Demo
Java并发编程工具类 CountDownLatch CyclicBarrier Semaphore使用Demo CountDownLatch countDownLatch这个类使一个线程等待其他线程 ...
- java文件处理工具类
import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedRead ...
- java格式处理工具类
import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOExceptio ...
- Java 敏感词过滤,Java 敏感词替换,Java 敏感词工具类
Java 敏感词过滤,Java 敏感词替换,Java 敏感词工具类 =========================== ©Copyright 蕃薯耀 2017年9月25日 http://www ...
随机推荐
- 每天五分钟,玩转Docker。
Docker技术在国内如火如荼的流行了起来,我当然也想要赶上这时髦的技术啦.下面,我将重新拾起一年多未用的Docker,继续我的云计算之路. Day 1 学习Docker,先从Docker的命令行工 ...
- Spring+MVC Controller层接收App端请求的中文参数乱码问题。
在正文之前,说明下Filter的作用: 过滤器顾名思义就是进行过滤的,可以实现代码的定向执行和预处理.通俗点说法filter相当于加油站,request是条路,response是条路,目的地是serv ...
- Chapter5_初始化与清理_enum关键字
enum关键字虽然只是一个很小的特性,但是它在我们使用枚举类型时,可以很方便的处理.先举一个例子. enum Speciness{ NOT, MILD, MEDIUM, HOT, FLAMING } ...
- 51Nod - 1046 (附关于快速幂的讨论)
题意: 给出3个正整数A B C,求A^B Mod C. 例如,3 5 8,3^5 Mod 8 = 3. 分析: 快速幂模板题. 快速幂: 1.自然数的拆分 对于任何的自然数, 可以把它用形如1001 ...
- GitHub学习途径
之前学习GitHub的一个pdf文件 作者是stormzhang 我觉得那个pdf教的很详细,我还没看完,正在学习中,学到了文件的clon和在本机如何更新GitHub的文件. 在此分享一下 下载链接h ...
- shell脚本编写某一文件夹内拷贝某一段文件(有则跳过没有则拷贝)
必须是同一台服务器下,或者挂载目录,不同服务器下没办法查询目录中是否有该文件 如果不在同一服务器下,可以把要查询的那个服务器的文件夹设置共享挂在到当前服务器 或者可以把脚本写到要拷贝的服务器上,那么s ...
- 操作系统组成和工作原理以及cpu的工作原理
- 2019.03.28 bzoj3326: [Scoi2013]数数(数位dp)
传送门 题意: 一个人数数,规则如下: 确定数数的进制B 确定一个数数的区间[L, R] 对于[L, R] 间的每一个数,把该数视为一个字符串,列出该字符串的所有连续子串对应的B进制数的值. 对所有列 ...
- [Java基础复习] -- x. 正则表达式的使用
序号待定, 先用x占位表示 理论知识待完善, 先贴上代码 import java.util.regex.Matcher; import java.util.regex.Pattern; import ...
- 可遇不可求的Question之Mysql在不重启服务的情况下修改运行时变量篇
比方说在一些实际生产环境中,想改个MYSQL的配置,但是又不想停止服务重起MYSQL,有什么办法呢?使用SET命令可以做到,请看下面几个例子: 1.设置key_buffer_size的大小为10M. ...