(eg:基站定位)使用HttpClient模拟Http请求,获取返回结果

先来看一下代码:

/**
 * 通过Lac和cell_id查询经度(longitude)和纬度(latitude)
 * @param lac LAC号码
 * @param cell_id cell_id号码
 * @return Map:key -- 经度:longitude
 *                     纬度:latitude
 *                     地址: address
 */
public Map queryLongitudeAndLatitude(String lac,String cell_id) throws IOException{

    Map<String,String> map = new HashMap<String,String>();

    // 生成一个httpclient对象,模拟http请求
    CloseableHttpClient httpclient = HttpClients.createDefault();
    HttpPost httpPost = new HttpPost("http://www.cellid.cn/m/cidInfo.php?lac=" + lac + "&cell_id=" + cell_id + "&hex=false&flag=2262433451");
    httpPost.setHeader("Accept:","*/*");
    httpPost.setHeader("Accept-Encoding:","gzip, deflate");
    httpPost.setHeader("Connection:","keep-alive");
    httpPost.setHeader("Origin:","http://www.cellid.cn");
    httpPost.setHeader("Referer:","http://www.cellid.cn/m/index.php");//Referer:很多网站如果我们直接访问可能会报非法访问,一般就是这个参数不存在引起的
    HttpResponse response = httpclient.execute(httpPost);
    InputStream fis = response.getEntity().getContent();
    
    //将内容写到StringBuilder中
    BufferedReader reader = new BufferedReader(new InputStreamReader(fis));
    StringBuilder sb = new StringBuilder();
    String line = null;
    while ((line = reader.readLine()) != null) {
        sb.append(line + "\n");
    }
    fis.close();

    //地址被<br>标签包裹
    int a = sb.indexOf("<br>") + "<br>".length();
    int b = sb.lastIndexOf("<br>");
    //经纬度被coord和addressInfo包裹
    int c = sb.indexOf("coord=") + "coord=".length();
    int d = sb.lastIndexOf("&addressInfo");
    //获取经纬度
    String jw = sb.substring(c,d);

    String address = sb.substring(a,b); //地址
    String latitude = jw.substring(0,jw.indexOf(",")); //纬度
    String longitude = jw.substring(jw.indexOf(",") + 1); //经度

    map.put("address",address);
    map.put("latitude",latitude);
    map.put("longitude",longitude);

    return map;
}

对代码中的内容进行一些解释:

因为做的是基站定位相关的内容,所以访问的是我所需要的网站。

httpPost.setHeader("xxxx");

这里设置要根据我们具体要访问哪个网站来设置,F12开发者模式。抓取到请求信息,然后就可以根据请求信息里的内容来进行设置了。

代码中一直到fis.close();这一部分算是全部获取到了返回的response中的entity,接下来就可以按需求来获取值了。我这里需要地址及经纬度,所以获取了这部分的值。

看一下response.entity中有些什么,这样或许会更清楚我上面的代码是在做什么:

sb = {StringBuilder@1808}"基站:34860,62041<br>云南省西双版纳傣族自治州景洪市锦绣路<br><a href='../location.php?lac=34860&cellid=62041&coord=22.01436,100.752683&addressInfo=云南省西双版纳傣族自治州景洪市锦绣路' target='_blank'>(查看地图</a>)"


猜你喜欢

转载自blog.csdn.net/WxQ92222/article/details/79960188
今日推荐