【小家java】 Restful风格的API设计中,怎么实现批量删除?

简介: 【小家java】 Restful风格的API设计中,怎么实现批量删除?

相关阅读

【小家java】java5新特性(简述十大新特性) 重要一跃

【小家java】java6新特性(简述十大新特性) 鸡肋升级

【小家java】java7新特性(简述八大新特性) 不温不火

【小家java】java8新特性(简述十大新特性) 饱受赞誉

【小家java】java9新特性(简述十大新特性) 褒贬不一

【小家java】java10新特性(简述十大新特性) 小步迭代

【小家java】java11新特性(简述八大新特性) 首个重磅LTS版本


每篇一句

面试高大上,面试造飞机,工作拧螺丝


因此不能以为自己工作觉得还OK,就觉得自己技术还不错了


如题,指的是在restful风格的url设计中,怎么实现批量删除呢?


这里指的删除是真删除,不是逻辑删除。如果是逻辑删除,其实就是update,使用put方法即可


如果是需要删除一个条目,可以直接将需要删除的条目的id放进url里面,比如http://example.com/posts/2016,但是如果需要再一次请求里面删除多个条目,应该如何设计比较合理呢?我现在想到的是以下两种方法:


1.用逗号分隔放进url里面:http://example.com/posts/2016,2017;

2.将需要删除的一系列id放进请求体里面,但是似乎没有这样的标准(DELETE请求)。


先说说方法1,如果删除的数据非常多,比如超过1000个id,那很可能就超过URL的长度限制了。


Url长度限制:

IE7.0 :url最大长度2083个字符,超过最大长度后仍然能提交,但是只能传过去2083个字符。

firefox 3.0.3 :url最大长度7764个字符,超过最大长度后无法提交。

Google Chrome 2.0.168 :url最大长度7713个字符,超过最大长度后无法提交


从上面可以看出,这是有风险的可能提交不了的。但是话说回来,你是什么需求,需要一次性删除1000条记录,这是多么危险的操作,怎么可能通过API暴露出来呢?所以综合考虑,我个人认为,使用url的方式传递删除的值,是没有任何问题的。毕竟我们99%的情况,都是非常少量多额删除操作。


再说说方法2,其实我是不太建议的。因为我们删除操作,肯定使用DELETE请求,但是奈何我们并不建议在DELETE请求里放body体,原因在于:根据RFC标准文档,DELETE请求的body在语义上没有任何意义。事实上一些网关、代理、防火墙在收到DELETE请求后,会把请求的body直接剥离掉。


所以,万一你要放在body体里传参,请使用POST请求


这里介绍一种比较优雅,但是比较麻烦点的方法:

分成2步完成,第一步发送POST请求,集合所有要删除的IDs然后返回一个header,然后在利用这个header调用DELETE请求。具体步骤如下:

发送POST请求,集中所有的IDs (可以存到Redis或者普通数据库)

http://example.com/posts/deletes


成功后可以返回一个唯一的头文件:


HTTP/1.1 201 created, and a Location header to:

http://example.com/posts/deletes/KJHJS675


然后可以利用Ajax直接发送DELETE请求:

DELETE http://example.com/posts/deletes/KJHJS675


这样就可以在不暴露IDs的情况下更加安全的删除相关条目。

最后如果要获得一个资源,一定要用GET方法么?

在一些文章中,看到获取资源的时候,一般用GET方法。我的问题是,我要获取的资源是一个账户的信息,需要实用token,我一般把token放在POST请求里面,当然也可以将token放在连接中使用GET。


其实,restful只是一种理想的情。你是否完全遵循Restful设计原则了 如果完全遵循的话, 获取账户信息应当是GET请求, 但是token通常是会放在header中, 不在url中体现

针对我们的token这个事情,在我项目中会使用post请求根据用户信息获取一个token,然后拿着token用get方法请求资源。**另外,我也会将token放到http请求头中。**以上是个人工作经验,希望对各位有帮助

最后

restful风格的url我们可以尽量去遵守,因为它对运维或者监控都非常友好。但是不要一根经,它只是理想情况,有的时候并不满足我们的需求,我们可以变通的看问题。


简明的一幅图,rest接口的命名规范:


image.png


为什么会推荐用 -,而不是 _?

-叫做分词符,顾名思义用作分开不同词的。这个最佳实践来自于针对Google为首的SEO(搜索引擎优化)需要,Google搜索引擎会把url中出现的-当做空格对待,这样url “/it-is-crazy” 会被搜索引擎识别为与“it",“is”,“crazy"关键词或者他们的组合关键字相关。

当用户搜索”it”,“crazy”, "it is crazy"时,很容易检索到这个url,排名靠前。


_ 这个符号如果出现在url中,会自动被Google忽略,“/it_is_crazy”被识别为与关键词 “itIsCrazy”相关。


