rusbaron
@rusbaron
Не стыдно не знать, стыдно не интересоваться

Как правильно выполнить http.NewRequest с кириллицей?

Пример функции
func response(ctx context.Context, url string, obj ResponseParser) error {
	req, err := http.NewRequest(http.MethodGet, url, nil)
	if err != nil {
		return err
	}
	req = req.WithContext(ctx)
	resp, err := http.DefaultClient.Do(req)
	if err != nil {
		return err
	}
	defer resp.Body.Close()
	data, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		return err
	}
	body := strings.Trim(string(data), " []")
	if body == "" {
		return nil
	}
	if err := json.Unmarshal([]byte(body), obj); err != nil {
		return err
	}
	return nil
}

В примере пытаюсь получить данные по сформированной ссылке ` url ` ,если там есть кириллица,то результат запроса 400.Если вставить url в браузер, получаю необходимые данные. В чём может быть проблема?
  • Вопрос задан
  • 918 просмотров
Решения вопроса 2
igorzakhar
@igorzakhar
1. Случай, когда в запросе кириллические символы:
У автора был url вида:
https://domain.name/data.json?searchtext=Запрос+На+Кириллице

Строка запроса является частью url и по стандарту не может содержать не-ASCII символы (RFC 1738). Так как в url присутствут кириллические символы то url нужно кодировать (URL encoding), что и делает функция QueryEscape из пакета net/url.

package main

import (
	"fmt"
	"net/url"
)

func main() {
	q := "Запрос+На+Кириллице"
	u := "https://domain.name/data.json"
	fmt.Println(u + "?searchtext=" + url.QueryEscape(q))
}

$ go run main.go 
https://domain.name/data.json?searchtext=%D0%97%D0%B0%D0%BF%D1%80%D0%BE%D1%81%2B%D0%9D%D0%B0%2B%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB%D0%B8%D1%86%D0%B5

https://ru.wikipedia.org/wiki/URL#Кодирование_URL

2. Случай когда в url доменное имя на кириллице:

go get golang.org/x/net/idna

package main

import (
	"fmt"
	"golang.org/x/net/idna"
)
var p *idna.Profile

func main() {
	p = idna.New()
	fmt.Println(p.ToASCII("россия.рф"))
}

$ go run main.go 
xn--h1alffa9f.xn--p1ai <nil>

https://ru.wikipedia.org/wiki/IDN
https://ru.wikipedia.org/wiki/Punycode
Ответ написан
Комментировать
rusbaron
@rusbaron Автор вопроса
Не стыдно не знать, стыдно не интересоваться
помогло url.QueryEscape текста на кириллице.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы