Ошибка Clojurescript с GET-запросом cljs-http для файла JSON - неправильно сформирован - PullRequest
0 голосов
/ 10 июля 2019

начинающий клоюрист здесь. Я пытаюсь проанализировать файл JSON, используя Clojurescript и библиотеку cljs-http. У меня странное поведение с использованием следующей функции:

(defn make-remote-call [endpoint]
  (go (let [response (<! (http/get endpoint))]
    (js/console.log (:body response)))))

Это выведет файл json на консоль, но я получу это сообщение об ошибке:

XML Parsing Error: not well-formed
Location: file:///***U2328710-data.json
Line Number 1, Column 1: 

Вещи, которые я пробовал:

  • файл JSON успешно проходит http://jsonlint.com, но https://jsonformatter.curiousconcept.com/ анализирует файл и сообщает Error:Invalid encoding, expecting UTF-8, UTF-16 or UTF-32.[Code 29, Structure 0]
  • та же проблема при развертывании на сервере Apache. Мой файл .htaccess правильно настроен для отправки заголовка содержимого в application / json и charset в utf-8 (хотя я читал, что я должен отправлять UTF-8 заглавными буквами, я не смог этого сделать)
  • Я могу без проблем проанализировать XML-файл с той же функцией
  • Я могу без проблем проанализировать тот же файл JSON, используя устаревший js/XMLHttpRequest

Кончаются идеи - может кто-нибудь помочь, пожалуйста? Интересно, если cljs-http не понимает, что это файл json, могу ли я форсировать его / возможно переопределить заголовки? Спасибо,

1 Ответ

1 голос
/ 12 июля 2019

Я думаю, что это либо какая-то проблема кодирования в вашем файле JSON, либо какая-то другая проблема вне библиотеки cljs-http. Я провел небольшой тест, используя новый проект, созданный с помощью lein new figwheel json-client, и добавил зависимость от [cljs-http "0.1.46"] к project.clj

Для правильного JSON-файла я перешел на https://api.github.com/users/clojure/repos и сохранил содержимое как resources/public/repos.json в папке проекта.

Содержимое моего core.clj файла:

(ns json-client.core
  (:require-macros [cljs.core.async.macros :refer [go]])
  (:require [cljs-http.client :as http]
            [cljs.core.async :refer [<!]]))

(enable-console-print!)

(defn make-remote-call [endpoint]
  (go (let [response (<! (http/get endpoint))]
        (js/console.log (clj->js (:body response)))))) ;; NOTE: cljs->js

(defonce app-state (atom {:text "Hello world!"}))

;; This content is served by figwheel, configured in project.clj
(make-remote-call "http://0.0.0.0:3449/repos.json")

(defn on-js-reload []
  ;; optionally touch your app-state to force rerendering depending on
  ;; your application
  ;; (swap! app-state update-in [:__figwheel_counter] inc)
)

Примечание : есть только одно изменение в строке, которая регистрируется на консоли (используется clj->js), но это все.

... когда я запускаю проект с lein figwheel, это занимает несколько секунд и запускает новую вкладку браузера с проектом, и на консоли я вижу, как она регистрирует содержимое файла JSON:

enter image description here

...