大项目实战经验分享 | 青训营笔记

97 阅读2分钟

本片文章记录我在做大项目每天遇到的问题以及心得体会,如有不对,欢迎各位同学评论指正呀!!!

视频流接口

开发需求

不限制登录状态,返回按投稿时间倒序的视频列表,视频数由服务端控制,单次最多30个。

image.png

返回响应

成功 (200)

HTTP 状态码: 200

内容格式: JSON

数据结构:

type ApifoxModel struct { 
    NextTime *int64 `json:"next_time"` // 本次返回的视频中,发布最早的时间,作为下次请求时的latest_time 
    StatusCode int64 `json:"status_code"`// 状态码,0-成功,其他值-失败 
    StatusMsg *string `json:"status_msg"` // 返回状态描述 
    VideoList []Video `json:"video_list"` // 视频列表 } 
    // Video 
type Video struct { 
    Author User `json:"author"` // 视频作者信息 
    CommentCount int64 `json:"comment_count"` // 视频的评论总数 
    CoverURL string `json:"cover_url"` // 视频封面地址 
    FavoriteCount int64 `json:"favorite_count"`// 视频的点赞总数 
    ID int64 `json:"id"` // 视频唯一标识 
    IsFavorite bool `json:"is_favorite"` // true-已点赞,false-未点赞 
    PlayURL string `json:"play_url"` // 视频播放地址 
    Title string `json:"title"` // 视频标题 } 
    // 视频作者信息 // 
    // User 
type User struct { 
    FollowCount int64 `json:"follow_count"` // 关注总数 
    FollowerCount int64 `json:"follower_count"`// 粉丝总数 
    ID int64 `json:"id"` // 用户id 
    IsFollow bool `json:"is_follow"` // true-已关注,false-未关注 
    Name string `json:"name"` // 用户名称 }

聊聊Gin中的上下文context

gin.Context主要由下面几部分组成

1.Metadata Management (我自己叫法:Key-Value)

这个模块比较简单, 就是从gin.Context中Set Key-Value, 以及各种个样的Get方法, 如GetBool, GetString等

实现这些功能也很简单, 其实就是一个map

// Keys is a key/value pair exclusively for the context of each request.
Keys map[string]interface{}

2.Input Data

这个模块相当重要了, gin的README基本上都在介绍这个模块的用法.

3. Param (我自己的叫法: 路由变量)

gin的标准叫法是Parameters in path. restful风格api如/user/john, 这个路由在gin里面是/user/:name, 要获取john就需要使用Param函数

name := c.Param("name")

这个方法实现也很简单, 就是在tree.go里面根据路由相关规则解析出来然后赋值给gin.Context的Params.

handlers, params, tsr := root.getValue(path, c.Params, unescape)

4. Query

/welcome?firstname=Jane&lastname=Doe这样一个路由, first, last即是Querystring parameters, 要获取他们就需要使用Query相关函数.

c.Query("first") // Jane
c.Query("last") // Doe

当然还有其他相关函数:

  • QueryMap
  • DefaultQuery 这个默认值的实现更加简单, 当QueryString中不包含这个值, 直接返回填入的值

这些方法是的实现是利用net/http的Request的方法实现的

5. PostForm

对于POST, PUT等这些能够传递参数Body的请求, 要获取其参数, 需要使用PostForm

POST /user/1

{
    "name":manu,
    "message":this_is_great
}
name := c.PostForm("name")
message := c.PostForm("message")

其他相关函数

  • DefaultPostForm

这些相关的方法是实现还是利用net/http的Request的方法实现的