常用数据库的 API - 开篇
API
API 这个词在大多数人看来可能和 CNS 差不多,前者天天听说就是用不上,后者天天读就是发不了。
不过,通过今天的一个简短介绍,今后 API 这个东西你就用上了,因为在文章最后我将会展示一个最最基础且高频的 API 使用示例。
所谓 API(Application Programming Interface) 就是应用程序接口。这个应用程序可以类比于手机和电脑,这个接口就类似于数据线,如果我们想用数据线把东西在两个设备之前传输,就需要两者可以接受彼此的传输协议。如我们在电子商务中,经常就会用到的电商API即商品详情关键字搜索等封装了商品详情介绍,主图,商品价格,商品SKU数据等API数据接口,以获取商品信息。
对一个应用程序来说,如果你想快速的和它交换数据,也需要采用应用程序可以识别的规则。对于一些成熟的应用程序和网站来说,通常都会提供自己的一套API供开发者友好的使用,一方面可以大大扩展应用程序的生态环境,另一方面也可以避免暴力的爬虫。
我们通过下图的「印象笔记 API」为例,如果你使用过印象笔记(Evernote)的话,会发现大量第三方应用都可以支持绑定印象笔记账户进行各种创建笔记推送笔记等操作。这里不是印象笔记去适配第三方应用,而是它提供了一个完善的 API,可以供其他开发者来使用。
REST API
API 之后还有一个概念是 REST API。 REST(Representational State Transfer) 的中文翻译一般是「表现层状态转化」(这也太抽象了吧),这个架构是 Roy Thomas Fielding 在2000年的毕业论文里提到的,他同时还是HTTP协议(1.0版和1.1版)的主要设计者、Apache服务器软件的作者之一、Apache基金会的第一任主席。
关于究竟什么是「表现层状态转化」这里就跳过了,因为不跳过你也不会看(我也解释不清楚)。只需要了解,符合 REST 设计风格的 Web API 称为 RESTful API,有如下几个要点:
-
资源地址:URI,比如:
http://example.com/resources
。 -
传输的资源:Web服务接受与返回的互联网媒体类型,比如JSON,XML,YAML等。
-
对资源的操作:Web服务在该资源上所支持的一系列请求方法,比如:POST,GET,PUT 或 DELETE。
常用数据库 API
NCBI
NCBI 是啥就不介绍了,如果太多的功能没用过 PubMed 应该怎么也用过。在 NCBI 的开发文档中,有一个部分专门是讲 API 的。
NCBI 提供的 API 如下图所示,如果需要可以去看看。
EMBL-EBI
EMBL-EBI 来自于欧洲,里面有很多很多数据库都是我们日常会使用的,只是你可以还不知道它们和 EBI 有关系的,例如存放了大量基因组及相关数据的 Ensembl ,包括大量蛋白序列和功能信息的数据库 UniPort,当然还有还有不逊色与 pubmed 的文献数据库 Europe PMC。
从个人的使用体验来说,一般能用EBI的时候我就尽量会绕过NCBI,因为整个一系列网站用起来都要更舒服些,文档查起来更顺手些,对一些有进阶需求的开发者会更友好些(如果你有二次开发的需求,经过对比不难理解我的感受)。
目前 EBI 比较知名的几个数据库都有很不错的 RESTful API 支持。
其中 Ensembl 支持 21 个 POST 和 98 个 GET 操作,可以在官方说明中查看;Uniport 数据库 和 Europe PMC 也有大量的操作支持。通过这些 API 你就可以接触到数据库中有的所有信息和 33 million 的文献。另外,EBI 还有一个 QuickGO 的网站也支持 RESTful API 。
他们的 API 完善到直接在 NAR 发了一篇文章。
可用的数据库和工具如下
使用 API
这里以 Ensembl 的一个基础 API 为例对使用方法进行简单的演示。如果我们在 Ensembl 的网站上查看一个基因,会是如下页面。在左侧我圈出来的是和这个基因相关的所有信息,其中99%的信息都可以通过 API 获取到。
查看单基因信息
这里以最基础的单基因信息查询作为示例。Ensembl 的 RUSTful API 支持使用各种语言实现,既可以在 Unix 操作系统中使用 curl 和 wget 命令,也可以使用 python java perl 和 R 语言来操作。
如果要是用 wget 来查询一个基因的话,查询规则示例是http://rest.ensembl.org/lookup/id/AT4G34410?expand=1'
。其实这就是一个简单的我们都能理解的「网址」,其中 id 后面是我们要查询的基因id,问号后面可以添加任意支持的参数。另外,还需要 header 信息'Content-type:application/json'
来指定获取的资源类型。
运行命令如下:
wget -q --header='Content-type:application/json' \
'http://rest.ensembl.org/lookup/id/AT4G34410?expand=1' -O -
得到的内容会是一行 json 内容,这个信息大家看到都是崩溃的我就不直接放上来了。我们可以使用一些命令和操作稍微进行美化。
wget -q --header='Content-type:application/json' \
'http://rest.ensembl.org/lookup/id/AT4G34410?expand=1' -O - | jq '.' -
通过 jq 这个命令,可以让输出变成标准的 json 格式。输出截图如下:
为了更方面的处理 json 内容和进行后一步的分析,我们可以移步到 R 中,看看如何使用。
要在 R 使用 RUSTful API 并进行后续的 json 文件处理,首先需要加载两个包,httr
用来调取 GET 和 POST 等命令,jsonlite
用来处理 json 格式的文件。
httr 会把 GET 的结果保存为一个 response 类型的对象,其中包括了 url,状态码以及header等各种各样的信息,jsonlite 可以帮助我们根据需求提取 json 里的内容并输出为 list 对象。
简单的运行命令如下:
# 加载 R 包
library(httr)
library(jsonlite)
# 指定 server
server <- "http://rest.ensembl.org"
# 指定查询内容,为了方便展示这里 expand=0
ext <- "/lookup/id/ENSG00000157764?expand=0"
# 使用 httr 包的 GET 进行查询
r <- GET(paste(server, ext, sep = ""), content_type("application/json"))
# 这里的 r 是一个response类型的对象。
# 将http错误转换为R错误方便debug
stop_for_status(r)
到这里其实查询的步骤已经完成,对象 r 的结构如下:
接下来就是首先把这个对象中的内容转换为json然后在转换为table即可,命令非常简单。
list <- fromJSON(toJSON(content(r)))
tb <- do.call(rbind,list)
得到的table内容如下
如果需要稍微优雅一些,可以改写为一个函数,如果需要一次查找多个基因,可以使用 POST 方法。
你可能会好奇使用 API 的优势在哪里。
如果只是查找一个基因,API 的优势并不明显,如果只是偶尔查找几个基因,API 的优势也不明显。
那怎么使用就有优势了呢,类比于「印象笔记」以及和它相关的使用了「印象笔记 API」的第三方应用,不知道会不会给你一些启发。
话不能说的太透,点到为止,更多的应用场景我们以后有机会再聊。
相关文章:

