#go
#Вперед
Вопрос:
Не выполняется автоматическое распаковывание тела запроса gzip, если Content-Encoding: gzip
установлен заголовок?
например
package main
import (
"compress/gzip"
"encoding/json"
"fmt"
"io"
"io/ioutil"
"log"
"net/http"
)
func main() {
requestBody, err := json.Marshal(map[string]string{
"accountReferenceId": "abcd",
"transactionType": "Deposit",
"amount": "100.00",
})
if err != nil {
log.Fatal(err)
}
r, w := io.Pipe()
go func() {
err := compressJSON(w, requestBody)
w.CloseWithError(err)
}()
client := amp;http.Client{}
req, err := http.NewRequest("POST", "http://localhost:7070/transactions", r)
if err != nil {
log.Fatal("error making request", err)
}
req.Header.Set("Content-Encoding", "gzip")
//req.Header.Set("Accept-Encoding", "gzip")
req.Header.Set("Content-Type", "application/json")
resp, err := client.Do(req)
if err != nil {
log.Fatal("unable to get response", err)
}
bodyBytes, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal("unable to read response body", err)
}
fmt.Println(string(bodyBytes))
}
func compressJSON(w io.Writer, i interface{}) error {
gz := gzip.NewWriter(w)
if err := json.NewEncoder(gz).Encode(i); err != nil {
return err
}
return gz.Close()
}
Когда сервер получает этот запрос, содержимое тела все еще сжимается. Как я могу сделать его автоматической распаковкой?
Комментарии:
1. Нет, сервер этого не делает
2. Я думаю, если вам нужно сжать ответ самостоятельно, то имеет смысл также сжать его самостоятельно.
3. Это также зависит от
http.Transport
используемого для выполнения запроса-ответа туда и обратно; пожалуйста, обратитесь к документации .4. HTTP- клиент Go автоматически распаковывает ответы . Сервер не имеет встроенной поддержки сжатия, но промежуточное программное обеспечение для его добавления тривиально, и многие версии доступны в свободном доступе.
5. Вы имеете в виду запрос на распаковку? В приведенном выше случае этого не происходит., но да, я вижу много промежуточных программ для сжатия ответа