国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

JAVA開發(fā)(基于Restful的微服務第三方簡易接口設(shè)計)

這篇具有很好參考價值的文章主要介紹了JAVA開發(fā)(基于Restful的微服務第三方簡易接口設(shè)計)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

?

?一、需求背景

java后端需要提供接口服務,其中接口服務分為對內(nèi)網(wǎng)的后臺管理系統(tǒng)的接口,對外網(wǎng)的用戶接口和對第三方系統(tǒng)的接口。這里主要講對第三方的接口。

二、接口設(shè)計

我們可以參考微信小程序的接口,一般一個系統(tǒng)提供給第三方系統(tǒng)的接口都需要接口權(quán)限認證,也就是先獲取token,然后通過token再進行接口數(shù)據(jù)請求。這是為了保障數(shù)據(jù)的安全性。這是第三方接口設(shè)計的基本規(guī)范。

java restful接口開發(fā),java,restful,后端

其中token的獲取是通過appid和秘鑰等信息去請求微信的后端,這個appid就相當于是一個賬號,秘鑰就相當于是一個密碼。其原理就是相當于只有登錄了系統(tǒng)才能請求系統(tǒng)的接口。

那么如果我們不制作token,使用一種簡易的方式做接口設(shè)計怎么設(shè)計呢。

token其實就是一個有實效的令牌,我們簡易的做法可以使用登錄賬號和密碼直接登錄,每次去請求接口都傳輸賬號和密碼就可以了,但是這里需要注意的是傳參一定要加密。

三、接口設(shè)計實施

1、我們需要在數(shù)據(jù)庫里建一個接口用戶表,表字段包含賬號和密碼字段等。

-- Drop table

-- DROP TABLE public.m_token_user;

CREATE TABLE public.m_token_user (
	id varchar(64) NOT NULL,
	user_name varchar(64) NULL,
	"password" varchar(64) NULL,
	CONSTRAINT m_token_user_pk PRIMARY KEY (id)
);

2、編寫校驗登錄賬號代碼流程。

實體類:

 

import java.io.Serializable;
import java.util.Date;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
  
 /**
   * 數(shù)據(jù)庫表名稱:m_token_user (外部系統(tǒng)用戶接口認證表)
   */
@Data
@EqualsAndHashCode()
@TableName(value="m_token_user",schema = "public")
public class MTokenUser implements Serializable{

	/**
	 * 序列
	 */
	private static final long serialVersionUID = 1L;

    /**
     * 
     * 主鍵:id VARCHAR(64)
     */
    @TableId(value = "id" ,type = IdType.ASSIGN_UUID)
	@ApiModelProperty(value = "ID")
    private String id;
 
    /**
     * 
     * 用戶名:user_name VARCHAR(64)
     */
    private String userName;
 
    /**
     * 
     * 密碼:password VARCHAR(64)
     */
    private String password;
 
}

Service類:

import cn.ctg.common.util.PageUtils;
import cn.ctg.common.util.Query;
import org.springframework.beans.factory.annotation.Autowired;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import cn.ctg.member.entity.MTokenUser;
import cn.ctg.member.dao.MTokenUserMapper;
import lombok.extern.slf4j.Slf4j;

import java.util.List;
import java.util.Map;
  
/**
  * @Description: 外部系統(tǒng)用戶接口認證Service
  */
@Slf4j
@Service
@Transactional(rollbackFor = Exception.class)
public class MTokenUserService extends ServiceImpl<MTokenUserMapper, MTokenUser>{

    @Autowired
    private MTokenUserMapper mTokenUserMapper;

 
    /**
     * 根據(jù)賬號和密碼查詢
     * searchByUserName
     */
    public MTokenUser searchByUserName(String userName,String  password) {
        QueryWrapper<MTokenUser> wrapper = new QueryWrapper<MTokenUser>();
        
        wrapper.eq("user_name", userName);
        wrapper.eq("password", password);
        MTokenUser mTokenUser = mTokenUserMapper.selectOne(wrapper);
        return mTokenUser;
    }
	
}

RestFul第三方接口:

Controller類示例

import java.util.HashMap;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.alibaba.fastjson.JSON;

import cn.ctg.common.encryption.Des3Utils;
import cn.ctg.common.response.ResponseData;
import cn.ctg.member.dto.WXModelDTO;
import cn.ctg.member.entity.MTokenUser;
import cn.ctg.member.service.MTokenUserService;
import cn.ctg.member.service.WeixinAppService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;

