#python #r #json #post #httr
Вопрос:
Я пытаюсь адаптировать свой HTTP — запрос от запуска его на Python к R. Это запрос на публикацию в Python:
import requests
import json
r = requests.post("https://feed-dev.ihsmarkit.com/apikey",
data={'username': 'markit/resellers/API_OPS/accounts/demo.dv', 'password':
'Example@N6'})
print("POST /apikey", r.status_code, r.reason)
apikey = r.text
print(apikey)
Я провел некоторое исследование и обнаружил, что пакет httr в R лучше всего подходит для обработки запросов, связанных с API. Однако я попытался использовать функцию POST() в нескольких попытках, но получил ту же ошибку 400 («MISSING_PARAMETER»: Имя пользователя параметра не указано».) ответов. Вот несколько попыток, которые я использовал:
#attempt 1
response <- POST(url = "https://feed-dev.ihsmarkit.com/apikey",
add_headers(.headers = c("Content-Type"="application/x-www-form-urlencoded")),
authenticate('markit/resellers/API_OPS/accounts/demo.dv', 'Example@N6')
)
#attempt 2
request_body <- data.frame(
username = 'markit/resellers/API_OPS/accounts/demo.dv',
password = 'Example@N6'
)
request_body_json <- toJSON(list(data = request_body), auto_unbox = TRUE)
POST(url = "https://feed-dev.ihsmarkit.com/apikey",
add_headers(.headers = c("Content-Type"="application/x-www-form-urlencoded","Accept"="application/json"),
body = request_body_json))
#attempt 3
result <- POST(url = "https://feed-dev.ihsmarkit.com/apikey",
add_headers(.headers = c("Content-Type"="application/x-www-form-urlencoded","Accept"="application/json")),
body = '{"data":{"username":"markit/resellers/API_OPS/accounts/demo.dv", "password":"Example@N6}}',
encode = 'raw')
Вы знаете, как мне правильно преобразовать свой запрос?
Ответ №1:
Воспользуйся
response <- POST(url = "https://feed-dev.ihsmarkit.com/apikey",
encode = "form",
body= list(
username ='markit/resellers/API_OPS/accounts/demo.dv',
password = 'Example@N6')
)
Просто передайте свои данные в виде списка, и СООБЩЕНИЕ позаботится о форматировании их в виде данных формы, когда вы выберете encode="form"
. Ваш код python, похоже, вообще не использует JSON. У вас просто есть буквальные значения словаря, в котором вы храните свои данные. Используйте только authenticate()
в том случае, когда конечная точка HTTP требует обычной проверки подлинности HTTP. Для конечных точек, которым требуется имя пользователя/пароль в теле сообщения, обычная проверка подлинности HTTP работает не так.
Комментарии:
1. Спасибо, это работает! И спасибо за объяснение, почему другие методы не сработали.