java 调用 360 接口实现批量查询手机号码归属地

网上的手机号码归属地查询,要么限制查询条数,要么收费,于是找到一个 360 提供的查询 api

使用多线程异步查询,Future 确保查询结果顺序与输入顺序一致

核心 Controller

java 复制代码
package com.example.phonenumber.controller;

import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

@RestController
@RequestMapping("/api")
public class PhoneController {

    @Autowired
    private RestTemplate restTemplate;

    private static final int THREAD_POOL_SIZE = 8;

    @GetMapping("/search")
    public String search() {

        String url = "http://cx.shouji.360.cn/phonearea.php?number=";

        String[] phoneNumberList = getPhoneNumberList();

        ExecutorService executorService = Executors.newFixedThreadPool(THREAD_POOL_SIZE);
        List<Future<Map<String, String>>> futures = new ArrayList<>();

        for (String number : phoneNumberList) {
            Future<Map<String, String>> future = executorService.submit(() -> processPhoneNumber(url, number));
            futures.add(future);
        }

        // 等待所有任务完成
        for (Future<Map<String, String>> future : futures) {
            try {
                Map<String, String> result = future.get();
                // 在这里,你可以将结果保存起来,比如放到一个 List 中
                System.out.println(result.get("number") + "\t" + result.get("province") + "\t" + result.get("city") + "\t" + result.get("sp"));
            } catch (InterruptedException | ExecutionException e) {
                e.printStackTrace(); // 在实际应用中需要适当处理异常
            }
        }
        executorService.shutdown();
        return "success";
    }
    
    // 调用接口查询
    private Map<String, String> processPhoneNumber(String url, String number) {
        String response = restTemplate.getForObject(url + number, String.class);
        JSONObject responseJson = JSONUtil.parseObj(response);

        Map<String, String> result = new HashMap<>();
        result.put("number", number);
        // 解析响应数据
        if (responseJson.getInt("code") == 0) {
            JSONObject dataJson = responseJson.getJSONObject("data");
            // 省份
            result.put("province", dataJson.getStr("province"));
            // 城市
            result.put("city", dataJson.getStr("city"));
            // 运营商
            result.put("sp", dataJson.getStr("sp"));
        } else {
            result.put("error", "电话号码有误");
        }
        return result;
    }

    // 电话号码列表,以逗号分隔
    private String[] getPhoneNumberList() {
        String phoneNumberStr =
                "15649408889," +
                        "13333857377," +
                        "18898135919," +
                        "15037601625," +
                        "15890350177," +
                        "15890350177," +
                        "13673379352," +
                        "13673379352," +
                        "13849159230," +
                        "18937807559," +
                        "15649408889," +
                        "13333857377"; // 你的电话号码列表
        return phoneNumberStr.split(",");
    }
}

浏览器访问 http://localhost:8080/api/search

结果截图:

完整源码可下载

相关推荐
牛大了202324 分钟前
场景题:数据迁移解决方案
开发语言
认真的酒窝8 小时前
自己动手开发编译器(十一)语义分析
java·开发语言
wbs_scy10 小时前
Linux C++ 高并发编程:线程池全链路深度解析,从原理到手撕实现
java·开发语言
JAVA面经实录91710 小时前
Linux 常用命令完整知识体系
java·linux·开发语言·汇编
贪玩的蛋挞10 小时前
C#与闭包
开发语言·c#
端庄的战斗机11 小时前
javascript 设计模式(文章很长,请自备瓜子,水果和眼药水)
开发语言·javascript·设计模式
Full Stack Developme11 小时前
Java LRU 与 LFU 算法及应用
java·开发语言·算法
C语言小火车13 小时前
C++ 堆排序深度精讲:基于完全二叉树的选择排序进化,最坏情况 O(n log n) 的稳定王者
开发语言·c++·算法·排序算法·堆排序
北冥you鱼13 小时前
abigen 最佳实践:从入门到精通,高效生成 Go 语言合约绑定
开发语言·golang·区块链
程序员老油条13 小时前
WSL2 + Docker Desktop:Windows 下的完美 Java 开发环境
java·windows·docker·wsl2