/**
* @Description:
* @date:2023年5月30日
*/
@Slf4j
@RestController
@RequestMapping("rpcApi")
@Api(tags = "對外API")
@Scope(value = "prototype")
public class RpcApiController {
	/**
	 * 3DES秘鑰(通過配置獲?。?	 */
	@Value("${sbx.3desKey:-1}")
	private String desKey;	
	
	@Autowired
	private WeixinAppService weixinAppService;
	
	@Autowired
	private MTokenUserService mTokenUserService;
	
	/**
	 * 
	 * @return Map<String, Object>
	 */
	@ApiOperation(value = "遠程注冊用戶會員", notes = "遠程注冊用戶會員")
	@PostMapping("/regUser")
	public ResponseData<String>  regUser(@RequestBody Map<String, Object> receiveParam) {
		
		//解密參數(shù)
		String data = "";
		if(receiveParam.containsKey("data")) {
			data = receiveParam.get("data").toString();
		}else {
			return ResponseData.error("參數(shù)格式錯誤");
		}
		
		String receiveData = Des3Utils.get3DESDecryptECB(data, desKey);
		log.info("3des后receiveData注冊數(shù)據(jù):" + receiveData);
		if(StringUtils.isEmpty(receiveData)) {
			return ResponseData.error("參數(shù)數(shù)據(jù)或格式錯誤");
		}
		
		@SuppressWarnings("unchecked")
		Map<String, Object> param = JSON.parseObject(receiveData, Map.class);
		
		String phone = "";
		String countryCode = "";
		String openId = "";
		String registerId = "";
		String registerName = "";
		String inviter = "";
		String channelId = "";
		String channelName = "";
		String company = "";
		String account = "";
		String password = "";
		
		if(param.containsKey("account")) {
			account = param.get("account").toString();
		}else {
			return ResponseData.error("授權(quán)賬號為空");
		}
		
		if(param.containsKey("password")) {
			password = param.get("password").toString();
		}else {
			return ResponseData.error("授權(quán)密碼為空");
		}
		
		log.info("授權(quán)賬號:"+account+",授權(quán)密碼:"+password);
		//授權(quán)認證
		MTokenUser mTokenUser = mTokenUserService.searchByUserName(account, password);
		if(null == mTokenUser) {
			return ResponseData.error("授權(quán)失敗,賬號或密碼錯誤");
		}
 
		if(param.containsKey("phone")) {
			phone = param.get("phone").toString();
		}else {
			return ResponseData.error("手機號不能為空");
		}
		
		if(param.containsKey("countryCode")) {
			countryCode = param.get("countryCode").toString();
		}else {
			return ResponseData.error("手機國家號不能為空");
		}
		
		if(param.containsKey("openId")) {
			openId = param.get("openId").toString();
		}else {//拼接生成
			openId =countryCode+"-"+phone;
		}
		
		if(param.containsKey("registerId")) {
			registerId = param.get("registerId").toString();
		}
		if(param.containsKey("registerName")) {
			registerName = param.get("registerName").toString();
		}
		if(param.containsKey("inviter")) {
			inviter = param.get("inviter").toString();
		}
			
		if(param.containsKey("channelId")) {
			channelId = param.get("channelId").toString();
		}
		if(param.containsKey("channelName")) {
			channelName = param.get("channelName").toString();
		}
		if(param.containsKey("company")) {
			company = param.get("company").toString();
		}
		
		WXModelDTO wXModelDTO = weixinAppService.rpcRegUser(phone, countryCode, openId, registerId, registerName, inviter, channelId, channelName, company);
		
		String str = Des3Utils.get3DESEncryptECB(JSON.toJSONString(wXModelDTO), desKey);
		
		return ResponseData.success(str);
	 
	}

	
	public static void main(String[] args) {
		
		Map<String, Object> param  = new HashMap<String, Object>();
		param.put("phone", "13657**3364");
		param.put("openId", "432423");
		param.put("countryCode", "86");
		param.put("account", "測試");
		param.put("password", "測試的密碼");
		String enStr = Des3Utils.get3DESEncryptECB(JSON.toJSONString(param), "秘鑰");
		String deStr = Des3Utils.get3DESDecryptECB(enStr,  "秘鑰");
		Map map = JSON.parseObject(deStr,Map.class);
		
		System.out.println("enStr:"+enStr);
		System.out.println("deStr:"+deStr);
		System.out.println("map:"+map);
		
		 
		
	}

}