常用数据库的 API - 开篇
API API 这个词在大多数人看来可能和 CNS 差不多,前者天天听说就是用不上,后者天天读就是发不了。 不过,通过今天的一个简短介绍,今后 API 这个东西你就用上了,因为在文章最后我将会展示一个最最基础且高频的 API 使…...

C++之生成详细汇编代码(二百一十六)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…...

AIGC|当一个程序员学会用AI来辅助编程实践
一、辅助编程 作为主要以 JAVA 语言为核心的后端开发者,其实,早些时间我也用过比如 Codota、Tabnine、Github 的 Copilot、阿里的 AI Coding Assistant 等 IDEA 插件,但是我并没有觉得很惊奇,感觉就是生成一些代码片段罢了&#x…...

9.14号作业
仿照vector手动实现自己的myVector,最主要实现二倍扩容功能 有些功能,不会 #include <iostream>using namespace std; //创建vector类 class Vector { private:int *data;int size;int capacity; public://无参构造Vector(){}//拷贝构造Vector(c…...
【面试题】C/C++ 中指针和引用的区别
指针是一个独立的对象,它可以指向不同的变量或对象,可以重新赋值给其他变量。而引用是已存在的变量的别名,它必须在定义时初始化,并且不能重新绑定到另一个变量。指针可以是空指针(nullptr),它不…...

spring boot 整合多数据源
多数据源产生的场景 一般情况下,不会有多数据源这样的场景出现,但老项目或者特殊需求的项目,可能会有这样的场景 同一个应用需要访问两个数据库不用数据库中间件的读写分离 注入数据源选择的时机 声明两个数据源实例,在getConnect…...

