JAVA http请求接口数据

本次以访问百度地图服务API 为例 

 编写访问程序 

一、解析url 方法  把返回数据 封装成StringBuffer 字符串

public static StringBuffer httpsRequest(String requestUrl, String requestMethod, String output) throws IOException,

        UnsupportedEncodingException {

    URL url = new URL(requestUrl);

    if (requestUrl.startsWith("https")) {

        HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();

        connection.setDoOutput(true);

        connection.setDoInput(true);

        connection.setUseCaches(false);

        connection.setRequestMethod(requestMethod);

        if (null != output) {

            OutputStream outputStream = connection.getOutputStream();

            outputStream.write(output.getBytes("UTF-8"));

            outputStream.close();

        }

        // 从输入流读取返回内容

        InputStream inputStream = connection.getInputStream();

        InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");

        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

        String str = null;

        StringBuffer buffer = new StringBuffer();

        while ((str = bufferedReader.readLine()) != null) {

            buffer.append(str.trim());

        }

        bufferedReader.close();

        inputStreamReader.close();

        inputStream.close();

        inputStream = null;

        connection.disconnect();

        return buffer;

    } else {

        HttpURLConnection connection = (HttpURLConnection) url.openConnection();

        connection.setDoOutput(true);

        connection.setDoInput(true);

        connection.setUseCaches(false);

        connection.setRequestMethod(requestMethod);

        if (null != output) {

            OutputStream outputStream = connection.getOutputStream();

            outputStream.write(output.getBytes("UTF-8"));

            outputStream.close();

        }

        // 从输入流读取返回内容

        InputStream inputStream = connection.getInputStream();

        InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");

        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

        String str = null;

        StringBuffer buffer = new StringBuffer();

        while ((str = bufferedReader.readLine()) != null) {

            buffer.append(str.trim());

        }

        bufferedReader.close();

        inputStreamReader.close();

        inputStream.close();

        inputStream = null;

        connection.disconnect();

        return buffer;

    }

}

二、调用解析方法 处理接口返回数据

/**
 * 地铁信息类
 * @return
 */
public class StationInfo {
    private String stationName;
    private String lng;
    private String lat;
    private String subway;
    public String getStationName() {
        return stationName;
    }
    public void setStationName(String stationName) {
        this.stationName = stationName;
    }
    public String getLng() {
        return lng;
    }
    public void setLng(String lng) {
        this.lng = lng;
    }
    public String getLat() {
        return lat;
    }
    public void setLat(String lat) {
        this.lat = lat;
    }
    public String getSubway() {
        return subway;
    }
    public void setSubway(String subway) {
        this.subway = subway;
    } 
}

/**
 * 根据经纬度,及其范围距离来获取地铁站点集合
 * @param lng
 * @param lat
 * @param range
 * @return
 */
public List<StationInfo> getStationByLngLat(String lng, String lat, int range){
 
 
    int radius=range;//搜索的半径范围  
    String url="http://api.map.baidu.com/place/v2/search?query=地铁站&page_size=10&page_num=0&scope=1&location="+lat+","+lng+"&radius="+radius+"&output=json&ak={百度服务API秘钥}";
    List<StationInfo> list=new ArrayList<StationInfo>();
    try {
        //  System.out.println(HttpConnectionUtil.httpsRequest(url, "GET", null).toString());
        JSONObject jsonObject= JSONObject.fromObject( HttpConnectionUtil.httpsRequest(url, "GET", null).toString());
       // System.out.println("我是:"+jsonObject.get("results"));
        // System.out.println("我是2:"+jsonObject.get("total"));

        JSONArray arrays=jsonObject.getJSONArray("results");
        if(arrays==null){//如果没有则返回空
            return null;
        }
        if(arrays.size()>0){
            for (int i=0;i<arrays.size();i++){
                StationInfo stationInfo=new StationInfo();
                JSONObject jsonObject1=JSONObject.fromObject(arrays.getJSONObject(i));
                stationInfo.setLat(jsonObject1.getJSONObject("location").get("lat").toString());
                stationInfo.setLat(jsonObject1.getJSONObject("location").get("lng").toString());
                stationInfo.setStationName(jsonObject1.get("name").toString());
                String subwayStr=jsonObject1.get("address").toString();
                String[] subways=subwayStr.split(";");
                stationInfo.setSubway(subways[0]);
                list.add(stationInfo); 
            }
        }
 
 
    } catch (IOException e) {
        e.printStackTrace();
    }
    return list;
}
      
/**
 * 调用方法查看结果
 */
public static void main(String[] args) throws Exception {
    String lat = "39.915"; 
    String lng = "116.404";  
    Integer radius = 500; // 圆形区域大小
    MapUtil mapUtil = new MapUtil();
    List<StationInfo> list = mapUtil.getStationByLngLat(lng, lat, radius);
    for (StationInfo temp : list) {
        System.out.println(temp.getStationName());
    }
}
 
  
 
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Java中的多线程技术来并发请求接口获取数据。一种简单的实现方式是使用Java中的Executor框架来创建线程池,并使用线程池中的线程来执行接口请求任务。 以下是一个简单的示例代码: ```java import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class ApiRequester { private static final int THREAD_POOL_SIZE = 10; public static void main(String[] args) { // 创建线程池 ExecutorService executor = Executors.newFixedThreadPool(THREAD_POOL_SIZE); // 创建任务列表 List<ApiRequestTask> tasks = new ArrayList<>(); tasks.add(new ApiRequestTask("http://example.com/api1")); tasks.add(new ApiRequestTask("http://example.com/api2")); tasks.add(new ApiRequestTask("http://example.com/api3")); try { // 提交任务并获取Future对象列表 List<Future<String>> futures = executor.invokeAll(tasks); // 处理任务结果 for (Future<String> future : futures) { String result = future.get(); System.out.println(result); } } catch (Exception e) { e.printStackTrace(); } // 关闭线程池 executor.shutdown(); } } class ApiRequestTask implements Callable<String> { private String apiUrl; public ApiRequestTask(String apiUrl) { this.apiUrl = apiUrl; } @Override public String call() throws Exception { // 发送HTTP请求并获取响应 String response = sendHttpRequest(apiUrl); // 处理响应并返回结果 String result = processApiResponse(response); return result; } private String sendHttpRequest(String apiUrl) { // 发送HTTP请求并获取响应 // ... return "API response"; } private String processApiResponse(String response) { // 处理API响应并返回结果 // ... return "Processed API response"; } } ``` 在上面的示例代码中,我们首先创建了一个固定大小的线程池,并将其用于执行接口请求任务。然后,我们创建了一个任务列表,其中包含了需要请求的接口地址。接下来,我们使用Executor框架的invokeAll方法将任务列表提交给线程池,并获取了一个Future对象列表。最后,我们遍历Future对象列表,获取任务结果并进行处理。 注意,在实际的应用中,需要根据具体的需求来选择合适的线程池大小和任务列表。同时,需要注意避免过度并发导致接口请求过于频繁,可能会给接口服务器带来过大的负担。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值