java.net.UnknownHostException: Unable to resolve host “restapi.amap.com“: No address associated with

问题

笔者进行Android开发,控制台报错

java.net.UnknownHostException: Unable to resolve host "restapi.amap.com": No address associated with hostname

详细问题

笔者进行Android开发
页面调用方法代码

ReverseGeocodingExample.main();

方法实现

import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;

public class ReverseGeocodingExample {

    public static void main() {
        try {
            String apiKey = "your_api_key";
            String location = "116.310003,39.991957";

            String adcode = requestReverseGeocoding(apiKey, location);
            System.out.println("adcode: " + adcode);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static String requestReverseGeocoding(String apiKey, String location) throws Exception {
        String urlString = "https://restapi.amap.com/v3/geocode/regeo?key=" + URLEncoder.encode(apiKey, "UTF-8") +
                "&location=" + URLEncoder.encode(location, "UTF-8") +
                "&extensions=all";

        URL url = new URL(urlString);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();

        connection.setRequestMethod("GET");
        int responseCode = connection.getResponseCode();

        StringBuilder response = new StringBuilder();
        String line;
        if (responseCode == HttpURLConnection.HTTP_OK) {
            BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            while ((line = reader.readLine()) != null) {
                response.append(line);
            }
            reader.close();
        } else {
            throw new Exception("HTTP request failed with response code: " + responseCode);
        }

        // 使用 Gson 解析 JSON 数据并提取 adcode
        JsonObject jsonObject = JsonParser.parseString(response.toString()).getAsJsonObject();
        JsonObject regeocode = jsonObject.getAsJsonObject("regeocode");
        return regeocode.toString();
    }

}

控制台报错

W/System.err: java.net.UnknownHostException: Unable to resolve host "restapi.amap.com": No address associated with hostname
W/System.err:     at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:156)
W/System.err:     at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:103)
W/System.err:     at java.net.InetAddress.getAllByName(InetAddress.java:1152)
W/System.err:     at com.android.okhttp.Dns$1.lookup(Dns.java:41)
W/System.err:     at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:178)
W/System.err:     at com.android.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.java:144)
W/System.err:     at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:86)
W/System.err:     at com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:176)
W/System.err:     at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:128)
W/System.err:     at com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:97)
W/System.err:     at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:289)
W/System.err:     at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:232)
W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:465)
W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:411)
W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:542)
W/System.err:     at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getResponseCode(DelegatingHttpsURLConnection.java:106)
W/System.err:     at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:30)
W/System.err:     at com.example.assistingagriculture.activity.delete.ReverseGeocodingExample.requestReverseGeocoding(ReverseGeocodingExample.java:38)
W/System.err:     at com.example.assistingagriculture.activity.delete.ReverseGeocodingExample.main(ReverseGeocodingExample.java:21)
W/System.err:     at com.example.assistingagriculture.activity.normal_mode.YourActivity$WeatherRequestTask.doInBackground(YourActivity.java:368)
W/System.err:     at com.example.assistingagriculture.activity.normal_mode.YourActivity$WeatherRequestTask.doInBackground(YourActivity.java:346)
W/System.err:     at android.os.AsyncTask$3.call(AsyncTask.java:394)
W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:266)
W/System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:305)
W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
W/System.err:     at java.lang.Thread.run(Thread.java:923)
W/System.err: Caused by: android.system.GaiException: android_getaddrinfo failed: EAI_NODATA (No address associated with hostname)
W/System.err:     at libcore.io.Linux.android_getaddrinfo(Native Method)
W/System.err:     at libcore.io.ForwardingOs.android_getaddrinfo(ForwardingOs.java:73)
W/System.err:     at libcore.io.BlockGuardOs.android_getaddrinfo(BlockGuardOs.java:202)
W/System.err:     at libcore.io.ForwardingOs.android_getaddrinfo(ForwardingOs.java:73)
W/System.err:     at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:135)
W/System.err: 	... 26 more

接口服务(注意是Web 服务API)
在这里插入图片描述

解决方案

笔者所需的天气查询服务,是Web服务API,而非Android服务API。
故接口调用请求在JavaWeb程序中实现 而非在Android 程序中实现。
代码核心内容无需修改
Andrioid 请求Javaweb程序(SpringBoot)

public static String requestReverseGeocoding(String apiKey, String location) {
        apiKey = "your_api_key";
        location = "116.310003,39.991957";
        try {
            // 构建请求的URL
            URL url = new URL("http://192.168.43.127:9090/api_request/request_reverse_geo_coding?apiKey=" + apiKey + "&location=" + location);

            // 打开连接
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();

            // 设置请求类型为GET
            connection.setRequestMethod("GET");

            // 获取响应
            InputStream inputStream = connection.getInputStream();
            String response = convertStreamToString(inputStream);
            // 处理响应,这里假设响应是JSON格式的数据
            System.out.println(response);
            return response;

        } catch (IOException e) {
            e.printStackTrace();
            // 处理异常
            return null;
        }
    }

在JavaWeb程序(SpringBoot)中实现高德Web API服务接口调用

@GetMapping("/request_reverse_geo_coding")
    public String requestReverseGeocoding(@RequestParam String apiKey, @RequestParam String location) throws Exception {
        String urlString = "https://restapi.amap.com/v3/geocode/regeo?key=" + URLEncoder.encode(apiKey, "UTF-8") +
                "&location=" + URLEncoder.encode(location, "UTF-8") +
                "&extensions=all";

        URL url = new URL(urlString);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();

        connection.setRequestMethod("GET");
        int responseCode = connection.getResponseCode();

        StringBuilder response = new StringBuilder();
        String line;
        if (responseCode == HttpURLConnection.HTTP_OK) {
            BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            while ((line = reader.readLine()) != null) {
                response.append(line);
            }
            reader.close();
        } else {
            throw new Exception("HTTP request failed with response code: " + responseCode);
        }

        // 使用 Gson 解析 JSON 数据并提取 adcode
        JsonObject jsonObject = JsonParser.parseString(response.toString()).getAsJsonObject();
        JsonObject regeocode = jsonObject.getAsJsonObject("regeocode");
        return regeocode.toString();
    }

产生原因

问题的根本原因是在 Android 应用程序中尝试访问一个 Web 服务 API,但由于网络请求的错误导致无法解析主机名 “restapi.amap.com”,进而无法获取数据。

解决原因

解决方案是将接口调用请求移到 JavaWeb 程序中实现,以确保能够正常进行网络请求并获取所需数据。在 JavaWeb 程序中,通常可以使用 Java 提供的网络请求库(比如 HttpURLConnection 或者更方便的 HttpClient)来实现接口调用,并将获取到的数据返回给 Android 应用程序。

参考文献

产生原因以及解决原因部分内容 部分参考chatgpt

原创不易
转载请标明出处
如果对你有所帮助 别忘啦点赞支持哈
请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞滕人生TYF

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值