代码用到的开源工具:

fasterxml.jackson

apche-httpclient

代码位置

https://github.com/luoyuchou/NeteaseServerAPI

赶时间随手写的代码,网易云的API相当多,一般情况下用不完,所以只实现了一部分。

看起来有点复杂,不过好在一个请求一个类,个人看来也还算比较容易扩展。

网易云的公钥和私钥在APIHelper中获取。

main函数在$.java中

public class $ { 
//   @Resource
//  NeteaseNIMUserService service;  
 public static void main(String[] args) {NeteaseNIMUserService service = new NeteaseNIMUserServiceImpl(new APIHelper());ReqUserCreate req = new ReqUserCreate();req.setAccid("hello");req.setToken("hello");ResNIMInfo<ResUserInfo> res = service.createUser(req);if (res.getCode() == ResCode.SUCCESSFUL) {// success}service.createUserAsync(req, new ResultHandler<ResNIMInfo<ResUserInfo>>() {@Overridepublic void handle(int status, ResNIMInfo<ResUserInfo> result) {if (result.getCode() == ResCode.SUCCESSFUL) {// success}}});}
}

适配了Spring,实际使用过程只需要Resource一下就好。由于是服务器到网易云的请求,支持同步和异步两种方式发送请求。

public final class APIHelper {public static final Charset APP_CHARSET = Charset.forName("UTF-8");/*** 需要网易云的公钥和密钥*/private String appKey;private String appSecret;/*** @Constructors APIHelper* * * @Description TODO*/public APIHelper() {appKey = "";appSecret = "";}

使用Apache-HttpClient对请求和结果进行封装

static class HTTP {private static final CloseableHttpClient httpClient;static {httpClient = HttpClients.custom().setConnectionManager(new PoolingHttpClientConnectionManager()).build();}public static <T> void executeAsync(final NeteaseRequest req, final ResultHandler<T> hanlder, final TypeReference<T> typeReference) {/** 这里可以调用AsyncHttpClient 前提是需要加入apache-AsyncHttpClient包*/ThreadPoolScheduler.addTask(new Runnable() {@Overridepublic void run() {CloseableHttpResponse response = execute(req);try {int httpStatus = response.getStatusLine().getStatusCode();String entity = EntityUtils.toString(response.getEntity());// System.out.println(entity);if (hanlder != null) {hanlder.handle(httpStatus);T t = null;if (StringUtils.isNotEmpty(entity) && typeReference != null) {t = APIHelper.JSON.toBean(entity, typeReference);}hanlder.handle(httpStatus, t);}} catch (Exception e) {e.printStackTrace();} finally {if (response != null) {try {response.close();} catch (IOException e) {}}}}});}public static CloseableHttpResponse execute(NeteaseRequest req) {if (req == null) {return null;}HttpPost httpPost = new HttpPost(req.getURL());Map<String, String> headers = req.getHeaders();if (headers != null && headers.size() > 0) {Set<Entry<String, String>> entries = headers.entrySet();for (Entry<String, String> entry : entries) {httpPost.setHeader(entry.getKey(), entry.getValue());}}String contentType = headers.get("Content-Type");if (StringUtils.isNotEmpty(contentType) && contentType.startsWith("application/x-www-form-urlencoded;")) {// 如果是表单提交List<NameValuePair> nvps = new ArrayList<NameValuePair>();// 得到类对象Class<?> userCla = (Class<?>) req.getClass();/** 得到类中的所有属性集合*/Field[] fs = userCla.getDeclaredFields();try {Object val = null;for (int i = 0; i < fs.length; i++) {Field f = fs[i];f.setAccessible(true); // 设置些属性是可以访问的if (!Modifier.isStatic(f.getModifiers())) {val = f.get(req);if (val == null) {val = "";}nvps.add(new BasicNameValuePair(f.getName(), val.toString()));}}httpPost.setEntity(new UrlEncodedFormEntity(nvps, APP_CHARSET));} catch (IllegalArgumentException | IllegalAccessException e) {e.printStackTrace();}} else {// json提交httpPost.setEntity(new StringEntity(JSON.toJson(req), APP_CHARSET));}try {return httpClient.execute(httpPost);} catch (IOException e) {}return null;}}

使用fasterxml jackson对响应结果进行解析

static class JSON {private static final ObjectMapper jacksonMapper = new ObjectMapper();static {jacksonMapper.configure(SerializationFeature.WRITE_NULL_MAP_VALUES, true);jacksonMapper.configure(SerializationFeature.WRITE_EMPTY_JSON_ARRAYS, true);jacksonMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);jacksonMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);jacksonMapper.setSerializationInclusion(Include.NON_NULL);}@SuppressWarnings("unchecked")public static <T> T toBean(String jsonStr, TypeReference<T> typeReference) {try {return jacksonMapper.readValue(jsonStr, typeReference);} catch (IOException e) {try {ParameterizedType type = (ParameterizedType) typeReference.getType();return (T) getClass(type.getRawType()).newInstance();} catch (Exception e1) {return null;}}}private static final String TYPE_NAME_PREFIX = "class ";private static String getClassName(Type type) {if (type == null) {return "";}String className = type.toString();if (className.startsWith(TYPE_NAME_PREFIX)) {className = className.substring(TYPE_NAME_PREFIX.length());}return className;}private static Class<?> getClass(Type type) throws ClassNotFoundException {String className = getClassName(type);if (className == null || className.isEmpty()) {return null;}return Class.forName(className);}public static String toJson(Object obj) {try {return jacksonMapper.writeValueAsString(obj);} catch (JsonProcessingException e) {}return "";}}

话说写完好久都不知道有没有用到什么设计模式,有没有用对什么的。好丢人。有空赶紧再补一遍设计模式去

记录一个网易云IM和直播功能中,服务器API的Java调用代码相关推荐

  1. 手把手教你用Java实现一个“网易云音乐”

    话说前阵子与三枪内衣 推出联名内裤的网易云音乐, 又有热门话题了! 想必大家也已经猜出来 据说是因违反相关规定被下架30天, 在各大安卓应用商店搜索显示 "服务调整"暂不提供下载, ...

  2. Github高星项目!用Python开发的一个网易云音乐

    最近在逛Github发现了一个非常有趣的库musicbox,是用纯Python打造的,收获了8300颗星.Python语言简单易学,好玩有趣,身边越来越多的小伙伴都开始学习Python.她的魅力非常大 ...

  3. 如何创建一个网易云歌单外链

                                  如何创建一个网易云歌单外链 首先打开网易云音乐,打开一个歌单或者自己创建一个歌单 点解生成外链播放器 这里可以选择iframe和flash两 ...

  4. python3GUI--仿做一个网易云音乐By:PyQt5(附下载地址)

    文章目录 一.前言 二.展示 2.1主界面 1.主界面 2.歌单 3.播客 3.最新音乐 4.综合展示(动图) 5.专属定制-音乐雷达 6.专属定制-音乐雷达(动图) 7.专属定制-音乐歌单推荐 2. ...

  5. 由网易云音乐跑步FM功能引申出的一些产品设计思路相关的粗浅看法

    试用了一下网易云音乐新推的跑步FM功能,感觉真的很不错. 无图无真相,先上图. --------------------------------------------------------割--- ...

  6. NetCloud——一个网易云音乐评论抓取和分析的Python库

    在17的四月份,我曾经写了一篇关于网易云音乐爬虫的文章,还写了一篇关于评论数据可视化的文章.在这大半年的时间里,有时会有一些朋友给我发私信询问一些关于代码方面的问题.所以我最近抽空干脆将原来的代码整理 ...

  7. 居然有人撸了一个网易云音乐云村,高手在民间!

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来自:Github精选 今天推荐的这个项目是「netea ...

  8. 用Python写了一个网易云音乐(附源码、视频教程)

    今天给大家分享一个实战项目,用Python整个网易云出来,实现音乐自由!文末附本项目源码以及视频教程! 这一次,咱们来玩点花活,整个网易云出来,实现音乐自由! 环境 Python3.6.8 PyCha ...

  9. 一个人竟然撸了一个网易云音乐云村

    [公众号回复 "1024",免费领取程序员赚钱实操经验] 大家好,我是章鱼猫. 今天推荐的这个项目是「netease-cloud-music-community」,是一个参照网易云 ...

最新文章

  1. cass地籍参数设置快捷命令_南方cass详解+视频教程+插件汇总,小白快速上手!限时领取...
  2. oracle 11g rac asm磁盘组增加硬盘
  3. 深度学习与计算机视觉系列(7)_神经网络数据预处理,正则化与损失函数
  4. 如何在FBL5N中增加所需字段
  5. 【面向工业界】京东NLP落地应用实战
  6. C++语言程序设计第五版 - 郑莉-绪论(一)
  7. Selenium WebDriver的工作原理
  8. mysql语言的特点不包括_SQL语言具有两种使用方式,分别称为交互式SQL和__________...
  9. python算法应用(八)——优化
  10. swift 字符串转int_Swift Tips Streamline 如何假装写过 Swift
  11. 大学计算机导学,大学计算机一级--导学.ppt
  12. 升压和升降压拓扑中IDC与IO的关系推导 // 《精通开关电源设计》P41式2-2
  13. R语言批量下载PubMed摘要
  14. Egret和LayaBox
  15. 京东云VPC对等连接(VPC Peering)
  16. Oracle 18c新特性一览
  17. 区块链数据分析1-如何查询token余额
  18. android studio 模拟器内存不足,Android Studio模拟器的问题及解决办法
  19. SpringBoot如何正确控制bean的加载顺序
  20. 微信系多商户商城完整部署步骤

热门文章

  1. 解决台式机突然卡死的问题
  2. 【实验小技巧】github使用技巧
  3. java语音识别(科大讯飞版)
  4. 《图解TCP/IP》笔记
  5. arduino有关软件卸载,库的卸载问题
  6. 广度优先和深度优先树遍历的时间和空间复杂度是多少?
  7. Effie:B站大佬花费百万打造的写作软件有啥不一样?真香!
  8. C语言函数大全-- i 开头的函数
  9. 浅谈售后服务的备件管理
  10. LoRa Gateway 笔记 3.1.3 帮助程序 util_pkt_logger 进行 LoRa 空口抓包