加解密工具類Des3Utils.java



import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
import java.security.Key;
import java.util.Base64;

import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import org.bouncycastle.util.encoders.Hex;

import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;




/**

* @Description:
* @Company:ctg.cn
* @date:2023年5月30日
*/
@Slf4j
public class Des3Utils {
	/**
     * 加密算法
     */
    private static final String KEY_ALGORITHM = "DESede";
    private static final String CIPHER_ALGORITHM = "DESede/CBC/PKCS5Padding";

    /**
     * 3DES 加密
     * @param key   秘鑰(24位)
     * @param iv    偏移量
     * @param data  需要加密的字符串
     * @return 返回加密的字符串
     */
    public static String encrypt(String key, String iv, String data) {
        try {
            DESedeKeySpec spec = new DESedeKeySpec(key.getBytes(StandardCharsets.UTF_8));
            SecretKeyFactory keyfactory = SecretKeyFactory.getInstance(KEY_ALGORITHM);
            Key deskey = keyfactory.generateSecret(spec);
            Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
            IvParameterSpec ips = new IvParameterSpec(iv.getBytes(StandardCharsets.UTF_8));
            cipher.init(Cipher.ENCRYPT_MODE, deskey, ips);
            byte[] bOut = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
            Base64.Encoder encoder = Base64.getMimeEncoder();
            return encoder.encodeToString(bOut);
        } catch (Exception e) {
            e.printStackTrace();
            log.error("3DES 解密錯誤:{}", e);
            throw new RuntimeException("3DES 解密錯誤");
        }
    }

    /**
     * 3DES 解密
     * @param key   秘鑰(24位)
     * @param iv    偏移量
     * @param data  需要解密的密文
     * @return 返回加密的字符串
     */
    public static String decrypt(String key, String iv, String data) {
        try {
            DESedeKeySpec spec = new DESedeKeySpec(key.getBytes(StandardCharsets.UTF_8));
            SecretKeyFactory keyfactory = SecretKeyFactory.getInstance(KEY_ALGORITHM);
            Key deskey = keyfactory.generateSecret(spec);
            Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
            IvParameterSpec ips = new IvParameterSpec(iv.getBytes(StandardCharsets.UTF_8));
            cipher.init(Cipher.DECRYPT_MODE, deskey, ips);
            byte[] bOut = cipher.doFinal(getBase64Decode(data));
            return new String(bOut, StandardCharsets.UTF_8);
        } catch (Exception e) {
            e.printStackTrace();
            log.error("3DES 解密錯誤:{}", e);
            throw new RuntimeException("3DES 解密錯誤");
        }
    }

    /**
     * 3DES加密
     * @param src
     * @param secretKey
     * @return
     */

    public static String get3DESEncryptECB(String src, String secretKey) {
        try {
            Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
            cipher.init(1, new SecretKeySpec(build3DesKey(secretKey), "DESede"));
            String base64Encode = getBase64Encode(cipher.doFinal(src.getBytes("UTF-8")));
            return filter(base64Encode);
        } catch (Exception var4) {
            return null;
        }
    }

    /**
     * 3DES解密
     * @param src
     * @param secretKey
     * @return
     */
    public static String get3DESDecryptECB(String src, String secretKey) {
        try {
            Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
            cipher.init(2, new SecretKeySpec(build3DesKey(secretKey), "DESede"));
            byte[] base64DValue = getBase64Decode(src);
            byte[] ciphertext = cipher.doFinal(base64DValue);
            return new String(ciphertext, "UTF-8");
        } catch (Exception var5) {
            return null;
        }
    }

    public static byte[] getBase64Decode(String str) {
        byte[] src = null;

        try {
            Base64.Decoder decoder = Base64.getMimeDecoder();
            src = decoder.decode(str);
        } catch (Exception var3) {
            var3.printStackTrace();
        }

        return src;
    }

