Как удалить данные на сервере через API и запрос DELETE в httr - PullRequest
0 голосов
/ 04 апреля 2020

Я новичок во всем этом API, и, конечно, не понимаю всей логики c, но надеюсь, что вы можете помочь мне здесь.

Обратите внимание, что я могу предоставить только обобщенный c пример без воспроизводимого примера, так как сайт, к которому я хочу получить доступ, требует платной регистрации.

Я хочу удалить определенные значения из столбца данных на сервере.

Данные на сервере - это опрос, в котором каждый столбец представляет вопрос опроса. Теперь я хочу удалить из столбца «xyz» случай со значением «ab c».

Страница справки с указанного веб-сайта предоставляет следующую справку о том, как удалить данные:

http://release.decipherinc.com/s/local/beacon.html#data -вход-и-вывод-изменение-удаление-данных

И вот как я пытался добиться удаления данных:

library(httr)
library(tidyverse)
library(jsonlite)

my_data <- data.frame(xyz = c("abc", "def", "ghi"))
todelete <- my_data %>%
  filter(xyz == "abc")

my_platform_key <- "testkey"

# small function for the URL request
api_delete <- function(path)
{
  url <- paste0("release.decipherinc.com/api/v1/", path)
  add_headers(my_platform_key)
  DELETE(url, add_headers('x-apikey' = my_platform_key))
}

delete_request <- api_delete("surveys/MYSURVEY/data/edit?mode=delete&key=xyz&data=todelete")

Я думаю проблема может быть в том, как я задаю параметр data. На странице справки сказано, что это должен быть массив, но не уверен, что достаточно просто передать фрейм данных.

Когда я запускаю этот код, за ним следуют: content(delete_request, encoding = "UTF-8") код ответа 400, что указывает на то, что это не сработало (очевидно):

данные: ожидается массив, а не строка

Что мне нужно изменить в моем коде, чтобы он работал?

Обновление

Копание глубже в топи c Я нашел дополнительную информацию, но она все еще не работает. Согласно некоторому другому сообщению SO, я попробовал следующее:

library(jsonlite)
library(httr)
args <- list(key = unbox("xyz"),
             data = todelete,
             mode = unbox("delete"))

body <- toJSON(args)

DELETE(url         = "release.decipherinc.com/api/v1/surveys/MYSURVEY/data/edit",
       add_headers('x-apikey' = my_platform_key),
       body = body,
       encode = "json")

Я проверил содержимое body, и оно выглядит точно так, как описано в связанной документации, но все равно не работает:

{"key":"xyz","data":[{"xyz":"abc"}],"mode":"delete"}

А ответ сервера:

Response [...URL...]
  Date: 2020-04-04 17:50
  Status: 400
  Content-Type: application/json
  Size: 72 B
{
 "$error": "missing argument 'data'",
 "$code": 400,
 "extra": null
}

1 Ответ

0 голосов
/ 07 апреля 2020

ОК, я понял это самостоятельно с большим количеством проб и ошибок. Мне не хватало одного конкретного параметра в моей функции, то есть content_type. Код ниже работает:

library(httr)
library(tidyverse)
library(jsonlite)

my_data <- data.frame(xyz = c("abc", "def", "ghi"))

todelete <- my_data %>%
  filter(xyz == "abc")

my_platform_key <- "testkey"

args <- list(key = unbox("xyz"),
             data = todelete,
             mode = unbox("delete"))

body <- toJSON(args)

DELETE(url         = "release.decipherinc.com/api/v1/surveys/MYSURVEY/data/edit",
       add_headers('x-apikey' = my_platform_key),
       content_type("application/json"),
       body = body,
       encode = "json")
...