2014-03-28 1 views
0

Я делаю запрос к API на основе https. При вводе URL-адреса запроса в Chrome все работает нормально. При выполнении такой же запрос, используя net/http пакет в Go, я получаю ошибку об отсутствии подобласти:Получать тело запроса HTTP

"error": { 
    "type": "ApiUnknown", 
    "message": "No api specified (via subdomain)" 
} 

Я полагаю, Chrome и Go-то посылает несколько различных запросов HTTP, поэтому, мне нужно знать, что может быть эти различия ,

В Chrome я могу использовать инструменты разработчика, чтобы увидеть отправленный запрос.

Как я могу получить тело запроса HTTP, отправленное из пакета http?

я могу сделать следующее:

package main 

import (
    "net/http" 
    "os" 
) 

func main() { 
    urlStr := "https://api-name.subdomain.domain.org/page?param=value" 

    //client := &http.Client{} 
    req, err := http.NewRequest("GET", urlStr, nil) 
    if err != nil { 
     panic(err) 
    } 
    req.Write(os.Stdout) // Will this output be equal to the one being sent to the server? 
    //resp, err := client.Do(req) 
} 

Выход:

GET/страница парам = значение HTTP/1.1
Ведущий: апи-name.subdomain.domain. org
User-Agent: Go 1.1 пакет http

площадка:http://play.golang.org/p/Oku0O1yiBt

Но я не уверен, добавляет ли Транспорт что-то до того, как запрос посылается, или, если это на самом деле все, что есть.

+0

Дополнительные заголовки могут быть установлены при отправке запроса (например, «Авторизация», если в URL-адресе, «Реферере» есть базовые учетные данные авторизации, в случае перенаправления и т. Д.). Вы действительно не предоставили много информации о том, почему ваш сервер может отклонять ваш запрос. –

+0

@JamesHenstridge: Да, я предположил, что это может быть так. И нет, я не предоставил много информации, потому что я действительно не знаю. Вот почему я хотел бы видеть фактический орган запроса. Я принимаю то же самое 'urlStr' и вставляю его в Chrome на том же компьютере и получаю другой ответ. Я добавил фактический ответ, который дает мне HTTP-запрос Go. – ANisus

+0

Я мог бы добавить, что, хотя urlStr не является фактическим url (ну, duh), он имеет ту же структуру. Он даже имеет тире в 'api-name', поэтому на мгновение я подумал, что у Go может быть URL-код, закодированный тире, но это не так. – ANisus

ответ

0

Я просто посмотрел источники net/http std lib. Как уже ответил Джеймс Хендридж, можно добавить несколько дополнительных разрешений и связанных с транспортом заголовков. Но это все строго придерживается протокола. Поэтому я не предполагал, что там что-то не так.

Ваш код в нижней части вашего примера должен действительно распечатать всю соответствующую информацию. Теперь это зависит от вашего конкретного случая использования, почему ваш запрос не работает.

Вы указали правильный субдомен (как указано в сообщении об ошибке)?

У вас есть комплект Content-Type? Сервер может проверить соответствующий Content-Type в зависимости от выбранного вами субдомена.

Это всего лишь несколько предположений, которые я могу сделать на этом этапе.