相关文章
|
2天前
|
数据采集 JSON Java
Java爬虫获取微店快递费用item_fee API接口数据实现
本文介绍如何使用Java开发爬虫程序,通过微店API接口获取商品快递费用(item_fee)数据。主要内容包括:微店API接口的使用方法、Java爬虫技术背景、需求分析和技术选型。具体实现步骤为:发送HTTP请求获取数据、解析JSON格式的响应并提取快递费用信息,最后将结果存储到本地文件中。文中还提供了完整的代码示例,并提醒开发者注意授权令牌、接口频率限制及数据合法性等问题。
|
2天前
|
数据采集 存储 Java
Java爬虫获取微店店铺所有商品API接口设计与实现
本文介绍如何使用Java设计并实现一个爬虫程序,以获取微店店铺的所有商品信息。通过HttpClient发送HTTP请求,Jsoup解析HTML页面,提取商品名称、价格、图片链接等数据,并将其存储到本地文件或数据库中。文中详细描述了爬虫的设计思路、代码实现及注意事项,包括反爬虫机制、数据合法性和性能优化。此方法可帮助商家了解竞争对手,为消费者提供更全面的商品比较。
|
23天前
|
算法 Java 程序员
菜鸟之路Day06一一Java常用API
《菜鸟之路Day06——Java常用API》由blue编写,发布于2025年1月24日。本文详细介绍了Java中常用的API,包括JDK7的时间类(Date、SimpleDateFormat、Calendar)和JDK8新增的时间API(ZoneId、Instant、DateTimeFormatter等),以及包装类的使用。通过多个实例练习,如时间计算、字符串转整数、十进制转二进制等,帮助读者巩固所学内容,提升编程技能。文章强调了理论与实践结合的重要性,鼓励读者多做练习以提高学习效率。
76 28
|
6天前
|
缓存 Java 应用服务中间件
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
30 5
|
1月前
|
JSON Java 数据挖掘
利用 Java 代码获取淘宝关键字 API 接口
在数字化商业时代,精准把握市场动态与消费者需求是企业成功的关键。淘宝作为中国最大的电商平台之一,其海量数据中蕴含丰富的商业洞察。本文介绍如何通过Java代码高效、合规地获取淘宝关键字API接口数据,帮助商家优化产品布局、制定营销策略。主要内容包括: 1. **淘宝关键字API的价值**:洞察用户需求、优化产品标题与详情、制定营销策略。 2. **获取API接口的步骤**:注册账号、申请权限、搭建Java开发环境、编写调用代码、解析响应数据。 3. **注意事项**:遵守法律法规与平台规则,处理API调用限制。 通过这些步骤,商家可以在激烈的市场竞争中脱颖而出。
|
2月前
|
JSON Java Apache
Java基础-常用API-Object类
继承是面向对象编程的重要特性,允许从已有类派生新类。Java采用单继承机制,默认所有类继承自Object类。Object类提供了多个常用方法,如`clone()`用于复制对象,`equals()`判断对象是否相等,`hashCode()`计算哈希码,`toString()`返回对象的字符串表示,`wait()`、`notify()`和`notifyAll()`用于线程同步,`finalize()`在对象被垃圾回收时调用。掌握这些方法有助于更好地理解和使用Java中的对象行为。
|
2月前
|
算法 Java API
如何使用Java开发获得淘宝商品描述API接口?
本文详细介绍如何使用Java开发调用淘宝商品描述API接口,涵盖从注册淘宝开放平台账号、阅读平台规则、创建应用并申请接口权限,到安装开发工具、配置开发环境、获取访问令牌,以及具体的Java代码实现和注意事项。通过遵循这些步骤,开发者可以高效地获取商品详情、描述及图片等信息,为项目和业务增添价值。
117 10
|
2月前
|
存储 Java 数据挖掘
Java 8 新特性之 Stream API:函数式编程风格的数据处理范式
Java 8 引入的 Stream API 提供了一种新的数据处理方式,支持函数式编程风格,能够高效、简洁地处理集合数据,实现过滤、映射、聚合等操作。
101 6
|
2月前
|
Java API 开发者
Java中的Lambda表达式与Stream API的协同作用
在本文中,我们将探讨Java 8引入的Lambda表达式和Stream API如何改变我们处理集合和数组的方式。Lambda表达式提供了一种简洁的方法来表达代码块,而Stream API则允许我们对数据流进行高级操作,如过滤、映射和归约。通过结合使用这两种技术,我们可以以声明式的方式编写更简洁、更易于理解和维护的代码。本文将介绍Lambda表达式和Stream API的基本概念,并通过示例展示它们在实际项目中的应用。
|
3月前
|
安全 Java API
Java中的Lambda表达式与Stream API的高效结合####
探索Java编程中Lambda表达式与Stream API如何携手并进,提升数据处理效率,实现代码简洁性与功能性的双重飞跃。 ####
44 0