说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

RESTful API 设计最佳实践

HTML文档下载 WORD文档下载 PDF文档下载
目前互联网上充斥着大量的关于RESTful API(为了方便,以后API和RESTful API 一个意思)如何设计的文章,然而却没有一个”万能“的设计标准:如何鉴权?API格式如何?你的API是否应该加入版本信息?

背景

目前互联网上充斥着大量的关于RESTful API(为了方便,以后API和RESTful API 一个意思)如何设计的文章,然而却没有一个”万能“的设计标准:如何鉴权?API格式如何?你的API是否应该加入版本信息?当你开始写一个app的时候,特别是后端模型部分已经写完的时候,你不得不殚精竭虑的设计和实现自己app的public API部分。因为一旦发布,对外发布的API将会很难改变。

在给SupportedFu设计API的时候,我试图以实用的角度来解决上面提到的问题。我希望可以设计出容易使用,容易部署,并且足够灵活的API,本文因此而生。

API设计的基本要求

网上的很多关于API设计的观点都十分”学院派“,它们也许更有理论基础,但是有时却和现实世界脱轨(因此我是自由派)。所以我这篇文章的目标是从实践的角度出发,给出当前网络应用的API设计最佳实践(当然,是我认为的最佳了~),如果觉得不合适,我不会遵从标准。当然作为设计的基础,几个必须的原则还是要遵守的:

  1. 当标准合理的时候遵守标准。
  2. API应该对程序员友好,并且在浏览器地址栏容易输入。
  3. API应该简单,直观,容易使用的同时优雅。
  4. API应该具有足够的灵活性来支持上层ui。
  5. API设计权衡上述几个原则。

需要强调的是:API的就是程序员的UI,和其他UI一样,你必须仔细考虑它的用户体验!

使用RESTful URLs 和action.

虽然前面我说没有一个万能的API设计标准。但确实有一个被普遍承认和遵守:RESTfu设计原则。它被Roy Felding提出(在他的”基于网络的软件架构“论文中第五章)。而REST的核心原则是将你的API拆分为逻辑上的资源。这些资源通过http被操作(GET ,POST,PUT,DELETE)。

那么我应该如何拆分出这些资源呢?

显然从API用户的角度来看,”资源“应该是个名词。即使你的内部数据模型和资源已经有了很好的对应,API设计的时候你仍然不需要把它们一对一的都暴露出来。这里的关键是隐藏内部资源,暴露必需的外部资源。

在SupportFu里,资源是 ticket、user、group。

一旦定义好了要暴露的资源,你可以定义资源上允许的操作,以及这些操作和你的API的对应关系:

  • GET /tickets # 获取ticket列表
  • GET /tickets/12 # 查看某个具体的ticket
  • POST /tickets # 新建一个ticket
  • PUT /tickets/12 # 更新ticket 12.
  • DELETE /tickets/12 #删除ticekt 12

可以看出使用REST的好处在于可以充分利用http的强大实现对资源的CURD功能。而这里你只需要一个endpoint:/tickets,再没有其他什么命名规则和url规则了,cool!

这个endpoint的单数复数

一个可以遵从的规则是:虽然看起来使用复数来描述某一个资源实例看起来别扭,但是统一所有的endpoint,使用复数使得你的URL更加规整。这让API使用者更加容易理解,对开发者来说也更容易实现。

如何处理关联?关于如何处理资源之间的管理REST原则也有相关的描述:

  • GET /tickets/12/messages- Retrieves list of messages for ticket #12
  • GET /tickets/12/messages/5- Retrieves message #5 for ticket #12
  • POST /tickets/12/messages- Creates a new message in ticket #12
  • PUT /tickets/12/messages/5- Updates message #5 for ticket #12
  • PATCH /tickets/12/messages/5- Partially updates message #5 for ticket #12
  • DELETE /tickets/12/messages/5- Deletes message #5 for ticket #12

其中,如果这种关联和资源独立,那么我们可以在资源的输出表示中保存相应资源的endpoint。然后API的使用者就可以通过点击链接找到相关的资源。如果关联和资源联系紧密。资源的输出表示就应该直接保存相应资源信息。(例如这里如果message资源是独立存在的,那么上面 GET /tickets/12/messages就会返回相应message的链接;相反的如果message不独立存在,他和ticket依附存在,则上面的API调用返回直接返回message信息)

