如何在 R 中使用 POST 请求成功搜索和 API?

How do I successfully search and API using a POST request in R?

我一直在尝试在 https://explorer.natureserve.org/api-docs/ API 中设置搜索,但是,我不断收到以下错误:

"JSON parse error: Cannot deserialize value of type `java.lang.Integer` from Object value (token `JsonToken.START_OBJECT`); nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `java.lang.Integer` from Object value (token `JsonToken.START_OBJECT`)"

我不确定问题出在哪里,因为我在 Python 中有非常相似的代码,但那里的搜索工作正常。

这是我的代码:

search_text = '{
"criteriaType" : "species",
"textCriteria" : [{"paramType" : "textSearch", "searchToken" : "Acanthomintha ilicifolia", "matchAgainst" : "allScientificNames", "operator" : "similarTo"}],
"statusCriteria" : [ ],
"locationCriteria" : [ ],
"pagingOptions" : {"page" : null, "recordsPerPage" : null},
"recordSubtypeCriteria" : [ ],
"modifiedSince" : null,
"locationOptions" : null,
"classificationOptions" : null,
"speciesTaxonomyCriteria" : [ ]}'

search_json = fromJSON(search_text)

searchResults = POST("https://explorer.natureserve.org/api/data/speciesSearch", body=search_json, encode="json")

contentACIL_raw = content(searchResults)

可能会非常混乱decoding/re-encoding JSON 数据。最好将数据作为列表存储在 R 中,然后让 POST 命令负责编码为 JSON。例如

search_data = list(
  criteriaType= "species",  
  textCriteria= list(list(paramType = "textSearch", searchToken = "Acanthomintha ilicifolia", matchAgainst = "allScientificNames", operator = "similarTo")),
  statusCriteria= character(),
  locationCriteria= character(),
  pagingOptions= list(page = NA, recordsPerPage = NA),
  recordSubtypeCriteria = NA,
  modifiedSince = NA,
  locationOptions = NA,
  classificationOptions = NA,
  speciesTaxonomyCriteria = character()
)

searchResults = httr::POST("https://explorer.natureserve.org/api/data/speciesSearch", body=search_data, encode="json")
httr::content(searchResults)

请注意,我必须将“quickSearch”更改为“textSearch”,因为“matchAgainst”似乎不是“quickSearch”的有效选项。

您可以使用

预览编码的 JSON 格式
jsonlite::toJSON(search_data, auto_unbox=TRUE)
# {"criteriaType":"species","textCriteria":[{"paramType":"textSearch",
# "searchToken":"Acanthomintha ilicifolia","matchAgainst":"allScientificNames",
# "operator":"similarTo"}],"statusCriteria":[],"locationCriteria":[],
# "pagingOptions":{"page":null,"recordsPerPage":null},"recordSubtypeCriteria":null,
# "modifiedSince":null,"locationOptions":null,"classificationOptions":null,
# "speciesTaxonomyCriteria":[]}