    public static String getBase64Encode(byte[] src) {
        String requestValue = "";

        try {
            Base64.Encoder encoder = Base64.getMimeEncoder();
            requestValue = filter(encoder.encodeToString(src));
        } catch (Exception var3) {
            var3.printStackTrace();
        }

        return requestValue;
    }
    public static byte[] build3DesKey(String keyStr) throws UnsupportedEncodingException {
        byte[] key = new byte[24];
        byte[] temp = keyStr.getBytes("UTF-8");
        if (key.length > temp.length) {
            System.arraycopy(temp, 0, key, 0, temp.length);
        } else {
            System.arraycopy(temp, 0, key, 0, key.length);
        }

        return key;
    }
    private static String filter(String str) {
        String output = null;
        StringBuffer sb = new StringBuffer();

        for(int i = 0; i < str.length(); ++i) {
            int asc = str.charAt(i);
            if (asc != '\n' && asc != '\r') {
                sb.append(str.subSequence(i, i + 1));
            }
        }

        output = new String(sb);
        return output;
    }

    public static String byteToHexString(byte[] bytes) {
        StringBuffer sb = new StringBuffer();

        for(int i = 0; i < bytes.length; ++i) {
            String strHex = Integer.toHexString(bytes[i]);
            if (strHex.length() > 3) {
                sb.append(strHex.substring(6));
            } else if (strHex.length() < 2) {
                sb.append("0" + strHex);
            } else {
                sb.append(strHex);
            }
        }

        return sb.toString();
    }

    /**
     * 將data中的密文Hex后3DES解碼
     * @param content
     * @param key
     * @return
     */
    public static String reHexAndDecrypt(String content, String key) {
        if(StrUtil.isBlank(content)) {
            return null;
        }
        byte[] hexBytes = Hex.decode(content.getBytes(StandardCharsets.UTF_8));
        String baseReqStr = getBase64Encode(hexBytes);
        String outInfo = Des3Utils.get3DESDecryptECB(baseReqStr, key);
        return outInfo;
    }

}

Restful的微服務接口設(shè)計原則

一、概述

在微服務架構(gòu)中,各個服務之間的通信主要通過接口進行。為了實現(xiàn)松耦合的通信,接口設(shè)計應該遵循一些重要的原則。其中,Restful是一種流行的接口設(shè)計風格,它基于HTTP協(xié)議,通過統(tǒng)一的接口規(guī)范來簡化分布式系統(tǒng)的開發(fā)。本文將重點探討Restful的微服務接口設(shè)計原則。

二、原則詳解

  1. 明確資源定位

Restful的核心思想是基于資源的。每一個微服務都應該有一個明確的資源定位,這有助于明確服務的邊界和職責。資源的標識符通常使用URI(統(tǒng)一資源標識符),通過特定的URI來訪問特定的資源。例如,用戶管理微服務的資源定位可能是“/users”,通過訪問“/users”可以獲取用戶列表或特定用戶的信息。

  1. 使用HTTP方法

Restful接口推薦使用HTTP協(xié)議的四種方法(GET、POST、PUT、DELETE)來操作資源。每種方法都有明確的語義,用于執(zhí)行不同的操作。例如,GET方法用于獲取資源,POST方法用于創(chuàng)建資源,PUT方法用于更新資源,DELETE方法用于刪除資源。通過使用標準的HTTP方法,可以實現(xiàn)跨平臺的互操作性,并簡化客戶端和服務端的交互。

  1. 保持無狀態(tài)

無狀態(tài)是Restful接口的一個重要特性。這意味著服務端不應該為客戶端保存任何狀態(tài)信息。每次請求都需要攜帶必要的信息,服務端根據(jù)請求的信息來處理請求并返回結(jié)果。這樣可以提高系統(tǒng)的可伸縮性和可靠性,因為服務端不需要維護客戶端的狀態(tài)信息。

  1. 參數(shù)傳遞

Restful接口通過URI和HTTP請求體來傳遞參數(shù)。在URI中,可以通過查詢參數(shù)的形式傳遞某些信息,如排序、分頁等。對于復雜的請求體,可以使用JSON或XML格式來傳遞數(shù)據(jù)。在返回結(jié)果時,也可以使用相同的格式來返回數(shù)據(jù)。這種數(shù)據(jù)格式的傳遞方式使得Restful接口更加靈活和可擴展。

  1. 錯誤處理

