当前位置: 首页 > 知识库问答 >
问题:

改造2无法解析主机[关闭]

周阳波
2023-03-14

此问题是由打字错误或无法再复制的问题引起的。虽然这里可能有类似的问题,但这一问题的解决方式不太可能对未来的读者有所帮助。

在我以前版本的应用程序中,我使用了Apache客户端,所有的东西都工作了,而且仍然工作。但由于性能有所提高,我们决定进行改装。问题是每次我都会遇到“无法解析主机”xxxxxx:没有与主机名关联的地址”。

我把这个放在舱单里了

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

我还忘了什么吗?

这是url:https://www.hbapimanager.azure-api.net/Wallet/CheckNumber

P、 我已经为此挣扎了将近一周

编辑:这是我的改装工厂类:

private static HttpLoggingInterceptor logging = new HttpLoggingInterceptor()
        .setLevel(BuildConfig.DEBUG ? HttpLoggingInterceptor.Level.BODY : HttpLoggingInterceptor.Level.NONE);

private static OkHttpClient.Builder httpClient = new OkHttpClient.Builder()
        .addInterceptor(logging);

private static HttpUrl url = new HttpUrl.Builder()
        .scheme("https")
        .host(Constants.Network.HOST)
        .build();

private static Retrofit.Builder builder =
        new Retrofit.Builder()
                .baseUrl(url)
                .addConverterFactory(GsonConverterFactory.create());

public static <T> T createRetrofitService(final Class<T> clazz) {
    Retrofit retrofit = builder.client(httpClient.build()).build();
    return retrofit.create(clazz);
}

这是请求的接口

    @Headers({
        Constants.Network.HEADER_TYPE,
        Constants.Network.HEADER_KEY
})
@POST(Constants.Network.CHECK_NUMBER)
Call<StatusData> postCheckNumber(@Body CheckNumberPoRD checkNumberPoRD);

@Headers({
        Constants.Network.HEADER_TYPE,
        Constants.Network.HEADER_KEY
})
@GET(Constants.Network.CHECK_NUMBER)
Call<CheckNumberGRD> getCheckNumber(
        @Query("PrimaryKey") String primaryKey,
        @Query("RowKey") String rowKey
);

我得到了

09-06 16:58:50.958 7229-7283/kz.halykbank.halykewallet D/OkHttp: --> POST https://www.hbapimanager.azure-api.net/Wallet/CheckNumber http/1.1
09-06 16:58:50.959 7229-7283/kz.halykbank.halykewallet D/OkHttp: Content-   Type: application/json
09-06 16:58:50.959 7229-7283/kz.halykbank.halykewallet D/OkHttp: Content-Length: 27
09-06 16:58:50.959 7229-7283/kz.halykbank.halykewallet D/OkHttp: Ocp-Apim-Subscription-Key: xxxxxxxxxxxxxxxxxxxxxxxxx
09-06 16:58:50.959 7229-7283/kz.halykbank.halykewallet D/OkHttp: {"phone":"x(xxx)xxx-xx-xx"}
09-06 16:58:50.959 7229-7283/kz.halykbank.halykewallet D/OkHttp: --> END POST (27-byte body)
09-06 16:58:51.666 7229-7283/kz.halykbank.halykewallet D/OkHttp: <-- HTTP FAILED: java.net.UnknownHostException: Unable to resolve host "www.hbapimanager.azure-api.net": No address associated with hostname

共有3个答案

壤驷华美
2023-03-14

您肯定遇到了这样一个问题:您的基本URL如下所示:

http://blah.com/v1/blah

你的服务看起来像

@GET("/blah/blah/blah")

但你必须让它看起来像这样:

http://blah.com/v1/blah/

你的服务需要看起来像

@GET("blah/blah/blah")
彭高畅
2023-03-14
HttpUrl baseUrl = new HttpUrl.Builder()
                .scheme("https")
                .host("www.hbapimanager.azure-api.net")
                .encodedPath("/Wallet/")
                .build();

OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .addInterceptor(new AdditionalHttpHeadersInterceptor(headersProvider))
                .addInterceptor(httpLoggingInterceptor)
                .build();

ApiService apiService = new Retrofit.Builder()
                .baseUrl(baseUrl)
                .client(okHttpClient)
                .addConverterFactory(MoshiConverterFactory.create(moshi))
                .build()
                .create(ApiService.class);

ApiService。Java语言

@Headers({
        Constants.Network.HEADER_TYPE,
        Constants.Network.HEADER_KEY
})
@GET(Constants.Network.CHECK_NUMBER)
Call<CheckNumberGRD> getCheckNumber(
        @Query("PrimaryKey") String primaryKey,
        @Query("RowKey") String rowKey
);

其中<代码>常数。网络CHECK\u NUMBER是无斜杠的“CheckNumber”

但是,由于https,您可能必须设置自定义ssl套接字工厂。最简单的方法是next:

