package context import ( "encoding/xml" "net/http" "sync" ) // Context struct type Context struct { *Config Writer http.ResponseWriter Request *http.Request //accessTokenLock 读写锁 同一个AppID一个 accessTokenLock *sync.RWMutex //jsAPITicket 读写锁 同一个AppID一个 jsAPITicketLock *sync.RWMutex HTTPClient *http.Client SHTTPClient *http.Client //SSL client } // Query 返回键入的url查询值(如果存在) func (ctx *Context) Query(key string) string { value, _ := ctx.GetQuery(key) return value } // GetQuery 类似于Query(),它返回键入的url查询值 func (ctx *Context) GetQuery(key string) (string, bool) { req := ctx.Request if values, ok := req.URL.Query()[key]; ok && len(values) > 0 { return values[0], true } return "", false } // SetJsAPITicketLock 设置jsAPITicket的lock func (ctx *Context) SetJsAPITicketLock(lock *sync.RWMutex) { ctx.jsAPITicketLock = lock } // GetJsAPITicketLock 获取jsAPITicket 的lock func (ctx *Context) GetJsAPITicketLock() *sync.RWMutex { return ctx.jsAPITicketLock } var xmlContentType = []string{"application/xml; charset=utf-8"} var plainContentType = []string{"text/plain; charset=utf-8"} //Render render from bytes func (ctx *Context) Render(bytes []byte) { //debug // fmt.Println("response msg = ", string(bytes)) ctx.Writer.WriteHeader(200) _, err := ctx.Writer.Write(bytes) if err != nil { panic(err) } } //String render from string func (ctx *Context) String(str string) { writeContextType(ctx.Writer, plainContentType) ctx.Render([]byte(str)) } //XML render to xml func (ctx *Context) XML(obj interface{}) { writeContextType(ctx.Writer, xmlContentType) bytes, err := xml.Marshal(obj) if err != nil { panic(err) } ctx.Render(bytes) } func writeContextType(w http.ResponseWriter, value []string) { header := w.Header() if val := header["Content-Type"]; len(val) == 0 { header["Content-Type"] = value } }