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)
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!
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.
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