web-dev-qa-db-fra.com

UnknownHostException: nom ou service inconnu

J'essaie de renvoyer certaines données d'une API à l'aide d'OkHttpClient dans com.squareup.okhttp. J'ai rencontré quelques erreurs que j'ai finalement pu surmonter, mais je ne peux pas surmonter cette erreur d'exception d'hôte et rien ici ne semble être suffisamment spécifique à mon cas pour pouvoir être résolu.

Ci-dessous, le code que j'ai essayé avec la sortie avec, si quelqu'un a une idée de comment surmonter l'erreur, je l'apprécierais.

CODE

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();
    }
}

SORTIE

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

Pour une erreur comme "Java.net.UnknownHostException: [hostname]"

La raison en est que votre nom d'hôte n'est pas dans/etc/hosts, la solution est simple:

Sudo vim /etc/hosts

changer la ligne ressemble à:

127.0.0.1  localhost

à:

127.0.0.1  [hostname] localhost

Sauvegarder et quitter. Si le problème persiste, vous devrez peut-être redémarrer ou exécuter:

Sudo ifconfig eth0 down&&Sudo ifconfig eth0 up

Espérons que cela peut vous aider!

10
zhenbo xu

En développant la grande réponse de zhenbo xu, voici ce que j'ai fait pour automatiser les choses avec sed dans EC2.

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

Notez que pour permettre l'expansion variable, les guillemets simples se terminent et redémarrent autour de l'appel de sous-shell.

hostname est un exécutable sur certains systèmes Linux (mais peut-être pas tous, vous pouvez donc utiliser une variable d'environnement à la place, ou supprimer les guillemets autour du sous-shell et utiliser une chaîne statique).

Le \1 est sed magique, il remet la chaîne de recherche "capturée" (s/search/remplacement /) entre parenthèses échappées dans la chaîne de remplacement.

3
dragon788

Puisque vous n'avez pas posté votre code comme l'appel de votre connect(), veuillez donc vous référer à mon code de travail suivant

    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);
        }
    }

Puis à l'intérieur de onCreate:

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

Mon application s'est exécutée et a obtenu le résultat suivant (peut-être à cause d'un jeton expiré/non valide):

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

P/S: assurez-vous d'avoir défini <uses-permission Android:name="Android.permission.INTERNET" /> à l'intérieur AndroidManifest.xml fichier

0
BNK