HTTP PUT and POST

POST 方法用来传输实体的主体,PUT方法用来传输文件。

两个方法都是将一个资源附加到服务器端的请求。一些狭窄的意见认为,POST方法用来创建资源,而PUT方法则用来更新资源。这个说法本身没有问题,但是并没有从根本上解释了二者的区别。事实上,它们最根本的区别就是:POST方法不是幂等的,而PUT方法则有幂等性。

幂等(idempotent、idempotence)是一个抽象代数的概念。在计算机中,可以这么理解,一个幂等操作的特点就是其任意多次执行所产生的影响均与依次一次执行的影响相同。

POST在请求的时候,服务器会每次都创建一个文件,但是在PUT方法的时候只是简单地更新,而不是去重新创建。因此PUT是幂等的。

举例,有一个博客系统提供一个Web API,模式是这样http://example.com/blogs/post/{blog-name},很简单,将{blog-name}替换为我们的blog名字,往这个URI发送一个HTTP PUT或者POST请求,HTTP的body部分就是博文,这是一个很简单的REST API例子。

用PUT方法还是POST方法?取决于这个REST服务的行为是否是idempotent的,假如我们发送两个http://example.com/blogs/post/Sample请求,服务器端是什么样的行为?如果产生了两个博客帖子,那就说明这个服务不是idempotent的,因为多次使用产生了副作用了嘛;如果后一个请求把第一个请求覆盖掉了,那这个服务就是idempotent的。前一种情况,应该使用POST方法,后一种情况,应该使用PUT方法。

如果用PUT来达到更改资源,每次请求需要client提交资源全部信息,如果只有部分信息,不应该使用PUT(因为服务器使用client提交的对象整体替换服务器的资源)。

POST不同于一般的增删改,使用场景比较多。根据RFC文档上描述,有以下几个场景:(tools.ietf.org/html/rfc

- Annotation of existing resources;

- Posting a message to a bulletin board, newsgroup, mailing list, or   
  similar group of articles;

- Providing a block of data, such as the result of submitting a
  form, to a data-handling process;

- Extending a database through an append operation.

服务器在实现POST是不可预知,所以将其定义为不安全、不幂等的Verb。基本上不能简单的归纳为“增删改”之类的行为,都可以使用POST方法。

 

 

发表在 technologys | HTTP PUT and POST已关闭评论

CURD( Create Update Read Delete ) RESTful proposal

 

Operation   SQL     HTTP    
Create      INSERT  POST    
Read        SELECT  GET 
Update      UPDATE  PUT 
Delete      DELETE  DELETE  

Reference:

HTTP PUT and POST

 

.

 

发表在 technologys | CURD( Create Update Read Delete ) RESTful proposal已关闭评论

WebMvcConfig

.



import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;


@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    private final Logger logger = LoggerFactory.getLogger(WebMvcConfig.class);

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("GET", "POST","OPTIONS")
                .allowedHeaders("*")
                .exposedHeaders("Access-Control-Allow-Headers",
                        "Access-Control-Allow-Methods",
                        "Access-Control-Allow-Origin",
                        "Access-Control-Max-Age",
                        "X-Frame-Options")
                .allowCredentials(false)
                .maxAge(3600);
    }

    
    /**
     * The bean shown in the preceding example registers any @ServerEndpoint
     * annotated beans with the underlying WebSocket container. When deployed to a
     * standalone servlet container, this role is performed by a servlet container
     * initializer, and the ServerEndpointExporter bean is not required.
     */
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
    
}

 

.

发表在 java | WebMvcConfig已关闭评论

WordPress manual upgrade

 

1、备份Wordpress资料及数据库。

2、下载新版的Wordpress。

3、删除主机上的wp-includes和wp-admin目录。

4、把解压在本地电脑的 WordPress 文件夹中除了wp-content目录外的所有文件都上传并覆盖到你博客主机相对应的位置。遇到是否覆盖时,选择全部覆盖就是了。

