58 строки
1.1 KiB
Go
58 строки
1.1 KiB
Go
package xmlrpc
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"net/http"
|
|
)
|
|
|
|
func NewRequest(url string, method string, args interface{}) (*http.Request, error) {
|
|
var t []interface{}
|
|
var ok bool
|
|
if t, ok = args.([]interface{}); !ok {
|
|
if args != nil {
|
|
t = []interface{}{args}
|
|
}
|
|
}
|
|
|
|
body, err := EncodeMethodCall(method, t...)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
request, err := http.NewRequest("POST", url, bytes.NewReader(body))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
request.Header.Set("Content-Type", "text/xml")
|
|
request.Header.Set("Content-Length", fmt.Sprintf("%d", len(body)))
|
|
|
|
return request, nil
|
|
}
|
|
|
|
func EncodeMethodCall(method string, args ...interface{}) ([]byte, error) {
|
|
var b bytes.Buffer
|
|
b.WriteString(`<?xml version="1.0" encoding="UTF-8"?>`)
|
|
b.WriteString(fmt.Sprintf("<methodCall><methodName>%s</methodName>", method))
|
|
|
|
if args != nil {
|
|
b.WriteString("<params>")
|
|
|
|
for _, arg := range args {
|
|
p, err := marshal(arg)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
b.WriteString(fmt.Sprintf("<param>%s</param>", string(p)))
|
|
}
|
|
|
|
b.WriteString("</params>")
|
|
}
|
|
|
|
b.WriteString("</methodCall>")
|
|
|
|
return b.Bytes(), nil
|
|
}
|