调用Web服务(包含多个页面)不会加载所有页面(没有添加睡眠延迟)

时间:2017-11-21 02:34:24

标签: web-services codenameone simulator

我的问题是关于我的iPhone设备和代号模拟器(NetBeans)上的一个奇怪的行为。

我调用下面的代码调用google web服务来提供GPS坐标周围的食物位置列表:

调用的Web服务如下(KEY OBSCURED):

https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=40.714353,-74.00597299999998&radius=200&types=food&key=XXXXXXXXXXXXXXXXXXXXXXX

每个结果都包含下一页令牌,因此第二次调用(对于后续页面)如下:

https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=40.714353,-74.00597299999998&radius=200&types=food&key=XXXXXXXXXXXXXXXXXXXXXXX&pagetoken=YYYYYYYYYYYYYYYYYY

public static byte[] getWSResponseData(String urlString, boolean usePost)
{
    ConnectionRequest r = new ConnectionRequest();

    r.setUrl(urlString);
    r.setPost(usePost);


    InfiniteProgress prog = new InfiniteProgress();
    Dialog dlg = prog.showInifiniteBlocking();
    r.setDisposeOnCompletion(dlg);
    NetworkManager.getInstance().addToQueueAndWait(r);

    try
    {
        Thread.sleep(2000);
    }
    catch (InterruptedException ex)
    {
    }

    byte[] responseData = r.getResponseData();


    return responseData;       
}



public static void  getLocationsList(double lat, double lng)
{
    boolean done = false;

    while (!done)
    {
        byte[] responseData = getWSResponseData(finalURL,false);

        result = Result.fromContent(parser.parseJSON(new InputStreamReader(new ByteArrayInputStream(responseData))));
        String venueNames[] = result.getAsStringArray("/results/name");

        nextToken = result.getAsString("/next_page_token");

        if ( nextToken == null || nextToken.equals(""))
            done = true; 
        else
            finalURL = completeURL + "&pagetoken=" + nextToken;
    }
   .....
}

此代码适用于睡眠计时器,但是当我删除Thread.sleep时,只会调用第一页。

任何帮助将不胜感激。

使用调试器没有帮助,因为这是一个计时问题,使用调试器时不会发生此问题。

当我在代码中放入一些打印语句时

while (!done)
{
   String nextToken = null;
   **System.out.println(finalURL);**
   ...
}
System.out.println("Total Number of entries returned: " + itemCount);

我得到以下输出:

首次运行(没有睡眠): https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=40.714353,-74.00597299999998&radius=200&types=food&key=XXXXXXXX

https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=40.714353,-74.00597299999998&radius=200&types=food&key=XXXXXXXX&pagetoken=CqQCF ... 返回的总条目数:20

使用网络监视器,我看到对第二个WS调用的响应返回:

{
  "html_attributions" : [],
  "results" : [],
  "status" : "INVALID_REQUEST" 
}

这很奇怪,因为当我将WS URL剪切并粘贴到我的浏览器中时,它工作正常......

第二次跑步(休眠):

https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=40.714353,-74.00597299999998&radius=200&types=food&key=XXXXXXXXX

https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=40.714353,-74.00597299999998&radius=200&types=food&key=XXXXXXXXX&pagetoken=CqQCFQEAA ...

https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=40.714353,-74.00597299999998&radius=200&types=food&key=XXXXXXXXX&pagetoken=CsQDtQEAA ... 返回的总条目数:60

2 个答案:

答案 0 :(得分:1)

好吧,这似乎是一个谷歌API问题,如下所示:

Paging on Google Places API returns status INVALID_REQUEST

我仍然无法通过他们建议的随机参数更改WS URL来使其工作,但如果我让它工作,我将继续尝试并发布一些内容。现在我只会在看似有效的通话之间保持2秒的延迟。

答案 1 :(得分:0)

很好地放弃了使用谷歌WS并切换到Yelp,效果很好:

https://api.yelp.com/v3/businesses/search?.....