Иногда нулевые результаты с http .async.client и Google Clojure - PullRequest
1 голос
/ 13 мая 2011

У меня есть набор результатов в json с названиями городов, и я хотел бы получить широту для каждого.Следующая функция работает до некоторой степени:

(:require [http.async.client :as client])

(defn get-geo-fact [row]
  (let [ 
    n (string/replace (:cityname row) " "  "+") 
    url (str "http://maps.googleapis.com/maps/api/geocode/json?address=" 
              n "&sensor=false")
    resp (client/GET url) ]
  (client/await resp)
  (make-geo-fact row (json/read-json (client/string resp))) ))

Этот последний вызов make-geo-fact просто возвращает RDF-рендеринг городских координат.Проблема, с которой я сталкиваюсь, состоит в том, что прогон (из примерно 40 вызовов этой функции) возвращает несколько (3-5 пар длинного лат) нулевых результатов для длинных длин.Города, которые возвращают нулевые значения, отличаются от запуска к пробегу - иногда Сан-Хосе получает координаты, а иногда нет.

Первоначально я использовал slurp , чтобы захватить тело URL-адреса и получил аналогичные случайные нули.Я подумал, что не дождался ответа должным образом, но переключение на http.async.client , похоже, не сработало.Есть идеи?

edit :

Вот функция make-geo-fact, которая принимает факт "эта команда находится в этом городе" и ответ от Googleкарты, возвращая вектор из двух троек, которые передают широту и долготу:

(defn make-geo-fact [row response]
  (let [ g (:location (:geometry (first (:results response))))
         lat (str "<" (:team row) ">" 
                  " <http://www.nhl.com/latitude> \"" (:lat g) 
                  "\"^^<http://www.w3.org/2001/XMLSchema#decimal> ." )
         lon (str "<" (:team row) ">" 
                  " <http://www.nhl.com/longitude> \"" (:lng g) 
                  "\"^^<http://www.w3.org/2001/XMLSchema#decimal> ." )  ]
        [lat lon] ))

И вот функция, которую я вызываю, чтобы начать все это:

(defn make-geo-facts []
  (let [ a (bounce team-city (build "files/team-city.nt")) 
         f "files/geo-facts.nt" ]
    (spit f (string/join "\n" (flatten (map get-geo-fact (:rows a)))))  
    f ))

Где bounce Функция выдает запрос выбора SPARQL для модели RDF, для которой создается функция build .

edit 2

Вот рефакторинг, где make-geo-fact не нужен:

  (defn get-geo-fact [row]
    (let [ n (string/replace (:cityname row) " "  "+") 
           url (str "http://maps.googleapis.com/maps/api/geocode/json?address=" n "&sensor=false")
           resp (client/GET url)  ]
      (-> (client/GET url)
           client/await
           client/string
           json/read-json
           :results
           first
           :geometry
           :location )))

    (defn make-geo-facts []
        (let [ a (bounce tc-query (build "files/team-city.nt")) 
               f "files/geo-facts.nt"
               *client* (client/create-client)]
          (try (spit f (string/join "\n" (flatten (map get-geo-fact (:rows a))))))
          (finally (client/close *client*)) ))

Ответы [ 2 ]

1 голос
/ 25 мая 2011

Оказывается, моему коду нужно немного поспать. Я добавил (Thread / sleep 1000) к своей основной функции, и теперь я не получаю нулевые результаты:

(defn get-geo-fact [row]
    (let [ n (string/replace (:cityname row) " "  "+") 
            url (str "http://maps.googleapis.com/maps/api/geocode/json?address=" n "&sensor=false")
            resp (client/GET url)  ]
            (Thread/sleep 1000) 
        (-> (client/GET url)
              client/await
              client/string
              json/read-json
              (make-geo-fact ,,, row ) )))
1 голос
/ 14 мая 2011

Как вы сказали, изменение реализации клиента не имело значения. Я дважды проверил и создал test для версии разработки http.async.client. И всегда получал ответы с телом.

Пожалуйста, предоставьте реализацию make-geo-fact.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...