5、运行 http://你的地址/wp-admin/upgrade.php,执行升级。

 

.

发表在 technologys | WordPress manual upgrade已关闭评论

ssh-agent / git 指定特定 key

使用代理封装指定行定KEY


#add 1.
ssh-agent bash -c 'ssh-add /somewhere/yourkey; git clone git@github.com:user/project.git'

#or 2.
ssh-agent $(ssh-add /somewhere/yourkey; git clone git@github.com:user/project.git)

 

References:

https://blog.csdn.net/zhouguoqionghai/article/details/92134462

https://zhuanlan.zhihu.com/p/126117538

.

发表在 linux | ssh-agent / git 指定特定 key已关闭评论

SpringBoot CorsConfig

案例一:


package com.wang.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableOAuth2Client;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

@Configuration
public class CorsConfig {
    private CorsConfiguration buildConfig() {
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.addAllowedOrigin("*"); // 1
        corsConfiguration.addAllowedHeader("*"); // 2
        corsConfiguration.addAllowedMethod("*"); // 3
        return corsConfiguration;
    }

    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", buildConfig()); // 4
        return new CorsFilter(source);
    }


}

 

案例二:


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

@Configuration
public class GlobalCorsConfig {
    @Bean
    public CorsFilter corsFilter() {
        //1.添加CORS配置信息
        CorsConfiguration config = new CorsConfiguration();
        //1) 允许的域,不要写*,否则cookie就无法使用了
        config.addAllowedOrigin("http://www.example.com");
        //2) 是否发送Cookie信息
        config.setAllowCredentials(true);
        //3) 允许的请求方式
        config.addAllowedMethod("OPTIONS");
        config.addAllowedMethod("HEAD");
        config.addAllowedMethod("GET");
        config.addAllowedMethod("PUT");
        config.addAllowedMethod("POST");
        config.addAllowedMethod("DELETE");
        config.addAllowedMethod("PATCH");
        // 4)允许的头信息
        config.addAllowedHeader("*");

        //2.映射路径,拦截一切请求
        UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
        configSource.registerCorsConfiguration("/**", config);

        //3.返回新的CorsFilter.
        return new CorsFilter(configSource);
    }
}

 

 


 

 

发表在 java | SpringBoot CorsConfig已关闭评论

CentOS 7 upgrade to CentOS 8

第1步:安装EPEL储存库

首先,通过运行以下命令安装EPL存储库:

yum install epel-release -y

第2步:安装yum-utils工具

成功安装EPEL之后 ,通过运行以下命令来安装yum-utils 。

yum install yum-utils

在CentOS 7中安装yum-utils
此后,您需要通过执行命令来解析RPM软件包。

# yum install rpmconf
# rpmconf -a

保留默认RPM设置
接下来,清理所有不需要的软件包。

# package-cleanup --leaves
# package-cleanup --orphans

干净的RPM软件包
第3步:在CentOS 7中安装dnf
现在安装dnf软件包管理器 ,它是CentOS 8的默认软件包管理器。

# yum install dnf

在CentOS 7中安装dnf
您还需要使用以下命令删除yum软件包管理器 。

# dnf -y remove yum yum-metadata-parser
# rm -Rf /etc/yum

在CentOS 7中删除Yum
第4步:将CentOS 7升级到CentOS 8
现在,我们准备将CentOS 7升级到CentOS 8,但在此之前,请使用新安装的dnf软件包管理器升级系统。

# dnf upgrade

升级CentOS 7

接下来,如下所示使用dnf安装CentOS 8发行包。 这需要一段时间。

dnf -y upgrade http://mirrors.163.com/centos/8.0.1905/BaseOS/x86_64/os/Packages/centos-release-8.0-0.1905.0.9.el8.x86_64.rpm

安装CentOS 8版本
接下来,升级EPEL存储库。

dnf -y upgrade https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm

升级EPEL存储库
成功升级EPEL存储库后,请删除所有临时文件。

# dnf clean all

