Задать вопрос
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 в браузер, получаю необходимые данные. В чём может быть проблема?
  • Вопрос задан
  • 1077 просмотров
Подписаться 4 Средний Комментировать
Решения вопроса 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 текста на кириллице.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы