web-dev-qa-db-ja.com

UnknownHostException:名前またはサービスが不明です

Com.squareup.okhttpのOkHttpClientを使用して、APIから一部のデータを返そうとしています。私は最終的に克服できたいくつかのエラーに遭遇しましたが、このホスト例外エラーを乗り越えることができず、ここに何も解決するために私のケースに十分具体的ではないようです。

以下は私がそれを使って出力と一緒に試みたコードです、誰かがエラーを克服する方法を知っているなら、私はそれを感謝します。

[〜#〜]コード[〜#〜]

public void connect() {         
    OkHttpClient client = new OkHttpClient();

    com.squareup.okhttp.Request request = new com.squareup.okhttp.Request.Builder()
    .url("https://socialweb-analytics.lcloud.com/api/public/reports/jobs?companyKey=ato")
    .get()
    .addHeader("authorization", "Basic c2RidXNpbmVzc2FuYWx5dGljc0BhdG8uZ292LmF1OkFuYWx5dGljezEh")
    .addHeader("cache-control", "no-cache")
    .addHeader("postman-token", "65ef5553-77b5-053f-9c01-4fdf76bdc92f")
    .build();

    System.out.println(request.toString());

    try {
        Response response = client.newCall(request).execute();
        System.out.println(response);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

[〜#〜]出力[〜#〜]

Request{method=GET, url=https://socialweb-analytics.lcloud.com/api/public/reports/jobs?companyKey=ato, tag=null}
Java.net.UnknownHostException: socialweb-analytics.lcloud.com: Name or service not known
    at Java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
    at Java.net.InetAddress$1.lookupAllHostAddr(InetAddress.Java:922)
    at Java.net.InetAddress.getAddressesFromNameService(InetAddress.Java:1314)
    at Java.net.InetAddress.getAllByName0(InetAddress.Java:1267)
    at Java.net.InetAddress.getAllByName(InetAddress.Java:1183)
    at Java.net.InetAddress.getAllByName(InetAddress.Java:1119)
    at com.squareup.okhttp.internal.Network$1.resolveInetAddresses(Network.Java:29)
    at com.squareup.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.Java:187)
    at com.squareup.okhttp.internal.http.RouteSelector.nextProxy(RouteSelector.Java:156)
    at com.squareup.okhttp.internal.http.RouteSelector.next(RouteSelector.Java:98)
    at com.squareup.okhttp.internal.http.HttpEngine.createNextConnection(HttpEngine.Java:344)
    at com.squareup.okhttp.internal.http.HttpEngine.connect(HttpEngine.Java:327)
    at com.squareup.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.Java:245)
    at com.squareup.okhttp.Call.getResponse(Call.Java:267)
    at com.squareup.okhttp.Call$ApplicationInterceptorChain.proceed(Call.Java:224)
    at com.squareup.okhttp.Call.getResponseWithInterceptorChain(Call.Java:195)
    at com.squareup.okhttp.Call.execute(Call.Java:79)
    at technical_services.persistence.lithium.LithiumDataStore.connect1(LithiumDataStore.Java:127)
    at application.lithium_etl.LithiumTestController.main(LithiumTestController.Java:24)
8

「Java.net.UnknownHostException:[hostname]」のようなエラーの場合

理由は、ホスト名が/ etc/hostsにないためです。解決策は簡単です。

Sudo vim /etc/hosts

行を次のように変更します。

127.0.0.1  localhost

に:

127.0.0.1  [hostname] localhost

保存して終了。それでも問題が解決しない場合は、再起動または実行する必要があります。

Sudo ifconfig eth0 down&&Sudo ifconfig eth0 up

お役に立てれば幸いです。

10
zhenbo xu

Zhenbo xuの素晴らしい答えを拡張すると、EC2でsedを使って物事を自動化するためにこれを行いました。

Sudo sed -i -e '/127.0.0.1/ s/\(localhost\)/'$(hostname)' \1/' /etc/hosts

変数の展開を可能にするため、サブシェル呼び出しの前後で一重引用符が終了して再起動することに注意してください。

hostnameは一部のLinuxシステムで実行可能ファイルです(ただし、すべてではない可能性があるため、代わりに環境変数を使用するか、サブシェルの周りの引用符を削除して静的文字列を使用できます)。

\1sedマジックです。「キャプチャされた」検索文字列(s/search/replacement /)をエスケープされた括弧に入れて置換文字列に戻します。

3
dragon788

connect()がどのように呼び出されたかをコードに投稿していないので、次の作業コードを参照してください

    private class StringRequest extends AsyncTask<Void, Void, String> {
        @Override
        protected String doInBackground(Void... voids) {
            OkHttpClient client = new OkHttpClient();
            Request request = new Request.Builder()
                    .url("https://socialweb-analytics.lcloud.com/api/public/reports/jobs?companyKey=ato")
                    .addHeader("authorization", "Basic c2RidXNpbmVzc2FuYWx5dGljc0BhdG8uZ292LmF1OkFuYWx5dGljezEh")
                    .addHeader("cache-control", "no-cache")
                    .addHeader("postman-token", "65ef5553-77b5-053f-9c01-4fdf76bdc92f")
                    .build();
            try {
                Response response = client.newCall(request).execute();
                return response.body().string();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            System.out.println(s);
        }
    }

次に、onCreate内で:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mTextView = (TextView) findViewById(R.id.textView);
    new StringRequest().execute();
}

私のアプリが実行され、次の結果が得られました(おそらくトークンの期限切れ/無効のため):

I/System.out: {"code":500,"message":"There was an error processing your request. It has been logged (ID a2f28b587b2f9dcc)."}

P/S:<uses-permission Android:name="Android.permission.INTERNET" />内部AndroidManifest.xmlファイル

0
BNK