clojure的http.async.client和google偶尔出现空结果



我有一个带有城市名称的 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 个经度对)纬度的空结果。 返回 null 值的城市因运行而异 - 有时圣何塞会获取坐标,有时不会。

我最初使用 slurp 来抓取 url 的正文,并得到了类似的偶尔空值。 我想我没有正确等待响应,但切换到 http.async.client 似乎并没有起到作用。 有什么想法吗?

编辑

下面是make-geo-fact函数,它采用"这个团队位于这个城市"的事实和谷歌地图的响应,返回两个三元组的向量,传达纬度和经度:

(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 ))

其中,反弹函数针对RDF模型发出SPARQL选择查询,该查询使用构建函数实例化。

编辑 2

下面是一个不需要制作地理事实的重新因素:

  (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*)) ))

正如您所说,更改客户端实现并没有产生任何影响。我仔细检查并为http.async.client的开发版本创建了一个测试。并且总是得到身体的回应。

请提供虚构的地理事实实施。

事实证明,我的代码需要一点睡眠。 我在我的核心函数中添加了(线程/睡眠 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 ) )))

最新更新