Запрос POST API в Julia

#json #api #post #julia

#json #API #Публикация #julia

Вопрос:

Я пытаюсь преобразовать некоторый код Python в Julia. Вот код Python:

         url = "http://api.scb.se/OV0104/v1/doris/sv/ssd/START/BE/BE0101/BE0101G/BefUtvKon1749"

        json = {
          "query": [
            {
              "code": "Kon",
              "selection": {
                "filter": "item",
                "values": [
                  "1",
                  "2"
                ]
              }
            },
            {
              "code": "ContentsCode",
              "selection": {
                "filter": "item",
                "values": [
                  "000000LV"
                ]
              }
            }
          ],
          "response": {
            "format": "px"
          }
        }

        r = requests.post(url=url, json=json)
  

Ниже приведен код Julia, который не работает, с этим сообщением об ошибке:
синтаксис: { } векторный синтаксис прекращен вокруг
области верхнего уровня path:8 в population_data.jl:8

 using DataFrames, DataFramesMeta, HTTP, JSON3

url = "http://api.scb.se/OV0104/v1/doris/sv/ssd/START/BE/BE0101/BE0101G/BefUtvKon1749"

json = {
  "query": [
    {
      "code": "Kon",
      "selection": {
        "filter": "item",
        "values": [
          "1",
          "2",
          "1 2"
        ]
      }
    },
    {
      "code": "ContentsCode",
      "selection": {
        "filter": "item",
        "values": [
          "000000LV"
        ]
      }
    }
  ],
  "response": {
    "format": "px"
  }
}

r = HTTP.post(url, json)
  

Мои попытки решить эту проблему заключаются в следующем:

  1. Преобразуйте переменную json в строку, используя «»» вокруг нее.
  2. Преобразование строки JSON в типы данных Julia с использованием JSON3.read()
  3. Передача преобразованной строки JSON в POST-запрос. Это выдает следующую ошибку:
 IOError(Base.IOError("read: connection reset by peer (ECONNRESET)", -54) during request(http://api.scb.se/OV0104/v1/doris/sv/ssd/START/BE/BE0101/BE0101G/BefUtvKon1749)
  

Ничего из этого не работает, и я даже не уверен, что речь идет о формате JSON. Возможно, я передаю неправильные параметры в POST-запрос. Что мне делать?

Ответ №1:

Один из способов решения этой проблемы заключается в создании параметров как собственных структур данных Julia и использовании JSON их для преобразования и использования в качестве тела вашего запроса PUT:

Словари в julia создаются с использованием синтаксиса, подобного Dict(key => value) . Массивы создаются с использованием стандартного синтаксиса: [a, b, c] . Собственная структура данных Julia, эквивалентная вашим параметрам, будет выглядеть следующим образом:

 params = Dict(
"query" => [
    Dict("code" => "Kon",
         "selection" => Dict(
             "filter" => "item",
             "values" => [
                 "1",
                 "2",
                 "1 2"
             ]),
         ),
    Dict("code"=> "ContentsCode",
         "selection" => Dict(
             "filter" => "item",
             "values" => [
                 "000000LV"
             ]),
         ),
],
"response" => Dict(
    "format" => "px"
))
  

Затем вы можете использовать JSON.json() для создания JSON-представления его в виде строки и передать его в HTTP-запрос:

 using HTTP
using JSON

url = "http://api.scb.se/OV0104/v1/doris/sv/ssd/START/BE/BE0101/BE0101G/BefUtvKon1749"

# send the request
r = HTTP.request("POST", url,
                 ["Content-Type" => "application/json"],
                 JSON.json(params))

# retrieve the response body as a string
b = String(r.body)