RESTful风格介绍
作者:覃超 链接:https://www.zhihu.com/question/28557115/answer/48094438 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
REST -- REpresentational State Transfer
直接翻译:表现层状态转移。
@Ivony老师的一句话概括很精辟:URL定位资源,用HTTP动词(GET,POST,DELETE,DETC)描述操作。
REST不是”rest”这个单词,而是几个单词缩写。但即使那几个单词说出来,也无法理解在说什么 -_-!! (不是要贬低人,是我自己也理解困难);
REST描述的是在网络中client和server的一种交互形式;REST本身不实用,实用的是如何设计 RESTful API(REST风格的网络接口);
Server提供的RESTful API中,URL中只使用名词来指定资源,原则上不使用动词。“资源”是REST架构或者说整个网络处理的核心。比如:
http://api.qc.com/v1/newsfeed: 获取某人的新鲜;
http://a ...
Nginx中proxy_pass指令的使用
今天在配置nginx.conf时发现proxy_pass指令有几点需要注意的地方。
以下为nginx的配置文件:
1234567891011121314151617181920212223242526272829#分布式图片服务器:可进行负载均衡upstream img_server_pool { server linux.humg.top:8888 weight=10; server linux2.humg.top:8888 weight=10;}server { listen 80; server_name xuecheng.com; ssi on; ssi_silent_errors on; location / { alias D:/JavaProject/xcEdu/UI/xc-ui-pc-static-portal/; index index.html; } l ...
Java中父类private字段能否被子类继承的问题
今天在写接口的时候发现了一个问题,使用@RestController注解下Controller中的方法返回对象(子类CourseInfo)转为JSON数据时会有父类CourseBase中private修饰的字段。此处分析一下Java中父类private字段能否被子类继承的问题。
问题场景使用postman测试http://localhost:31200/course/coursebase/list/1/2?companyId=1,返回JSON数据如下:
12345678910111213141516171819202122232425{ "success": true, "code": 10000, "message": "操作成功!", "queryResult": { "list": [ { "id": "40 ...
1143.最长公共子序列
#动态规划
123456789101112131415161718class Solution { public int longestCommonSubsequence(String text1, String text2) { int m = text1.length(); int n = text2.length(); int[][] dp = new int[m + 1][n + 1]; //dp[i][j]表示子串text1[0:i]与子串text2[0:j]的最长相同子序列 //边界条件:dp[0][j]和dp[i][0]都为0 for (int i = 1; i <= m; i++) { for (int j = 1; j <= n; j++) { if (text1.charAt(i - 1) == text2.charAt(j - 1)) { ...
构造代码块和构造函数的区别
构造函数的作用:给对应的对象进行初始化
构造代码块的作用: 给对象进行统一的初始化
构造函数(1)构造函数是没有返回值类型的。
(2)构造函数的函数名必须要与类名一致。
(3)构造函数并不是由我们手动调用的,而是在创建对应的对象时,JVM就会主动调用到对应的构造函数。
(4)如果一个类没有显式的写上一个构造方法时,那么Java编译器会为该类添加一个无参的构造函数的。
(5)如果一个类已经显式的写上一个构造方法时,那么Java编译器则不会再为该类添加一个无参的构造方法。
(6)构造函数是可以在一个类中以函数重载的形式存在多个的。
构造代码块作用(1)构造代码块的作用:给所有对象进行统一的初始化,对象一建立就运行并且优先于构造函数。
可以将对象所有构造函数中相同的行为抽取到构造代码块中执行,以减少代码的冗余。
(2)构造函数的作用:给对应的对象进行初始化。
格式1234{ //构造代码块}//位于构造函数和实例方法、字段之上
SpringBoot 不能正常debug(进入PolicyUtil类中)
在SpringBoot单元测试中打上断点,然后debug
进入到PolicyUtil类中,控制台无SpringBoot启动信息
网上搜了下也没找到解决方法,救救孩子吧!
解决Ctrl+Shift+F8打开断点窗口,取消勾选java.lang.IllegalArgumentException(好吧,我也不知道什么时候√上它的…)
二维码扫描登录原理
作者:平头哥的技术博文链接:https://juejin.cn/post/6844904111398191117来源:掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
二维码扫码登录流程图
扫码登录可以分为三个阶段:待扫描、已扫描待确认、已确认。我们就一一来看看这三个阶段。
待扫描待扫描阶段也就是流程图中 1~5 阶段,即生成二维码阶段,这个阶段跟移动端没有关系,是 PC 端跟服务端的交互过程。
首先 PC 端携带设备信息向服务端发起生成二维码请求,服务端会生成唯一的二维码 ID,你可以理解为 UUID,并且将二维码 ID 跟 PC 设备信息关联起来,这跟移动端登录有点相似。
PC 端接受到二维码 ID 之后,将二维码 ID 以二维码的形式展示,等待移动端扫码。此时在 PC 端会启动一个定时器,轮询查询二维码的状态。如果移动端未扫描的话,那么一段时间后二维码将会失效。
已扫描待确认阶段流程图中第 6 ~ 10 阶段,我们在 PC 端登录微信时,手机扫码后,PC 端的二维码会变成已扫码,请在手机端确认。这个阶段是移动端跟服务端交互的过程。
首先移动端扫描二维 ...
Spring中@Value注解的注意事项
通过@Value注解将application.yml中的值映射到一个Spring管理的Bean的字段上。
@Value只能注入普通变量123456//队列的名称(自动注入)@Value("${xuecheng.mq.queue}")public String queue_cms_postpage_name; //routingKey 即站点Id@Value("${xuecheng.mq.routinKey}")public String routingKey;
以上代码会导致SpringBoot启动时报错:Could not resolve placeholder ‘XXX.XXX‘ in value
解决
删除public关键字
引用链接
使用@Value注解注入静态字段
BlockingQueue实现生产者消费者模型
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.BlockingQueue;/** * @Autor HumgTop * @Date 2021/5/6 19:32 * @Version 1.0 * <p> * 阻塞队列实现生产者消费者问题 */public class Demo09_BlockingQueue { private static BlockingQueue<String> queue = new ArrayBlockingQueue<>(5); private static class Producer extends T ...
拓扑排序
链接:深入理解拓扑排序(Topological sort)
对于任何有向图而言,其拓扑排序为其所有结点的一个线性排序(对于同一个有向图而言可能存在多个这样的结点排序)。该排序满足这样的条件——对于图中的任意两个结点u和v,若存在一条有向边从u指向v,则在拓扑排序中u一定出现在v前面。
$校招必会310. 最小高度树
拓扑排序存在的前提当且仅当一个有向图为有向无环图(directed acyclic graph,或称DAG)时,才能得到对应于该图的拓扑排序。每一个有向无环图都至少存在一种拓扑排序
拓扑排序的算法和实现拓扑排序的问题存在一个线性时间解。也就是说,若有向图中存在n个结点,则我们可以在O(n)时间内得到其拓扑排序,或在O(n)时间内确定该图不是有向无环图,也就是说对应的拓扑排序不存在。
要想完成拓扑排序,我们每次都应当从入度为0的结点开始遍历。因为只有入度为0的结点才能够成为拓扑排序的起点。否则根据拓扑排序的定义,只要一个结点v的入度不为0,则至少有一条边起始于其他结点而指向v,那么这条边的起点在拓扑排序的顺序中应当位于v之前,则v不能成为当前遍历的起点。
实现方法:b ...