當請求發(fā)生錯誤時,Restful接口使用HTTP狀態(tài)碼來表示錯誤類型。常見的狀態(tài)碼包括404(未找到)、401(未授權(quán))、500(服務器內(nèi)部錯誤)等。通過使用標準的HTTP狀態(tài)碼,客戶端可以理解請求失敗的原因,并根據(jù)具體情況采取相應的措施。除了狀態(tài)碼外,還可以在響應體中返回具體的錯誤信息,以便客戶端進行更詳細的錯誤處理。

  1. 版本控制

隨著微服務的演進和變化,可能會導致接口的變更。為了避免因接口變更而導致的兼容性問題,應該對接口進行版本控制。可以通過在URI中添加版本號來實現(xiàn)接口的版本控制。例如,“/v1/users”表示訪問版本1的用戶管理接口。通過版本控制,可以逐步遷移現(xiàn)有客戶端,同時允許新舊版本共存,降低升級成本。

  1. 安全性考慮

Restful接口應考慮安全性問題,以確保數(shù)據(jù)的安全性和完整性。常見的安全措施包括使用HTTPS協(xié)議進行加密通信、實施身份驗證和授權(quán)機制等。身份驗證可以通過JWT(JSON Web Token)、OAuth等協(xié)議來實現(xiàn),確保只有經(jīng)過身份驗證和授權(quán)的用戶才能訪問相應的資源。此外,還可以使用參數(shù)校驗、輸入過濾等手段來防止?jié)撛诘陌踩┒础?/p>

  1. 文檔化與可維護性

為了方便開發(fā)和維護,Restful接口應該具備良好的文檔化。文檔應詳細描述接口的URI、請求和響應的格式、參數(shù)說明、錯誤碼等信息??梢允褂肧wagger等工具自動生成API文檔,以便開發(fā)人員快速了解和使用接口。此外,對于復雜的業(yè)務邏輯或參數(shù)設(shè)置,應該在注釋中進行說明,提高代碼的可讀性和可維護性。

  1. 擴展性與靈活性

隨著業(yè)務的發(fā)展和變化,微服務可能需要不斷演進和調(diào)整。因此,Restful接口設(shè)計應具備良好的擴展性與靈活性??梢酝ㄟ^設(shè)計可擴展的API、使用插件機制等方式來實現(xiàn)這一目標。此外,為了滿足不同客戶端的需求,可以提供多種數(shù)據(jù)格式的支持(如JSON、XML等),提高接口的適應性。

三、總結(jié)

以上是關(guān)于Restful的微服務接口設(shè)計原則的探討。遵循這些原則可以幫助我們設(shè)計出清晰、可維護、可擴展的微服務接口,提高系統(tǒng)的可伸縮性和可靠性。在實際應用中,根據(jù)具體的業(yè)務需求和技術(shù)環(huán)境,可以選擇適合的原則進行實施,以滿足項目的實際需求。同時,隨著技術(shù)的不斷發(fā)展和演進,我們也需要不斷關(guān)注新的趨勢和實踐,不斷完善和優(yōu)化微服務的接口設(shè)計。文章來源地址http://www.zghlxwxcb.cn/news/detail-705326.html