数据集成:数据挖掘的准备工作之一
⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ 🐴作者:秋无之地 🐴简介:CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作,主要擅长领域有:爬虫、后端、大数据…...

xml配置文件密码特殊字符处理
错误姿势: 正确姿势:采取转义符的方式 常用转义符:...

遥感数据与作物模型同化
基于过程的作物生长模拟模型DSSAT是现代农业系统研究的有力工具,可以定量描述作物生长发育和产量形成过程及其与气候因子、土壤环境、品种类型和技术措施之间的关系,为不同条件下作物生长发育及产量预测、栽培管理、环境评价以及未来气候变化评估等提供了…...

UI库DHTMLX Suite v8.2发布全新表单组件,让Web表单实现高度可定制!
DHTMLX Suite v8.2日前已正式发布,此版本的核心是DHTMLX Form,这个小部件接收了4个备受期待的新控件,如Fieldset、Avatar、Toggle和ToggleGroup。官方技术团队还为Grid和TreeGrid小部件中的页眉/页脚工具提示提供了一系列新的配置选项等。 在…...

河北省图书馆典藏《乡村振兴振兴战略下传统村落文化旅游设计》许少辉八一新著
河北省图书馆典藏《乡村振兴振兴战略下传统村落文化旅游设计》许少辉八一新著...
什么是卷积002
文章目录 前言1.卷积网络和传统网络区别2.卷积神经网络整体架构1.输入层2. 卷积层3.池化层4.全连接层 5.神经网络6.经典网络1.Alexnet2. Vgg3.Resnet 残差网络-特征提取 7.感受野 前言 大纲目录 首先链接图像颜色通道 1.卷积网络和传统网络区别 右边的就是CNN,卷…...

黑马JVM总结(八)
(1)StringTable面试题 1.8 1.6时 (2)StringTable的位置 jvm1.6时StringTable是常量池的一部分,它随着常量池存储在永久代当中,在1.7、1.8中从永久代变成了堆中,为什么做这个更改呢?…...

开源网安入选广东省网络空间安全标准化技术委员会新技术及应用安全技术工作组成员单位
近日,第二届广东省网络空间安全标准化技术委员会(GD/TC 124)(以下简称省网安标委)正式成立。为进一步发挥省网安标委在支撑网络强国建设、推进网络安全产业高质量发展过程中,示范引领核心技术攻关、创新产品…...

Nginx配置指南:如何定位、解读与优化Linux上的Nginx设置
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🐅🐾猫头虎建议程序员必备技术栈一览表📖: 🛠️ 全栈技术 Full Stack: 📚…...

辉瑞与吉利德科学:制药巨头的新冠病毒之战
来源:猛兽财经 作者:猛兽财经 总结: (1)猛兽财经认为,华尔街低估了辉瑞(PFE)和吉利德科学(GILD)的前景,因为它们在开发新冠病毒疫苗和药物方面都…...

x86架构基础汇编知识
通用寄存器 EAX 32位 函数返回值 AX 低16位 AH 高八位 AL 低八位 EBX 32位 ECX 32位 循环次数,this指针 EDX 32位 EBP 32位 栈底寄存器 ESP 32位 栈顶寄存器 ESI 源索引寄存器 EDI 目标索引寄存器 EIP 无法直接通过汇编操作 例子 mov al,0xff …...
ThreadLocal的原理
ThreadLocal是Java中的一个类,它提供了线程本地变量的功能。每个线程都可以独立地访问自己的ThreadLocal变量,并且不会受到其他线程的干扰。 public class ThreadLocal<T> { ThreadLocal的原理是通过使用一个ThreadLocalMap来存储每个线程的变量副…...

Chrome 108版(64-bit 108.0.5359.125)网盘下载
还在用Selenium的朋友们注意了,目前Chrome的最新版是116,而官方的Chromedriver只支持到115版。 可惜Google不提供旧版Chrome的下载方式,需要旧版的很难回去了。如果真的想要旧版的Chrome,只能民间自救。 我在2022年12月备份了C盘…...

Mars3d插件参考开发教程并在相关页面引入
问题场景: 1.在使用Mars3d热力图功能时,提示mars3d.layer.HeatLayer is not a constructor 问题原因: 1.mars3d的热力图插件mars3d-heatmap没有安装引用。 解决方案: 1.参考开发教程,找到相关的插件库:Mars3D 三维…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...

SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...

网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...

回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...