go语言中, 三种转义编码方式,防止特殊字符造成的bug
func (s *service) DemoNFSCheckfile(ctx context.Context, siteID string, req *ReqDemoCheckFile) (ResCheckFile, error) {
res := ResCheckFile{}
bf := bytes.NewBuffer([]byte{})
jsonEncoder := json.NewEncoder(bf)
jsonEncoder.SetEscapeHTML(false)
err := jsonEncoder.Encode(req)
body := bf.String()
if err != nil {
logger.Errorf("Marshal ReqCheckFile failed: %v", err)
return res, errors.SerializeRequestBody(err)
}
url := fmt.Sprintf("/service/sites/%s/vms/action/parsedescriptor", siteID)
resp, err := s.client.Post(ctx, url, []byte(body))
if err != nil {
logger.Errorf("Post %s failed, body: %s, error: %v", url, body, err)
return res, errors.DefaultSendRequest(err)
}
if resp.Failed() {
logger.Errorf("Post %s, ErrorCode: %s, ErrorDes: %s", url, resp.ErrorCode, resp.ErrorDescription)
return res, errors.UnexpectedResponseWithCode(resp.Status, resp.ErrorCode, resp.ErrorDescription)
}
err = json.Unmarshal(resp.Body, &res)
if err != nil {
logger.Errorf("Post %s, response body: %s, unresolved error: %v", url, body, err)
return res, errors.DeserializeResponseBody(err)
}
return res, nil
}
2
// ListPCIs ...
// @Description PCI列表(独立PCI设备列表)
func (s *service) ListPCIs(ctx context.Context, siteID string, req *ReqPCIsQueryList) (ResListPCIWithHost, error) {
var res ResListPCIWithHost
url := fmt.Sprintf("/service/sites/%s/pcis", siteID)
value, err := query.Values(req)
if err != nil {
logger.Errorf("list ListPCIs encode query values error,%v", err)
return res, err
}
rowQuery := value.Encode()
if rowQuery != "" {
url = url + "?" + rowQuery
}
resp, err := s.client.Get(ctx, url)
if err != nil {
logger.Errorf("Get %s failed, error: %v", url, err)
return res, errors.SendRequest("List PCIs", err)
}
err = json.Unmarshal(resp.Body, &res)
if err != nil {
logger.Errorf("Get %s, response body: %s, unresolved error: %v", url, resp.Body, err)
return res, errors.UnexpectedResponseWithCode(resp.Status, resp.ErrorCode, resp.ErrorDescription)
}
return res, nil
}
3
func (s *service) GetVMsBySnapchatPolicyIsBinding(ctx context.Context, siteID string, queryMap map[string]string,
limit, offset int) (ResVMsSnapshotPolicyPage, error) {
res := ResVMsSnapshotPolicyPage{}
reqURL := fmt.Sprintf(
"/service/sites/%s/policy/querybypage/vms?queryType=%s&policyName=%s&vmName=%s&limit=%d&offset=%d",
siteID, url.QueryEscape(queryMap["queryType"]), url.QueryEscape(queryMap["policyName"]),
url.QueryEscape(queryMap["vmName"]), limit, offset)
if queryMap["policyId"] != "" {
reqURL = reqURL + fmt.Sprintf("&policyId=%s", url.QueryEscape(queryMap["policyId"]))
}
resp, err := s.client.Get(ctx, reqURL)
if err != nil {
logger.Errorf("Get %s failed, error: %v", reqURL, err)
return res, errors.DefaultSendRequest(err)
}
if resp.Failed() {
logger.Errorf("Get %s, response body: %s, unresolved error: %v", reqURL, resp.Body, err)
return res, errors.UnexpectedResponseWithCode(resp.Status, resp.ErrorCode, resp.ErrorDescription)
}
err = json.Unmarshal(resp.Body, &res)
if err != nil {
logger.Errorf("unmarshal json failed %v", err)
return res, errors.DeserializeResponseBody(err)
}
return res, nil
}