从GoogleMapsClient响应中获取Google Place Photo的网址

时间:2017-11-25 10:31:24

标签: javascript google-maps express

我正在构建一个API端点,该端点将使用express.js和Node.js client library for Google Maps API Web Services返回Google地方的详细信息和单张照片。下面的端点返回一个地方的详细信息,我无法检索照片的网址。以下是有问题的代码。

谷歌地图客户端有两个请求:

  1. 根据req.params.id获取地点详情,详细信息包含photos数组
  2. 使用上面的photo_reference

    获取照片
    var googleMapsClient = require('@google/maps').createClient({
      key: 'mykeyhere',
      Promise: Promise
    });
    
    exports.getGglPlace = function(req, res) {
    
    googleMapsClient.place({
         placeid: req.params.id
    }).asPromise()
    .then((response) => {
      var venue = response.json.result
    
      if (venue.photos[0]) {
        googleMapsClient.placesPhoto({
          photoreference: venue.photos[0].photo_reference,
          maxwidth: 200
        }).asPromise()
        .then((photo) => {
    
          console.log("Photo:", photo); // this returns a massive chunk of data which I think contains the actual image object also
          venue.photoURL = photo.url; // this doesn't work
    
          res.send(venue);
        })
        .catch((err)=>{
          console.log("Error Getting Photo!", err);
          res.send(venue);
        })
      } else {
        res.send(venue);
      }
    })
    .catch((err) => {
      res.send(404);
    })
    }
    
  3. 知道如何从上面代码中名为photo的响应中获取URL吗?

    如果我尝试直接通过浏览器或邮递员访问API,则会将URL重定向到图像的实际源URL,这是我要添加到venue对象的内容。

    API请求示例:https://maps.googleapis.com/maps/api/place/photo?maxwidth=400&photoreference=CmRaAAAA8NPP1nJJ7RCzcQDGUrpBHJXlzlQkN74dcyQJ2ytVpeYIu47sR-8dfCjke1J5exP-HpkayaXOc26ShsVKkXOaJZBOdpmExUfCzUTIBN3x0uPfR5Nt3PnN-a3GoRVZ7YxKEhBvqXF356Tn9mBJ7lA_JQ_7GhQMKvZkOk-Rs9knsansx5yuhfIvsQ&sensor=false&key=mykeyhere

    重定向到(这是我想要photo.url返回的内容):https://lh3.googleusercontent.com/p/AF1QipPVD12HA5FBnjmiqVLphYgjfPtIPydn4Ie-xGKr=s1600-w200

    感谢任何帮助。

    P.S。我在这里的第一篇文章 - 抱歉,如果我对我的问题不够清楚。

5 个答案:

答案 0 :(得分:3)

以下是我如何解决它。它似乎并不完美,但它确实起到了作用。

响应包含 req 部分,其中包含我可以用来构建URL的密钥。具体来说, response.req.socket._host 键和 response.req.path 键。

以下是我的代码中的内容(其中photo是来自Google API的响应)

venue.photoURL = "https://" + photo.req.socket._host + photo.req.path;

photo.req.socket._host为我提供了 lh3.googleusercontent.com

photo.req.path给了我 / p / AF1QipPVD12HA5FBnjmiqVLphYgjfPtIPydn4Ie-xGKr = s1600-w200

构建的照片网址结果为:https://lh3.googleusercontent.com/p/AF1QipPVD12HA5FBnjmiqVLphYgjfPtIPydn4Ie-xGKr=s1600-w200

答案 1 :(得分:1)

以下代码适用于我的客户端JS项目。因此,我能够将地点数据及其照片检索为有用的链接,并将其推送到我的html上的img src中。也许它可能有用。

public boolean insertAlbum (Album alb)
    {

        boolean ok = ConnexionMySQL.getInstance().actionQuery("Insert into album (CodeA, TitreA, SortieA, IdentC) values ('" + alb.getCodeA() + "','" + alb.getTitreA() +
        "'," + alb.getSortieA() + "," + alb.getCatApp().getIdentC());

        return ok;
    }

答案 2 :(得分:0)

成功的Place Photo请求的响应将是图像,而不是对象文字。

https://developers.google.com/places/web-service/photos

浏览知道如何重定向到照片的方式是通过标题。如果您检查响应,您将看到它返回302(重定向)并跟随响应标头location。您应该能够通过以下方式在快递中获取该标题:

res.get('location');
// => "image url"

答案 3 :(得分:0)

如果您使用邮递员,则必须先进行设置->自动跟随重定向,然后您会看到类似的内容

   <HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="https://lh3.googleusercontent.com/p/blahblah">here</A>.
</BODY></HTML>

按照网址查找图片。

答案 4 :(得分:0)

您可以这样做

axios

axios.get(url).then(res => {
  console.log(res.request._redirectable._options.href));
});

node-fetch

fetch(url).then(res => {
  console.log(res.url);
});

重要:确保已安装并需要使用所需的软件包,并确保所用的URL在浏览器中可用。