Реплицируйте запросы Python.post в R с помощью сообщения httr

#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. Спасибо, это работает! И спасибо за объяснение, почему другие методы не сработали.