不符合CURD的操作

对这个令人困惑的问题,下面是一些解决方法:

  1. 重构你的行为action。当你的行为不需要参数的时候,你可以把active对应到activated这个资源,(更新使用patch).
  2. 以子资源对待。例如:GitHub上,对一个gists加星操作:PUT /gists/:id/star 并且取消星操作:DELETE /gists/:id/star.
  3. 有时候action实在没有难以和某个资源对应上例如search。那就这么办吧。我认为API的使用者对于/search这种url也不会有太大意见的(毕竟他很容易理解)。只要注意在文档中写清楚就可以了。

永远使用SSL

毫无例外,永远都要使用SSL。你的应用不知道要被谁,以及什么情况访问。有些是安全的,有些不是。使用SSL可以减少鉴权的成本:你只需要一个简单的令牌(token)就可以鉴权了,而不是每次让用户对每次请求签名。

值得注意的是:不要让非SSL的url访问重定向到SSL的url。

文档

文档和API本身一样重要。文档应该容易找到,并且公开(把它们藏到pdf里面或者存到需要登录的地方都不太好)。文档应该有展示请求和输出的例子:或者以点击链接的方式或者通过curl的方式(请见openstack的文档)。如果有更新(特别是公开的API),应该及时更新文档。文档中应该有关于何时弃用某个API的时间表以及详情。使用邮件列表或者博客记录是好方法。

版本化

在API上加入版本信息可以有效的防止用户访问已经更新了的API,同时也能让不同主要版本之间平稳过渡。关于是否将版本信息放入url还是放入请求头有过争论:API version should be included in the URL or in a header. 学术界说它应该放到header里面去,但是如果放到url里面我们就可以跨版本的访问资源了。。(参考openstack)。

strip使用的方法就很好:它的url里面有主版本信息,同时请求头俩面有子版本信息。这样在子版本变化过程中url的稳定的。变化有时是不可避免的,关键是如何管理变化。完整的文档和合理的时间表都会使得API使用者使用的更加轻松。

结果过滤,排序,搜索:

url最好越简短越好,和结果过滤,排序,搜索相关的功能都应该通过参数实现(并且也很容易实现)。

过滤:为所有提供过滤功能的接口提供统一的参数。例如:你想限制get /tickets 的返回结果:只返回那些open状态的ticket–get /tickektsstate=open这里的state就是过滤参数。

排序:和过滤一样,一个好的排序参数应该能够描述排序规则,而不业务相关。复杂的排序规则应该通过组合实现:

  • GET /ticketssort=-priority- Retrieves a list of tickets in descending order of priority
  • GET /ticketssort=-priority,created_at- Retrieves a list of tickets in descending order of priority. Within a specific priority, older tickets are ordered first

这里第二条查询中,排序规则有多个rule以逗号间隔组合而成。

搜索:有些时候简单的排序是不够的。我们可以使用搜索技术(ElasticSearch和Lucene)来实现(依旧可以作为url的参数)。

  • GET /ticketsq=return&state=open&sort=-priority,created_at- Retrieve the highest priority open tickets mentioning the word ‘return’

对于经常使用的搜索查询,我们可以为他们设立别名,这样会让API更加优雅。例如:
get /ticketsq=recently_closed -> get /tickets/recently_closed.

限制API返回值的域

有时候API使用者不需要所有的结果,在进行横向限制的时候(例如值返回API结果的前十项)还应该可以进行纵向限制。并且这个功能能有效的提高网络带宽使用率和速度。可以使用fields查询参数来限制返回的域例如:
GET /ticketsfields=id,subject,customer_name,updated_at&state=open&sort=-updated_at

更新和创建操作应该返回资源

PUT、POST、PATCH 操作在对资源进行操作的时候常常有一些副作用:例如created_at,updated_at 时间戳。为了防止用户多次的API调用(为了进行此次的更新操作),我们应该会返回更新的资源(updated representation.)例如:在POST操作以后,返回201 created 状态码,并且包含一个指向新资源的url作为返回头

