В чём разница между запросами?
Для запроса к API сайта нужен пост с определёнными параметрами. В документации был указан пример на языке Go:
resp, err := http.PostForm("site-url", url.Values{"query": {"release"}, "code":{"something"})
Но мне нужно было перевести его в python, получилось так:
import requests
r = requests.post("site-url", data={"query":"release", "code": "something"})
Но это не работает. Подскажите, в чём разница между двумя примерами? В первом случае API Принимает запрос и отвечает, а во втором возвращает ошибку - No query
Ответы (1 шт):
Как верно заметили в комментариях, чтобы увидеть, в чём разница запросов отправляемых на сервер, вам надо поставить сниффер (например, Fiddler) и посмотреть что-же на самом деле происходит.
На Go:
package main
import (
"fmt"
"io/ioutil"
"log"
"net/http"
"net/url"
"os"
)
func main() {
os.Setenv("HTTP_PROXY", "127.0.0.1:8888") // адрес и порт, который слушает Fiddler
resp, err := http.PostForm("http://httpbin.org/post", url.Values{"query": {"release"}, "code": {"something"}})
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println(string(body))
}
Fiddler показывает, что ушёл вот такой запрос:
POST http://httpbin.org/post HTTP/1.1
Host: httpbin.org
User-Agent: Go-http-client/1.1
Content-Length: 28
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip
code=something&query=release
На Python:
import requests
proxies = {
"http": "http://127.0.0.1:8888",
"https": "http://127.0.0.1:8888",
}
r = requests.post("http://httpbin.org/post", data={"query":"release", "code": "something"}, proxies=proxies)
print(r.content)
Уходит:
POST http://httpbin.org/post HTTP/1.1
Host: httpbin.org
Connection: keep-alive
Accept-Encoding: gzip, deflate
Accept: */*
User-Agent: python-requests/2.19.1
Content-Length: 28
Content-Type: application/x-www-form-urlencoded
query=release&code=something
Как можно заметить, различия не существенны и можно сказать что и Go, и Python отправляют одно и тоже. Да, в Python отличается UserAgent, параметры формы идут в другом порядке, есть пара дополнительных заголовков, но всё в пределах допустимого и это никак не должно влиять на разбор запроса сервером.
P.S. В обоих случаях, дополнительно ещё и тестовый сервер (httpbin.org) отвечает, какие заголовки и post он получил. И там тоже всё Ok:
"args": {},
"data": "",
"files": {},
"form": {
"code": "something",
"query": "release"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "28",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.19.1",
"X-Amzn-Trace-Id": "Root=1-5e7a57a4-b9d57d24be4ebb4aa940d53e"
},
"json": null,
"origin": "xxx",
"url": "http://httpbin.org/post"