How can I return an encoded string in an http resp

2020-05-03 10:06发布

Adding an encoded string to an http resonse seems to replace some characters with !F(MISSING). How that that be prevented?

Output:

{"encodedText":"M6c8RqL61nMFy%!F(MISSING)hQmciSYrh9ZXgVFVjO"}

Code:

package main

import (
    "encoding/json"
    "fmt"
    "net/http"
    "net/url"
)

type EncodeResult struct {
    EncodedText string `json:"encodedText"`
}

func main() {

    http.HandleFunc("/encodedString", encodedString)
    _ = http.ListenAndServe(":8080", nil)
}

func encodedString(w http.ResponseWriter, r *http.Request) {

    inputString := "M6c8RqL61nMFy/hQmciSYrh9ZXgVFVjO"
    er := EncodeResult{url.QueryEscape(inputString)}
    response, _ := json.Marshal(er)

    w.Header().Set("Content-Type", "application/json")
    fmt.Fprintf(w, string(response))
}

标签: encoding go
2条回答
Deceive 欺骗
2楼-- · 2020-05-03 10:43

It appears to be escaping it normally, can you paste some code?

http://play.golang.org/p/rUEGn-KlTX

package main

import (
    "fmt"
    "net/url"
)

func main() {

    escape := url.QueryEscape("M6c8RqL61nMFy/hQmciSYrh9ZXgVFVjO")

    fmt.Println(escape)
}
查看更多
我想做一个坏孩纸
3楼-- · 2020-05-03 10:46

You are using the escaped value "M6c8RqL61nMFy%2FhQmciSYrh9ZXgVFVjO " as a format string on this line:

fmt.Fprintf(w, string(response))

Fprintf attempts to format an argument for the verb "%2F". There is no argument, so Fprintf prints "%!F(MISSING)" for the verb.

The fix is to not use the output as a format string. Because you don't need any formatting when writing to the response, change the last line to:

w.Write(response)            
查看更多
登录 后发表回答