是否需要 “HATEOAS

网上关于是否允许用户创建新的url有很大的异议(注意不是创建资源产生的url)。为此REST制定了HATEOAS来描述了和endpoint进行交互的时候,行为应该在资源的metadata返回值里面进行定义。

(译注:作者这里认为HATEOAS还不算成熟,我也不怎么理解这段就算了,读者感兴趣可以自己去原文查看)

只提供json作为返回格式

现在开始比较一下XML和json了。XML即冗长,难以阅读,又不适合各种编程语言解析。当然XML有扩展性的优势,但是如果你只是将它来对内部资源串行化,那么他的扩展优势也发挥不出来。很多应用(youtube,twitter,box)都已经开始抛弃XML了,我也不想多费口舌。给了google上的趋势图吧:

当然如果的你使用用户里面企业用户居多,那么可能需要支持XML。如果是这样的话你还有另外一个问题:你的http请求中的media类型是应该和accept 头同步还是和url?为了方便(browser explorability),应该是在url中(用户只要自己拼url就好了)。如果这样的话最好的方法是使用.xml或者.json的后缀。

命名方式?

是蛇形命令(下划线和小写)还是驼峰命名?如果使用json那么最好的应该是遵守JAVASCRIPT的命名方法-也就是说骆驼命名法。如果你正在使用多种语言写一个库,那么最好按照那些语言所推荐的,java,c#使用骆驼,python,ruby使用snake。

个人意见:我总觉得蛇形命令更好使一些,当然这没有什么理论的依据。有人说蛇形命名读起来更快,能达到20%,也不知道真假http://ieeexplore.ieee.org/xpl/articleDetails.jsptp=&arnumber=5521745

默认使用pretty print格式,使用gzip

只是使用空格的返回结果从浏览器上看总是觉得很恶心(一大坨有没有?~)。当然你可以提供url上的参数来控制使用“pretty print”,但是默认开启这个选项还是更加友好。格外的传输上的损失不会太大。相反你如果忘了使用gzip那么传输效率将会大大减少,损失大大增加。想象一个用户正在debug那么默认的输出就是可读的-而不用将结果拷贝到其他什么软件中在格式化-是想起来就很爽的事,不是么?

下面是一个例子:

$ curl https://API.github.com/users/veesahni > with-whitespace.txt$ ruby -r json -e 'puts JSON JSON.parse(STDIN.read)' < with-whitespace.txt > without-whitespace.txt$ gzip -c with-whitespace.txt > with-whitespace.txt.gz$ gzip -c without-whitespace.txt > without-whitespace.txt.gz

输出如下:

  • without-whitespace.txt- 1252 bytes
  • with-whitespace.txt- 1369 bytes
  • without-whitespace.txt.gz- 496 bytes
  • with-whitespace.txt.gz- 509 bytes

