iがgolangでREST APIを作っていますし、私はフィールドをフィルタリングするためのサポートを追加したいが、私はそれを実装するための最良の方法を知らない、私はAlbum
モデルを表すこのような構造を持っているJSONレスポンスでデータベースからフィールドをフィルタリングする方法は?
type Album struct {
ID uint64 `json:"id"`
User uint64 `json:"user"`
Name string `json:"name"`
CreatedDate time.Time `json:"createdDate"`
Privacy string `json:"privacy"`
Stars int `json:"stars"`
PicturesCount int `json:"picturesCount"`
}
と言うことができますAlbum
func GetOne(id uint64, user uint64) (Album, error) {
var album Album
sql := `SELECT * FROM "album" WHERE "id" = $1 AND "user" = $2;`
err := models.DB.QueryRow(sql, id, user).Scan(
&album.ID,
&album.User,
&album.Name,
&album.CreatedDate,
&album.Privacy,
&album.Stars,
&album.PicturesCount,
)
return album, err
}
とクライアントのインスタンスを返す関数は、この
https://api.localhost.com/albums/1/?fields=id,name,privacy
明らかなセキュリティ上の問題はさておき、私の最初に考えたのは、この
func GetOne(id uint64, user uint64, fields string) {
var album Album
sql := fmt.Sprintf(`SELECT %s FROM "album" WHERE "id" = $1 AND "user" = $2;`, fields)
// i don't know what to do after this
}
のようなものを使用して、データベース内のフィールドをフィルタリングすることでしたし、私はすべてのフィールドにomitempty
タグを追加すると、前にゼロ値にフィールドを設定すると考えます
- これは動作しますか?
- どちらが良い方法ですか?
- がありますか?
- 最初の方法を実装するにはどうすればよいですか?
ありがとうございます。あなたの最初の提案(のみ要求されたフィールドを照会)するため
私は 'json:omitempty'と一緒に行って、リクエストされていないすべてのフィールドをリフレクションを使ってゼロの値に設定しましたが、「somefieldsが見つからない場合はどういう意味ですか? – zola
'json:" omitempty "を使わないと' {"name": ""、...} 'を送信しますが、' json: "omitempty" 'の場合は答えに" name "属性が含まれませんvalueは空の文字列です。したがって、JSONを受け取るクライアント(かなり可能性のあるブラウザ)は空の文字列を表示せず、 "name"プロパティには 'undefined'を表示します。予期しない動作が発生する可能性があります。 私の回答は役に立ちましたか?もしそうなら、それを正しいものとしてマークしてください。 –
私はデータベースにnull可能なフィールドがないので、この特定のケースでは問題ありません。 – zola