删除 CentOS 7 的旧内核 。

# rpm -e `rpm -q kernel`

接下来,请确保删除有冲突的软件包。

# rpm -e --nodeps sysvinit-tools

之后,如图所示启动CentOS 8系统升级。

# dnf -y --releasever=8 --allowerasing --setopt=deltarpm=false distro-sync

CentOS 8系统升级
第5步:安装适用于CentOS 8的新内核
要为CentOS 8安装新的内核,请运行命令。

# dnf -y install kernel-core

在CentOS 8中安装内核
最后,安装CentOS 8最小软件包。

# dnf -y groupupdate "Core" "Minimal Install"

现在,您可以通过运行检查安装的CentOS版本。

# cat /etc/redhat-release

检查CentOS版本

 

参考:
https://www.howtoing.com/upgrade-centos-7-to-centos-8

 

 

#!/bin/bash

echo 'CentOS 7 upgrade to CentOS 8'

echo '第1步:安装EPEL储存库'
yum update -y
yum remove epel-release mariadb mariadb-connector-c-config redhat-rpm-config -y
#yum install epel-release -y
yum install -y http://mirrors.ustc.edu.cn/epel/epel-release-latest-7.noarch.rpm

echo '第2步:安装yum-utils工具'
yum install yum-utils -y

echo '在CentOS 7中安装yum-utils'
yum install rpmconf -y
rpmconf -a

echo '保留默认RPM设置,接下来,清理所有不需要的软件包'
package-cleanup --leaves
package-cleanup --orphans

# yum remove -y libsysfs-2.1.0-16.el7.x86_64 chefdk-4.6.35-1.el7.x86_64

echo '第3步:在CentOS 7中安装dnf'
yum install dnf -y

echo '在CentOS 7中安装dnf, 您还需要使用以下命令删除yum软件包管理器 。'
dnf -y remove yum yum-metadata-parser
rm -Rf /etc/yum


echo '第4步:将CentOS 7升级到CentOS 8'
dnf -y upgrade
dnf -y install http://mirrors.aliyun.com/centos/8/BaseOS/x86_64/os/Packages/centos-linux-repos-8-2.el8.noarch.rpm http://mirrors.aliyun.com/centos/8/BaseOS/x86_64/os/Packages/centos-linux-release-8.3-1.2011.el8.noarch.rpm http://mirrors.aliyun.com/centos/8/BaseOS/x86_64/os/Packages/centos-gpg-keys-8-2.el8.noarch.rpm
dnf -y upgrade http://mirrors.ustc.edu.cn/epel/epel-release-latest-8.noarch.rpm

# dnf -y install http://mirrors.aliyun.com/centos/8/BaseOS/x86_64/os/Packages/centos-linux-repos-8-2.el8.noarch.rpm
# dnf -y http://mirrors.aliyun.com/centos/8/BaseOS/x86_64/os/Packages/centos-gpg-keys-8-2.el8.noarch.rpm
# dnf -y upgrade http://mirrors.ustc.edu.cn/epel/epel-release-latest-8.noarch.rpm

# dnf -y upgrade http://mirrors.163.com/centos/8.0.1905/BaseOS/x86_64/os/Packages/centos-release-8.0-0.1905.0.9.el8.x86_64.rpm
# dnf -y upgrade https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm


echo '升级EPEL存储库'
dnf clean all
rpm -e `rpm -q kernel`
rpm -e --nodeps sysvinit-tools
dnf -y --releasever=8 --allowerasing --setopt=deltarpm=false distro-sync


echo '第5步:安装适用于CentOS 8的新内核'
dnf -y install kernel-core


echo '安装CentOS 8最小软件包'
dnf -y groupupdate "Core" "Minimal Install"
cat /etc/redhat-release




 

 

.

 

发表在 linux | CentOS 7 upgrade to CentOS 8已关闭评论

Docker Desktop - WSL 2 从C盘迁移到其他目录

WSL

WSL:适用于 Linux 的 Windows 子系统。

  • 什么是适用于 Linux 的 Windows 子系统?

适用于 Linux 的 Windows 子系统可让开发人员按原样运行 GNU/Linux 环境 - 包括大多数命令行工具、实用工具和应用程序 - 且不会产生虚拟机开销。

  • 什么是 WSL 2?

WSL 2 是适用于 Linux 的 Windows 子系统体系结构的一个新版本,它支持适用于 Linux 的 Windows 子系统在 Windows 上运行 ELF64 Linux 二进制文件。 它的主要目标是提高文件系统性能,以及添加完全的系统调用兼容性。

--

启用WSL后,docker运行数据都在WSL发行版中,文件位置都只能由WSL管理!

安装docker后,docker会自动创建2个发行版:

  • docker-desktop
  • docker-desktop-data

 

WSL发行版迁移

网上查了一下wsl发行版迁移,几乎都是说使用LxRunOffline.exe

经过我试验,LxRunOffline.exe确实可以迁移自己安装的发行版,却迁移不了docker自动创建的2个发行版!

最后只能去github提了个issues:https://github.com/docker/for-win/issues/7348

下面是操作方法:

  1. 首先关闭docker
  2. 关闭所有发行版:
    wsl --shutdown
  3. 将docker-desktop-data导出到D:\SoftwareData\wsl\docker-desktop-data\docker-desktop-data.tar(注意,原有的docker images不会一起导出)
    wsl --export docker-desktop-data D:\SoftwareData\wsl\docker-desktop-data\docker-desktop-data.tar
  4. 注销docker-desktop-data:
    wsl --unregister docker-desktop-data
  5. 重新导入docker-desktop-data到要存放的文件夹:D:\SoftwareData\wsl\docker-desktop-data\:
    wsl --import docker-desktop-data
    D:\SoftwareData\wsl\docker-desktop-data\
    D:\SoftwareData\wsl\docker-desktop-data\docker-desktop-data.tar
    --version 2

--

只需要迁移docker-desktop-data一个发行版就行,另外一个不用管,它占用空间很小。
完成以上操作后,原来的%LOCALAPPDATA%/Docker/wsl/data/ext4.vhdx就迁移到新目录了:

重启docker

参考:
https://docs.microsoft.com/zh-cn/windows/wsl/
https://docs.docker.com/docker-for-windows/wsl/
https://www.cnblogs.com/xhznl/p/13184398.html

 

 

发表在 cloud | Docker Desktop - WSL 2 从C盘迁移到其他目录已关闭评论

git 日常

 

命令行指引

您还可以按照以下说明从计算机中上传现有文件。

Git 全局设置
git config --global user.name "xxxx"
git config --global user.email "xxx@xxx.com"
创建一个新仓库
git clone https://git.xxx.org/xxxx/xxx.git
cd brp
touch README.md
git add README.md
git commit -m "add README"
git push -u origin master
推送现有文件夹
cd existing_folder
git init
git remote add origin https://git.xxx.org/xxxx/xxx.git
git add .
git commit -m "Initial commit"
git push -u origin master
推送现有的 Git 仓库
cd existing_repo
git remote rename origin old-origin
git remote add origin https://git.xxx.org/xxxx/xxx.git
git push -u origin --all
git push -u origin --tags

 

 

.

发表在 technologys | git 日常已关闭评论

apache dubbo / zookeeper / zookeeper not connected

 

dubbo 2.7.3 升级2.7.5 或更高版本时 连接不到zookeeper

方法一:

dubbo.config-center.timeout:10000
dubbo.registry.timeout: 100000

参考:
https://github.com/apache/dubbo-spring-boot-project/issues/668

 

方法二:

换掉dubbo的版本号就好了

如下:

<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.3</version>
</dependency>
<!-- 使用zk 做注册中心,Dubbo 需要的依赖 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper</artifactId>
<type>pom</type>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>

 

 

.

发表在 java | apache dubbo / zookeeper / zookeeper not connected已关闭评论