Java使用OkHttps工具類調用外部接口

前言java

   如今公司業務已止不是傳統的增刪改查等簡單的業務處理操做,而是對數據各類聯調三方接口與其餘系統進行交互等,那麼就須要咱們在後臺java中進行外部接口的調用,本文采用OkHttps工具類對接微信接口爲你們簡單介紹下,java調用外部接口進行數據交互。mysql

  

 

第一步新建接口Demogit

    本文采用Idea做爲開發工具  web

    依次按照 file---new---projectspring

  緊接着以下sql

  若是這樣寫就會提示apache

  由於Idea中建立項目-項目名稱必須小寫json

接着繼續勾選Jar依賴api

Jar依賴選擇完成以後,確認項目名稱跟所在目錄tomcat

 

更具體的步驟請查看公衆號以前寫的

學習棧新年獻禮-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

相關文章
相關標籤/搜索