webrtc一些笔记

基础框架

组成部分:

  1. Signalling,客户端session控制,网络和多媒体信息同步的机制。不是RTCPerrConnection API的一部分,用户可以根据需求自己定义和实现signalling,signalling主要用于三种类型的信息:

    • session控制消息:初始化或关闭 会话,还可以上报错误
    • 网络配置:通过signalling告诉 第三方(想和自己连接的Peer)自己的IP和Port
Read More
1. 入口

app.MountXXXController ->
service.Mux.Handle("GET", "/add/:left/:right", ctrl.MuxHandler("Add", h, nil)) ->ctrl.MuxHandler("Add", h, nil)

ctrl.MuxHandler("Add", h, nil) 中返回一个 先Invoke用户实现的对应请求的逻辑方法,再依次Invoke middleware 的函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// MuxHandler wraps a request handler into a MuxHandler. The MuxHandler initializes the request
// context by loading the request state, invokes the handler and in case of error invokes the
// controller (if there is one) or Service error handler.
// This function is intended for the controller generated code. User code should not need to call
// it directly.
func (ctrl *Controller) MuxHandler(name string, hdlr Handler, unm Unmarshaler) MuxHandler {
// Use closure to enable late computation of handlers to ensure all middleware has been
// registered.
var handler Handler

return func(rw http.ResponseWriter, req *http.Request, params url.Values) {
// Build handler middleware chains on first invocation
if handler == nil {
handler = func(ctx context.Context, rw http.ResponseWriter, req *http.Request) error {
if !ContextResponse(ctx).Written() {
return hdlr(ctx, rw, req)
}
return nil
}
chain := append(ctrl.Service.middleware, ctrl.middleware...)
ml := len(chain)
for i := range chain {
handler = chain[ml-i-1](handler)
}
}

// Build context
ctx := NewContext(WithAction(ctrl.Context, name), rw, req, params)

// Protect against request bodies with unreasonable length
if ctrl.MaxRequestBodyLength > 0 {
req.Body = http.MaxBytesReader(rw, req.Body, ctrl.MaxRequestBodyLength)
}

// Load body if any
if req.ContentLength > 0 && unm != nil {
if err := unm(ctx, ctrl.Service, req); err != nil {
if err.Error() == "http: request body too large" {
msg := fmt.Sprintf("request body length exceeds %d bytes", ctrl.MaxRequestBodyLength)
err = ErrRequestBodyTooLarge(msg)
} else {
err = ErrBadRequest(err)
}
ctx = WithError(ctx, err)
}
}

// Invoke handler
if err := handler(ctx, ContextResponse(ctx), req); err != nil {
LogError(ctx, "uncaught error", "err", err)
respBody := fmt.Sprintf("Internal error: %s", err) // Sprintf catches panics
ctrl.Service.Send(ctx, 500, respBody)
}
}
}

Read More

阿里大鱼 短信发送接口 alibaba.aliqin.fc.sms.num.send 防坑指南

0x00 吐槽

文档写的已经无力吐槽了,请问您哪里有指出 参数需要 secret了呢???

0x01 注意项

1.md5 sign的生成是字符串 :

1
${SECRET}app_key${APP_KEY}formatjsonmethodalibaba.aliqin.fc.sms.num.sendrec_num${PHONE_NUMBER}secretcb13046b7f305eb305e6e45d6b93405fsign_methodmd5sms_free_sign_name${SIGN_NAME}sms_param${PARAMS}sms_template_code${TEMPLATE_CODE}sms_typenormaltimestamp2016-03-08 16:01:53v2.0cb13046${SECRET}

Read More

###设计表述
客户端所关心的资源是一个抽象的实体,它是用URI来标识的。另一方面,表述是具体而真实的,你在客户端和服务器上针对它编写代码,进行操作。
HTTP在请求和响应中为表述提供了一种包装格式。设计表述设计:
1.使用HTTP提供的格式包含正确的标头,
2.当表述有正文时,为正文选择合适的媒体类型并设计一种格式。

###如何使用实体头来注解表述
表述不仅仅是以某种格式序列化后的数据,它是一连串字节加上用于描述那些字节的元数据。在HTTP中,表述元数据是由使用实体头的名值对来实现的。
使用以下标头来注解包含消息正文的表述:

  • Conent-Type,用于描述表述类型,包含charset 参数或其他针对该媒体类型而定义的参数。
Read More

##Restful web Services —-第 2章 笔记

###识别资源
开发RESTful Web 服务的首要步骤之一就是设计资源模型,资源模型对所有客户端用来与服务器交互的资源加以识别和分类。

###如何选择资源粒度
通过网络效率、表达的多少以及客户端的易用程度来帮助确定资源的粒度。
粗粒度设计便于富客户端应用程序。而更精细的资源粒度可以更好地满足缓存的要求。因此,应从客户端和网络的角度确定资源的粒度。下列因素可能会进一步影响资源粒度:

  • 可缓存性
  • 修改频率
  • 可变性
    仔细设计资源粒度,以确保使用更多缓存,减小修改频率;或将不可变数据从使用缓存较少、修改频率更高或可变数据分离出来,这样可以改善客户端和服务端的效率。
Read More

###REST(表述性状态转移)

HTTP 的设计 目标是在客户端和服务器之间对库、服务器、代理、缓存和其他工具的可见性。可见性是:一个组件能够对其他两个组件之间的交互进行监视或仲裁的能力。当协议是可见的时,缓存、代理、防火墙等组件既可以监视甚至参与其中。

HTTP 通过以下途径来实现可见性:

  • HTTP的交互是无状态的,任何HTTP中介都可以推断出给定请求和响应的意义,而无须关联过去或将来的请求和响应。
  • HTTP使用一个统一接口,包括有OPTIONS,GET,HEAD,POST,DELETE和TRACE方法。接口中的每一个方 法操作一个且仅有一个资源。每个方法的语法和含义不会因应用程序或资源的不同而发生改变。
Read More