到了這里,關(guān)于JAVA開發(fā)(基于Restful的微服務第三方簡易接口設(shè)計)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • 安全學習_開發(fā)相關(guān)_Java第三方組件Log4j&FastJSON及相關(guān)安全問題簡介

    安全學習_開發(fā)相關(guān)_Java第三方組件Log4j&FastJSON及相關(guān)安全問題簡介

    Java Naming and Directory Interface (Java 命名和目錄接口 ),JNDI 提供統(tǒng)一的客戶端 API,通過不同的服務供應接口(SPI)的實現(xiàn),由管理者將 JNDI API 映射為特定的命名服務和目錄服務,使得 JAVA 應用程可以通過 JNDI 實現(xiàn)和這些命名服務和目錄服務之間的交互。 Log4J: Apache的一個開源項目

    2024年02月05日
    瀏覽(55)
  • spring boot整合第三方微信開發(fā)工具 weixin-java-miniapp 實現(xiàn)小程序微信登錄

    spring boot整合第三方微信開發(fā)工具 weixin-java-miniapp 實現(xiàn)小程序微信登錄

    有時候項目需要用到微信登錄或獲取用戶的手機號碼,weixin-java-miniapp是一個好用的第三方工具,不用我們自己寫httpcline調(diào)用。 導入jar包 添加一個resource.properties文件,寫上小程序的appid和secret 添加兩個配置文件 WxMaProperties.java WxMaConfiguration.java 如何使用 小程序給微信發(fā)送消息

    2024年02月16日
    瀏覽(93)
  • java調(diào)第三方接口

    目錄 背景 Spring的RestTemplate 1.引入依賴 2.RestTemplate配置類 3.RestTemplate實現(xiàn)類 java調(diào)第三方接口我百度的有三種方法. 第一種:通過JDK網(wǎng)絡(luò)類Java.net.HttpURLConnection 第二種:通過Apache common封裝好的HttpClient 第三種:通過Spring的RestTemplate 這個三種方法在我的scdn收藏里有,都是可以直接用的

    2024年02月05日
    瀏覽(33)
  • Java常用第三方工具類

    一、Apache StringUtils:專為Java字符串而生的工具類 首先引入依賴: 1.字符串判空 isEmpty: 判斷null和\\\"\\\" isNotEmpty:判斷null和\\\"\\\" isBlank:判斷null和\\\"\\\"和\\\" \\\" isNotBlank:判斷null和\\\"\\\"和\\\" \\\" 示例代碼如下: 執(zhí)行結(jié)果: 2.分割字符串 使用StringUtils的split()方法分割字符串成數(shù)組。 示例代碼如下:

    2024年02月08日
    瀏覽(93)
  • Java 音頻播報(內(nèi)置 + 第三方)

    ? ? ? ? jdk內(nèi)置的可以使用,不過呢就是聲音太原始了,這是同過輸入文字然后識別讀出來的。 1、導入JL的依賴 2、代碼實現(xiàn) ? ? ? ? 這個是通過文件播報的,可以在網(wǎng)上下載自己需要的音頻 最近在做項目,做外賣的,其中有一個功能就是接單,商家接單就需要用到這個功

    2024年02月02日
    瀏覽(22)
  • APP外包開發(fā)的第三方代碼庫

    APP外包開發(fā)的第三方代碼庫

    在APP的開發(fā)過程中有很多好用的第三方庫,這些第三方庫代碼質(zhì)量高,已經(jīng)在很多的項目實際使用過,因此在開發(fā)APP時是非常好的選擇。第三方庫可以減輕開發(fā)人員工作量,也是開發(fā)人員必須要關(guān)注的輔助代碼。今天和大家分享一些常用的第三方庫,希望對大家有所幫助。北

    2024年02月08日
    瀏覽(15)
  • 打包jar服務,如何提取第三方依賴包

    很多時候有這個需求,編譯源碼的時候無法聯(lián)網(wǎng),需要把源代碼和依賴包一起離線用。 那么怎么把可以聯(lián)網(wǎng)的工程依賴包,下載后提供給無網(wǎng)環(huán)境用呢。war的很多時候是默認提供好的,那么maven打包jar包服務的,assembly.xml 配置需要增加以下內(nèi)容: 再執(zhí)行maven打包就可以了。所

    2024年01月25日
    瀏覽(25)
  • SpringBoot【開發(fā)實用篇】---- 整合第三方技術(shù)(緩存)

    SpringBoot【開發(fā)實用篇】---- 整合第三方技術(shù)(緩存)

    企業(yè)級應用主要作用是信息處理,當需要讀取數(shù)據(jù)時,由于受限于數(shù)據(jù)庫的訪問效率,導致整體系統(tǒng)性能偏低。 應用程序直接與數(shù)據(jù)庫打交道,訪問效率低 為了改善上述現(xiàn)象,開發(fā)者通常會在應用程序與數(shù)據(jù)庫之間建立一種臨時的數(shù)據(jù)存儲機制,該區(qū)域中的數(shù)據(jù)在內(nèi)存中保

    2024年02月05日
    瀏覽(86)
  • uniapp原生插件開發(fā)調(diào)用第三方SDK

    uniapp原生插件開發(fā)調(diào)用第三方SDK

    uniapp安卓官方SDK Android 離線SDK - 正式版 | uni小程序SDK 官方uni原生插件開發(fā)教程(android)網(wǎng)址: 簡介 | uni小程序SDK 第一步,開發(fā)環(huán)境的準備 下載uniapp安卓官方SDK待后面使用,解壓完成如下圖所示。 JAVA環(huán)境 jdk,打開cmd輸入java -version查看自己的jdk版本,官方文檔中提示jdk版本應

    2024年02月15日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包