在上面的例子中,多余的空格使得结果大小多出了8.5%(没有使用gzip),相反只多出了2.6%。据说:twitter使用gzip之后它的streaming API传输减少了80%(link:https://dev.twitter.com/blog/announcing-gzip-compression-streaming-APIs).

只在需要的时候使用“envelope”

很多API象下面这样返回结果:

{  "data" : {    "id" : 123,    "name" : "John"  }}

理由很简单:这样做可以很容易扩展返回结果,你可以加入一些分页信息,一些数据的元信息等-这对于那些不容易访问到返回头的API使用者来说确实有用,但是随着“标准”的发展(cors和http://tools.ietf.org/html/rfc5988#page-6都开始被加入到标准中了),我个人推荐不要那么做。

何时使用envelope?

有两种情况是应该使用envelope的。如果API使用者确实无法访问返回头,或者API需要支持交叉域请求(通过jsonp)。
jsonp请求在请求的url中包含了一个callback函数参数。如果给出了这个参数,那么API应该返回200,并且把真正的状态码放到返回值里面(包装在信封里),例如:

callback_function({  status_code: 200,  next_page: "https://..",  response: {    ... actual JSON response body ...   }})

同样为了支持无法方法返回头的API使用者,可以允许envelope=true这样的参数。

在post,put,patch上使用json作为输入

如果你认同我上面说的,那么你应该决定使用json作为所有的API输出格式,那么我们接下来考虑考虑API的输入数据格式。
很多的API使用url编码格式:就像是url查询参数的格式一样:单纯的键值对。这种方法简单有效,但是也有自己的问题:它没有数据类型的概念。这使得程序不得不根据字符串解析出布尔和整数,而且还没有层次结构–虽然有一些关于层次结构信息的约定存在可是和本身就支持层次结构的json比较一下还是不很好用。

当然如果API本身就很简单,那么使用url格式的输入没什么问题。但对于复杂的API你应该使用json。或者干脆统一使用json。
注意使用json传输的时候,要求请求头里面加入:Content-Type:applicatin/json.否则抛出415异常(unsupported media type)。

分页

分页数据可以放到“信封”里面,但随着标准的改进,现在我推荐将分页信息放到link header里面:http://tools.ietf.org/html/rfc5988#page-6。

使用link header的API应该返回一系列组合好了的url而不是让用户自己再去拼。这点在基于游标的分页中尤为重要。例如下面,来自github的文档

Link: <https://api.github.com/user/repos?page=3&per_page=100>; rel="next", <https://api.github.com/user/repos?page=50&per_page=100>; rel="last"

自动加载相关的资源

很多时候,自动加载相关资源非常有用,可以很大的提高效率。但是这却和RESTful的原则相背。为了如此,我们可以在url中添加参数:embed(或者expend)。embed可以是一个逗号分隔的串,例如:

GET /ticket/12embed=customer.name,assigned_user

对应的API返回值如下:

{  "id" : 12,  "subject" : "I have a question!",  "summary" : "Hi, ....",  "customer" : {    "name" : "Bob"  },  assigned_user: {   "id" : 42,   "name" : "Jim",  }}

值得提醒的是,这个功能有时候会很复杂,并且可能导致N+1 SELECT 问题。

重写HTTP方法

有的客户端只能发出简单的GET 和POST请求。为了照顾他们,我们可以重写HTTP请求。这里没有什么标准,但是一个普遍的方式是接受X-HTTP-Method-Override请求头。

速度限制

为了避免请求泛滥,给API设置速度限制很重要。为此 RFC 6585 引入了HTTP状态码429(too many requests)。加入速度设置之后,应该提示用户,至于如何提示标准上没有说明,不过流行的方法是使用HTTP的返回头。

下面是几个必须的返回头(依照twitter的命名规则):

  • X-Rate-Limit-Limit :当前时间段允许的并发请求数
  • X-Rate-Limit-Remaining:当前时间段保留的请求数。
  • X-Rate-Limit-Reset:当前时间段剩余秒数

为什么使用当前时间段剩余秒数而不是时间戳?

时间戳保存的信息很多,但是也包含了很多不必要的信息,用户只需要知道还剩几秒就可以再发请求了这样也避免了clock skew问题。

有些API使用UNIX格式时间戳,我建议不要那么干。为什么?HTTP 已经规定了使用 RFC 1123 时间格式

鉴权 Authentication

restful API是无状态的也就是说用户请求的鉴权和cookie以及session无关,每一次请求都应该包含鉴权证明。

通过使用ssl我们可以不用每次都提供用户名和密码:我们可以给用户返回一个随机产生的token。这样可以极大的方便使用浏览器访问API的用户。这种方法适用于用户可以首先通过一次用户名-密码的验证并得到token,并且可以拷贝返回的token到以后的请求中。如果不方便,可以使用OAuth 2来进行token的安全传输。

支持jsonp的API需要额外的鉴权方法,因为jsonp请求无法发送普通的credential。这种情况下可以在查询url中添加参数:access_token。注意使用url参数的问题是:目前大部分的网络服务器都会讲query参数保存到服务器日志中,这可能会成为大的安全风险。

注意上面说到的只是三种传输token的方法,实际传输的token可能是一样的。

缓存

HTTP提供了自带的缓存框架。你需要做的是在返回的时候加入一些返回头信息,在接受输入的时候加入输入验证。基本两种方法:

ETag:当生成请求的时候,在HTTP头里面加入ETag,其中包含请求的校验和和哈希值,这个值和在输入变化的时候也应该变化。如果输入的HTTP请求包含IF-NONE-MATCH头以及一个ETag值,那么API应该返回304 not modified状态码,而不是常规的输出结果。

Last-Modified:和etag一样,只是多了一个时间戳。返回头里的Last-Modified:包含了 RFC 1123 时间戳,它和IF-MODIFIED-SINCE一致。HTTP规范里面有三种date格式,服务器应该都能处理。

出错处理

就像html错误页面能够显示错误信息一样,API 也应该能返回可读的错误信息–它应该和一般的资源格式一致。API应该始终返回相应的状态码,以反映服务器或者请求的状态。API的错误码可以分为两部分,400系列和500系列,400系列表明客户端错误:如错误的请求格式等。500系列表示服务器错误。API应该至少将所有的400系列的错误以json形式返回。如果可能500系列的错误也应该如此。json格式的错误应该包含以下信息:一个有用的错误信息,一个唯一的错误码,以及任何可能的详细错误描述。如下:

{  "code" : 1234,  "message" : "Something bad happened <img src="http://blog.jobbole.com/wp-includes/images/smilies/icon_sad.gif" alt=":-(" class="wp-smiley"> ",  "description" : "More details about the error here"}

对PUT,POST,PATCH的输入的校验也应该返回相应的错误信息,例如:

{  "code" : 1024,  "message" : "Validation Failed",  "errors" : [    {      "code" : 5432,      "field" : "first_name",      "message" : "First name cannot have fancy characters"    },    {       "code" : 5622,       "field" : "password",       "message" : "Password cannot be blank"    }  ]}

HTTP 状态码

200 ok  - 成功返回状态,对应,GET,PUT,PATCH,DELETE. 201 created  - 成功创建。 304 not modified   - HTTP缓存有效。 400 bad request   - 请求格式错误。 401 unauthorized   - 未授权。 403 forbidden   - 鉴权成功,但是该用户没有权限。 404 not found - 请求的资源不存在 405 method not allowed - 该http方法不被允许。 410 gone - 这个url对应的资源现在不可用。 415 unsupported media type - 请求类型错误。 422 unprocessable entity - 校验错误时用。 429 too many request - 请求过多。
来自:伯乐在线

Evernote更新Android SDK:新增商务服务并拆分“印象笔记” 主流编译器对C++11的支持现状比较 GCC 4.8发布,提升对C++11的支持 英国政府下令首选开源软件 为何美国IaaS收购被引爆?基于IaaS的四个误解和四个猜想 Kinect SDK v1.7迎来重大更新 如何激励同事编写单元测试? 谷歌GCE vs. 亚马逊EC2:快源于谷歌本有的底蕴 不要责怪开源技术 它是无辜的 短命:微软将于2014年停止对WP8系统支持 Native和Web过时了,企业级移动开发流行用Hybrid App 与EverNote竞争?谷歌Google Keep浮出水面 又一次跨越:著名3D游戏引擎Unity版本更新 Feedly团队:自研后端平台或将开源 StackMob的诱惑:16小时,山寨一款移动App “云”筹帷幄 开发者必知的5大SaaS在线服务工具 超350个政府项目托管在GitHub 政府开源会成主流? Kinect for Windows SDK 1.7正式发布,支持3D建模 SafeNet与风河系统联手推出VxWorks嵌入式系统软件货币化方案 Windows Server 2012中的动态负载均衡 Google等互联网公司将成为创新中心? 在Hadoop的战争中 MapR获新一轮3000万美元融资 初创公司DNNresearch:谷歌科技帝国的新“基石” 创业了,我们该如何起名? 乐视网联手富士康推新盒子C1S “0+290元”新浪微博发售 吸引开发者:只要开发新应用 微软便奖100美元 PaintCode - 将矢量图转化为Objective-C代码的开发神器 苹果发布iOS 6.1.3 封杀evasi0n越狱所用漏洞 [API快讯] Google开放实时协作API 58同城开源轻量级Java Web框架 Argo 初创公司AppNeta:4轮融资,4780万美元 软件发布:美萍安全卫士密码破解器 软件发布:整人蛀虫 SQL SERVER存储过程的问题!!!! 软件发布:词痴 软件发布:自动关机 软件发布:南易彩票选号系统 pfc基类庫是纯英字,谁有中文的。 软件发布:精灵英文输入法(写代码助手) 软件发布:QQSpy密码探测器98版 for 0425 高手请,为何在不同地方打开对话框会有不同的结果呢? 软件发布:《商务导航》 软件发布:amp player 豪华版 如何关闭XCOPY打开的窗口,详细一点 请援手:pfc程序如何再升级?(关于版本更新) 谁是高手,一个事务处理问题。 大家来聊聊:JBUILDER5比JUILDER4在那方面改进了!? 我们这个破烂小公司成天TMD瞎折腾! 根据用户名和密码登陆的问题! 大家来说一下,中程和高程证书在找工作时作用怎样 Dialog上放了一个group box,请问如何动态改变group box框框中的整个颜色?急呀! 用程序向表中插数据的问题? 怎样制作一个类似日历的控件?快快快! 做个调查:在上海delphi的前景如何?现在工资怎么样? 如何给graph控件的values赋值. c++Builder的悲哀历程,求助帮忙,各位大虾多指点 建议封杀e_lion,影响看贴情绪!杀无赦!!! 请教高手:我用vc6.0向导生成了一个Utility Project,不想用MFC AppWizard(exe)生成的基本类,可我无法编译我写的cpp(带winMain函数)文件,为何? 无任何理由,第一个进来者300分。当场结帐。 各位,是如何调试自己编写的servlet的,我使用jswdk每次,修改servlet后都要重启一次服务器,有没有什么好法子。 不看不知道。 在写servlet时,如果要输出一段文字的问题。 “瑞星2001病毒实时间控装载失败”? 既然看到了,不妨进来“坐坐”! (关于串口) 看看我的计划《程序员生活》, 数据库小问题 有谁用过Delphi6带的InstallShield Express - Borland Limited 请赐教:我只想建一个空工程,里面什么类也没有,只望往加我写的类(带winMain 函数),编译成exe文件,用vc6.0,怎么做呀 硬盘喀-啦,喀-啦连续的响是何原因 你们好,能告诉多表更新的时候UPDATE(true,false)中的true,false是什么意思吗? (菜菜鸟级问题)怎么给别人分数?自己的分数又是怎样积累的? 算法问题求解 怎样去看继承下来的方法的代码? 原来大把花钱的感觉真是爽!还是没有任何理由,第7个进来者300分! 我买了一张D片winnt4.0.6, 不知怎么安装。我用winnt /ox作了三张启动盘,但到最后要求我插入光盘,可是回车后最反映,能不能不用启动盘,首先说明这张D版盘可用。请大家快帮帮我@_@ 如何把我的照片拿下来? 请问在哪里可以下载ActiveReports控件的正式版,最好是中文版的。我下载成功了以后一定给分。一定多给!!! 何必呢!何苦呢!我就一天没来,发生了这么多事,虽然我还没有确切知道是怎么回事,但是大家都是朋友。怕的就是……唉!一声叹息! 谁知道哪里有JAVA编程思想的PDF格式电子书下载? 将位图保存为文件 大侠们,快说呀!! 终于大学毕业了,前途茫茫,哎~~~~~~~~ 用方程解(1)某校参加语文竞赛的人数是参加数学竞赛人数的八分之七,语文竞赛获奖人数是获奖总人数的五分之二,而两项竞赛没有获奖的人数各是640人,那么参加这两项竞赛的总人数是多少 小学六年级的数学题第一单元圆的认识一练习题? 找等量关系,列方程,解应用题 1.艳艳有2元和5元的人民币共2张,刚好是64元,艳艳有2元和5元的人民币各多少张?2.现有只数相同的鸡、兔共居一笼,已知兔腿比鸡腿多22条,笼子中鸡、兔一共有多少只?不好意思 艳艳有2元和5元的 六年级上册数学题有关圆的问题 数学鸡兔同笼应用题(列方程){一元一次的}仅有共买鸡,人出九,盈11;人出6不足16,问人数、鸡价几何? 有两架书共360本,如果从第一架取出1/4放入第二架,则第二架比第一架多2/9,求两架书原来各有多少本? 我希望给我一套综合的五上数学【练习卷】,不用单元的卷子,弄几份份综合练习题,希望能多给我几套卷子, 三道数学应用题.(关于鸡兔同笼的.)别用方程解啊,1.一棵松树上有百灵鸟和松鼠,松鼠比百灵鸟多3只,它们一共有48条腿.百灵鸟和松鼠各有多少只2.妈妈对乐乐说:“我上学的时候,文具都比 两只乌龟母子对话,妈妈说:“我像你现在这么大时,你才一岁”,孩子说:“妈妈,我到你现在这么大时,你就34岁了“.请列方程求解,小乌龟和妈妈现在各多少岁. 如果下图中每个小正方形的面积都是4平方厘米,图中阴影部分是?面积 请问鸡兔同笼应用题 方程解(2元)越完整越好 两遍都有x的方程怎么解, 求五年级上册数学练习题 数学鸡兔同笼应用题(1)在植树节活动中,有100名师生参加植树,老师每人栽3棵,学生两人栽一棵,一共植树100棵.请问:参加植树的学生有多少人?(2)大油瓶一瓶装4kg,小油瓶一瓶装0.5kg.现有100 鸡兔同笼类似的问题,但要方程解.蜘蛛有8条腿,蜻蜓有6条腿和2对翅膀.蝉有6条腿和1对翅膀.现在这三种小虫共18只,有118条腿和20对翅膀,每种小虫各几只? 五年级上册数学73页的思考题 求几道列方程解应用题请标好每题题号和过程,最快的设为满意答案,麻烦了1:甲每小时走5千米,出发两小时后乙骑车追甲(1)如乙的速度为每小时20千米,问乙多少分钟追上甲?(2)如果要求 关于鸡兔同笼的题和答案方程必须是方程@# 五年级上册数学书练习五年级上册数学书练习二十七第三题 答案 列方程解应用题1.A、B两地相距528千米,两列火车同时从两地相向开出,3小时后两车相遇.甲车的速度是乙车的1.2倍.两列火车的速度各是多少?2.甲乙两地相距450千米,一列快车从甲地开出2小时后, 鸡兔同笼,共有32个头,74条腿,鸡有()兔有()只 鸡兔同笼类型题方程解法农用车展销大厅里有三轮车、四轮车共38辆,他们的车轮总数是134个.两种车各有多少辆?不会啊,用方程,说明白,有解设. 数学五年级上册同步练习第三页第五题一个长方形,长:16厘米宽:宽是长的十分之七求长方形的面积. 鸡兔同笼,共10个头,26条腿,请问有几只鸡?几只兔?急 谁能帮我找到30道小学五年级上册的应用题,解方程和求面积(长方形,正方形,平行四边形)的题(要带答案30道小学五年级上册的应用题,解方程和求面积(长方形,正方形,平行四边形)的题( 甲每分钟走50米,乙每分钟走60米,丙每分钟走70米,甲乙两人从A地,丙从B地同时出发相向而行,丙先遇到乙,经过2分钟后再遇到甲.A、B两地相距多少米?还有两题,请各位帮个忙,1.A、B两地相距21千米 鸡兔同笼,共有10个头,32条腿,鸡、兔各有多少只?列表法 谁有相遇问题的应用题 一个两位数,其个位数与十位数之和为13,如果把个位数与十位数对调,新数比原来的数小9,求原来的两位数. 数学的鸡兔同笼怎么用方程计算?在没有“鸡比兔多……只”、“兔比鸡多……只”的情况下,该怎么用方程计算?例如:有鸡和兔共100只,共有280条腿,鸡有几只?这题就没有上面说的情况,怎么用 求解一道应用题.一个平行四边形和一个梯形的面积相等.平行四边形的底和高分别是12厘米和8厘米,梯形的中一个平行四边形和一个梯形的面积相等.平行四边形的底和高分别是12厘米和8厘米, 六(2)班有学生76人,其中13名女生与男生的一半参加数学竞赛,剩下的男生女生人数相等,这个班的男生比女生多多少人? 鸡兔同笼【用方程计算】现有数量相同的鸡兔同笼,已知兔脚比鸡脚多28只.问:笼子中的鸡和兔子各有多少只?还要等量关系式。 我找不到题了 大宝、二宝、小宝三兄的年龄之和是45岁,大宝的年龄是二宝的3倍,小宝的年龄是二宝的0.5倍,大宝、二宝、小宝各有多少岁? 鸡兔同笼问题方程计算怎么解决看来我要动真格儿的了给你们一个算式,打问号部分是“为什么这样做”如:4x+2(8-x)=262x+16 =26x =5还有,回答要简略 数学三练五年级上册计算平行四边形面积的应用题(有图) 五年级第二学期数学列方程解应用题两列火车同时从相距路程为624.5千米的两个车站相对开出,经过5小时在途中相遇,已知客车平均每小时行70千米,货车平均每小时行多少千米? 鸡兔同笼问题,如果只告诉你脚数差,应该怎么算?(方程) 兔子的脚比鸡的脚多28只.笼子中的鸡和兔子各有多少只? 五年级第二学期数学列方程解应用题和解方程解方程:1、3.6x-x-0.1x=0.752、(x-8.2+10.8)/2=1.8列方程解应用题:1、地球表面的海洋面积大约是陆地面积的2.4倍,比陆地面积多2.1亿平方千米,海洋面 北师大版六年级上册数学书,28页,三题,解方程, 小学数学北师大版五年级上册“尝试与猜测”鸡兔同笼的相关内容随便给点相关资料就可以了. 甲、乙两地相距420千米,货车和客车同时从两地相向而行,货车每小时行50千米,客车行完全程要6小时,两车几小时后相遇?(列方程解应用题) 是北京师范大学出版社的!数学书上册的,242页的12.13.14.15.16题(全用方程没有书的,12.有一块棱长为0.6米的正方体钢坯,想将它锻成横截面是0.008米的立方的长方形钢材,锻成的钢材有多高?13.某公 五年级上册数学金牌学案(鸡兔同笼)全部谁会? 1.启明小学有教师180人,其中女教师的人数是男教师的2倍,启明小学有男女教师各多少名呢?设:男教师有x人,女教师有2x人.2.解方程:3x(x-7)=0.63.同乐学校买了三件商品,粉笔90盒,单价是1.50.墨 鸡兔同笼, 黄冈小状元五年级数学上册第18页第4题答案 四分之十一减2x=四分之三 七分之二+x=三分之一工程队修4千米的公路,12天修完,平均每天修多少千米?平均每天修这条公路的几分之几?一根竹竿长5米,把它插入池塘中,露出水面的部分是三分之 最简单的方程怎么算 小学数学题题目 五年级上册数学黄冈小状元54页3题答案一块梯形地,上底长40米,下地长60米,高是40米,李伯伯在这块地中最大的一块正方形地里种棉花,其余的种花生,种花生的面积有多大? 100 甲乙两箱粉笔的盒数之比是5:1,如果从甲箱里取出12盒放入乙箱后,甲、乙两箱粉笔的数量比是7:5,那么两箱粉笔共有多少盒?不要方程! 黄冈小状元六年级上册数学p63,5,6,7 (1)用一块87.5平方米的布做桌布40块后,还剩17.5平方米,平均每块桌布用布多少平方米? 1一项工程,由甲乙两人共同做12天可以完成.甲先做2天后调整其他工作,由乙接着做3天,这时,做了的占未做的4分之1.这项工程由乙单独做,要多少天完成?2.有甲乙两袋大米,甲袋123KG,乙袋45KG.为了 六年级数学上册黄冈小状元45页答案. 甲乙两个超市共卖蔬菜1200千克,已知甲超市卖的3/5与乙超市卖的2/5同样多.甲乙两个超市各卖蔬菜多少千克?(请根据标准的格式列方程)
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn