HTTP的Patch, SQL的Update 以及Go的反射

「TODO -- 正在整理笔记为博文」

最近思来想去决定要把平时记得笔记都输出成博客,这样做的目的是为了提高自己输出以及讲故事的能力。

这篇文章讲的是我在实现HTTP的Patch请求遇到的问题,以及一些解决问题的思路。

首先我们来介绍一下Patch

The HTTP PATCH request method applies partial modifications to a resource.Unlike PUT, PATCH is not idempotent, meaning successive identical patch requests may have different effects. However, it is possible to issue PATCH requests in such a way as to be idempotent.

根据MDN上的文档1, 我们可以知道PATCH不同于同样用于更新资源的PUT,它主要用于对资源进行局部的更新,而PUT常常用于更新全部资源。同时,我们也可以发现PATCH是一个非幂等的一个操作,也就是说同样的请求会有不同的结果。

在这篇文章,我们先不讨论PATCH的幂等以及非幂等,我们首先把目光聚集到局部的资源更新。由于PATCH是实现资源的局部更新,那么在后端我们也要做好相应的处理。当传入的对象是会动态变化的,我们要如何的处理?

在这里根据SQL中UPDATE的语法,以及我们需要更新的字段是不定的,我们很容易提出要根据传入的资源动态调整SQL的UPDATE语句;换句话说,我们要根据PUT中的字段来生成不同的SQL语句。 在JS中,我们可以较为容易的做到这个操作,只需要从json中读取key和value即可, 如:

object = {
name: "Novak"
    age: "18"
}

sql = 'UPDATE users SET '

for (var key in object) {
    sql += key + '=' + object[key]
}
sql += ' WHERR users.id=:id'

但是在Go中事情是不一样的,当我们面对这个json对象并要更新它的时候,它已经被我们转化成了结构体的形式。那么要如何处理呢?

首先我们假设我们有一个user 结构:

type user stuct{
    id string `db:"id"`
    name string `db:"name"`
    age string `db:"age"`
    email string `db:"email"`
}
  1. https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PATCH