Je suis en train d'effectuer une authentification http de base avec l'objet HttpURLConnection
en Java.
URL urlUse = new URL(url);
HttpURLConnection conn = null;
conn = (HttpURLConnection) urlUse.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Content-length", "0");
conn.setUseCaches(false);
conn.setAllowUserInteraction(false);
conn.setConnectTimeout(timeout);
conn.setReadTimeout(timeout);
conn.connect();
if(conn.getResponseCode()==201 || conn.getResponseCode()==200)
{
success = true;
}
J'attends un objet JSON, ou des données de chaîne au format d'un objet JSON valide, ou HTML avec du texte brut simple qui est un code JSON valide. Comment puis-je accéder à cela à partir de HttpURLConnection
après qu'il renvoie une réponse?
Vous pouvez obtenir des données brutes en utilisant la méthode ci-dessous. Par ailleurs, ce modèle est pour Java 6. Si vous utilisez Java 7 ou plus récent, veuillez considérer modèle d’essai avec ressources) =.
public String getJSON(String url, int timeout) {
HttpURLConnection c = null;
try {
URL u = new URL(url);
c = (HttpURLConnection) u.openConnection();
c.setRequestMethod("GET");
c.setRequestProperty("Content-length", "0");
c.setUseCaches(false);
c.setAllowUserInteraction(false);
c.setConnectTimeout(timeout);
c.setReadTimeout(timeout);
c.connect();
int status = c.getResponseCode();
switch (status) {
case 200:
case 201:
BufferedReader br = new BufferedReader(new InputStreamReader(c.getInputStream()));
StringBuilder sb = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
sb.append(line+"\n");
}
br.close();
return sb.toString();
}
} catch (MalformedURLException ex) {
Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex);
} finally {
if (c != null) {
try {
c.disconnect();
} catch (Exception ex) {
Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex);
}
}
}
return null;
}
Et vous pouvez ensuite utiliser la chaîne renvoyée avec Google Gson pour mapper JSON sur un objet de la classe spécifiée, comme ceci:
String data = getJSON("http://localhost/authmanager.php");
AuthMsg msg = new Gson().fromJson(data, AuthMsg.class);
System.out.println(msg);
Il existe un exemple de classe AuthMsg:
public class AuthMsg {
private int code;
private String message;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
JSON renvoyé par http: //localhost/authmanager.php doit ressembler à ceci:
{"code":1,"message":"Logged in"}
Cordialement
Définissez la fonction suivante (pas la mienne, je ne sais pas où je l’ai trouvée il y a longtemps):
private static String convertStreamToString(InputStream is) {
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line = null;
try {
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return sb.toString();
}
Ensuite:
String jsonReply;
if(conn.getResponseCode()==201 || conn.getResponseCode()==200)
{
success = true;
InputStream response = conn.getInputStream();
jsonReply = convertStreamToString(response);
// Do JSON handling here....
}
De plus, si vous souhaitez analyser votre objet en cas d'erreur http (codes 400-5 **), vous pouvez utiliser le code suivant: (remplacez simplement 'getInputStream' par 'getErrorStream':
BufferedReader rd = new BufferedReader(
new InputStreamReader(conn.getErrorStream()));
StringBuilder sb = new StringBuilder();
String line;
while ((line = rd.readLine()) != null) {
sb.append(line);
}
rd.close();
return sb.toString();
La chaîne JSON sera simplement le corps de la réponse que vous aurez récupérée à partir de l'URL que vous avez appelée. Alors ajoutez ce code
...
BufferedReader in = new BufferedReader(new InputStreamReader(
conn.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();
Cela vous permettra de voir le JSON retourné à la console. La seule chose qui vous manque alors est l'utilisation d'une bibliothèque JSON pour lire ces données et vous fournir une représentation Java.
Cette fonction sera utilisée pour récupérer les données depuis l’url sous la forme d’un objet HttpResponse.
public HttpResponse getRespose(String url, String your_auth_code){
HttpClient client = new DefaultHttpClient();
HttpPost postForGetMethod = new HttpPost(url);
postForGetMethod.addHeader("Content-type", "Application/JSON");
postForGetMethod.addHeader("Authorization", your_auth_code);
return client.execute(postForGetMethod);
}
La fonction ci-dessus est appelée ici et nous recevons une forme de chaîne du json à l'aide de la bibliothèque Apache Class.And dans les instructions suivantes, nous essayons de créer un simple pojo à partir du json que nous avons reçu.
String jsonString =
EntityUtils.toString(getResponse("http://echo.jsontest.com/title/ipsum/content/ blah","Your_auth_if_you_need_one").getEntity(), "UTF-8");
final GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(JsonJavaModel .class, new CustomJsonDeserialiser());
final Gson gson = gsonBuilder.create();
JsonElement json = new JsonParser().parse(jsonString);
JsonJavaModel pojoModel = gson.fromJson(
jsonElementForJavaObject, JsonJavaModel.class);
Il s’agit d’un simple Java pour les json entrants. Public class JsonJavaModel {Contenu de la chaîne; Titre de la chaîne;} Ceci est un désérialiseur personnalisé:
public class CustomJsonDeserialiserimplements JsonDeserializer<JsonJavaModel> {
@Override
public JsonJavaModel deserialize(JsonElement json, Type type,
JsonDeserializationContext arg2) throws JsonParseException {
final JsonJavaModel jsonJavaModel= new JsonJavaModel();
JsonObject object = json.getAsJsonObject();
try {
jsonJavaModel.content = object.get("Content").getAsString()
jsonJavaModel.title = object.get("Title").getAsString()
} catch (Exception e) {
e.printStackTrace();
}
return jsonJavaModel;
}
Inclure la bibliothèque Gson et org.Apache.http.util.EntityUtils;