创建自定义SSL工厂类

public class TLSSocketFactory extends SSLSocketFactory {

    private SSLSocketFactory internalSSLSocketFactory;

    public TLSSocketFactory() {
        SSLContext context = null;
        try {
            context = SSLContext.getInstance("TLS");
            context.init(null, null, null);
        } catch (NoSuchAlgorithmException | KeyManagementException e) {
            //TODO check it and fix
            throw new RuntimeException(e);
        }
        internalSSLSocketFactory = context.getSocketFactory();
    }

    @Override
    public String[] getDefaultCipherSuites() {
        return internalSSLSocketFactory.getDefaultCipherSuites();
    }

    @Override
    public String[] getSupportedCipherSuites() {
        return internalSSLSocketFactory.getSupportedCipherSuites();
    }

    @Override
    public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException {
        return enableTLSOnSocket(internalSSLSocketFactory.createSocket(s, host, port, autoClose));
    }

    @Override
    public Socket createSocket(String host, int port) throws IOException, UnknownHostException {
        return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port));
    }

    @Override
    public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException, UnknownHostException {
        return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port, localHost, localPort));
    }

    @Override
    public Socket createSocket(InetAddress host, int port) throws IOException {
        return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port));
    }

    @Override
    public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException {
        return enableTLSOnSocket(internalSSLSocketFactory.createSocket(address, port, localAddress, localPort));
    }

    private Socket enableTLSOnSocket(Socket socket) {
        if (socket != null && (socket instanceof SSLSocket)) {
            ((SSLSocket) socket).setEnabledProtocols(new String[]{"TLSv1.1", "TLSv1.2"});
        }
        return socket;
    }
}

以及您的自定义X509 trust manager类

public class CustomX509TrustManager implements X509TrustManager {

    @SuppressLint("TrustAllX509TrustManager")
    @Override
    public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
    }

    @SuppressLint("TrustAllX509TrustManager")
    @Override
    public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
    }

    @Override
    public X509Certificate[] getAcceptedIssuers() {
        return new X509Certificate[]{};
    }
}

创建超文本传输协议客户端

OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .sslSocketFactory(new CustomX509TrustManager(), new TLSSocketFactory())
                .addInterceptor(new AdditionalHttpHeadersInterceptor(headersProvider))
                .addInterceptor(httpLoggingInterceptor)
                .build();
齐朝明
2023-03-14

我的问题是我试图将请求发送到https://www.example.com.然而,没有www.example。服务器主机中的com,但仅为示例。通用域名格式。

 类似资料:
  • 问题内容: 我在Ubuntu操作系统上使用了2个容器:Gitlab-ce和gitlab-runner 容器名称是:和 我通过访问我的gitlab应用 我使用以下命令成功注册了跑步者: 然后,当我开始工作时,出现以下错误消息: 在这两个容器中,我都可以访问主机名。我认为问题来自无法解决主机的高山图像。 我该如何解决? 谢谢 编辑1 docker-compose.yml 编辑2 docker-comp

  • 我的android应用程序中的Amazon analytics正在尝试连接到此主机“mobileanalytics.eu-west-1.amazonaws.com”,但无法解决此问题,导致以下错误: I/AmazonHttpClient:无法执行HTTP请求:无法解析主机“mobileanalytics.eu-west-1.amazonaws.com”:没有与主机名10-12 14:05:34.8

  • 无法解析以下json数据。获得成功响应但返回的正文为空以下是我通过Web浏览器获得的json响应。 下面是用于解析所用响应类的模型类 Departure.java 调用api 我从浏览器中得到了正确的响应。但当通过改装库调用时,获得成功响应(200),但正文为空。 我从浏览器中得到了正确的响应。但当通过改装库调用时,获得成功响应(200),但正文为空。

  • 问题内容: 在我的用于读取RSS链接的Android应用程序中,出现此错误: java.net.UnknownHostException:无法解析主机“ example.com”;没有与主机名关联的地址。 在模拟器中,我可以通过浏览器连接到Google。请帮助我解决此问题。 问题答案: 您可能没有权限。尝试将它添加到您的文件中: 注:以上不 必须 的前右侧的标签,但这是把它的好/正确的位置。 注意

  • 当来自后台服务和移动屏幕的API调用关闭时。出现以下错误。 java.net.无法解析主机:没有与主机名相关联的地址W/System.err:在java.net.InetAddress.lookupHostByName(InetAddress.java:424)在java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)在java.net

  • 当我尝试在android应用程序上按主机名获取ip时,我遇到了一个类似的奇怪错误。 类似的问题在IOs上返回的结果是whitout problems,但我的应用程序android没有返回任何东西。 我创建这些函数来测试我的应用程序: 但是类似的代码,在IOs上,如果我搜索我自己托管的服务器,会返回一个有效的结果,但是在android上搜索相同的页面或服务器时,结果会给我一个“无法解析主机”的警告。