Salut,
J'ai créé un simple controller MVC nommé "ProgrammesController" contenant une méthode Get() me permettant de récupérer un datatable (qui fonctionne bien).
Pour y accéder je tape directement dans mon explorateur : "http://MonServeur/Updator_Service/api/Programmes/" (cela fonctionne)
j'ai ensuite créé une méthode Get(string id) permettant de renvoyer un datatable ne contenant que les données concernées par cet "id".
Pour y accéder : "http://MonServeur/Updator_Service/api/Programmes/truc" où "truc" est l'id à envoyer pour filtrer le datatable. (dans l'explorateur cela fonctionne)
voici le code de ce controller :
Donc, dans l'explorateur les deux fonctionnent, j'ai ensuite créé (sous android/xamarin) deux bouts de code pour récupérer les données de ce service web.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89 using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Web.Http; using System.Web; using System.Data; namespace Updator.Controllers { public class ProgrammesController : ApiController { public System.Data.DataTable Get(string id) { DataTable dt_Programmes = null; DataTable dt_Logiciels = null; Outils_BDD.Objets.Connexion_BDD_Collection mesConnexions = null; Commun.logue("Tentative de récupération des programmes pour la tablette '" + id + "'", "ProgrammesController.RecupProgrammes", "Updator", null); try { mesConnexions = new Outils_BDD.Objets.Connexion_BDD_Collection(HttpContext.Current.Server.MapPath(@"~/Parametres/Connexions.xml"), true); } catch (Exception ex) { Commun.logue("Erreur lors de la connexion à la base 'Applications'", "ProgrammesController.RecupProgrammes", "Updator", ex); return null; } try { dt_Programmes = new DataTable("Programmes"); string requete = "SELECT * FROM Recup_Android_Programmes_Tablettes_V ORDER BY NumSerie, Nom"; Outils_BDD.Utiles.RecupCharge_Table(dt_Programmes, requete, HttpContext.Current.Server.MapPath(@"~/Parametres/Programmes.xml"), mesConnexions["Applications"], true, false); DataRow[] drs_Programmes = dt_Programmes.Select("NumSerie = '" + id + "'"); dt_Logiciels = dt_Programmes.Clone(); foreach (DataRow dr_Programme in drs_Programmes) { dt_Logiciels.ImportRow(dr_Programme); } } catch (Exception ex) { Commun.logue("Erreur lors de la récupération des Programmes", "ProgrammesController.Get", "Updator", ex); return null; } return dt_Logiciels; } public System.Data.DataTable Get() { DataTable dt_Programmes = null; Outils_BDD.Objets.Connexion_BDD_Collection mesConnexions = null; Commun.logue("Tentative de récupération des programmes", "ProgrammesController.Get", "Updator", null); try { mesConnexions = new Outils_BDD.Objets.Connexion_BDD_Collection(HttpContext.Current.Server.MapPath(@"~/Parametres/Connexions.xml"), true); } catch (Exception ex) { Commun.logue("Erreur lors de la connexion à la base 'Applications'", "ProgrammesController.Get", "Updator", ex); return null; } try { dt_Programmes = new DataTable("Programmes"); string requete = "SELECT * FROM Recup_Android_Programmes_Tablettes_V ORDER BY NumSerie, Nom"; Outils_BDD.Utiles.RecupCharge_Table(dt_Programmes, requete, HttpContext.Current.Server.MapPath(@"~/Parametres/Programmes.xml"), mesConnexions["Applications"], true, false); } catch (Exception ex) { Commun.logue("Erreur lors de la récupération des Programmes", "ProgrammesController.Get", "Updator", ex); return null; } return dt_Programmes; } } }
Le premier n'ayant qu'à interroger le service web :
appelé comme ceci : Outils_Android_Reseau.Service_Web.Recup_DataTable_ServiceWeb("http://MonServeur/Updator_Service/api/Programmes");
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 public static DataTable Recup_DataTable_ServiceWeb(string URL_ServiceWeb) { DataTable retour = null; System.IO.Stream maIS; try { HttpURLConnection urlConnection = null; URL url; url = new URL(URL_ServiceWeb); urlConnection = (HttpURLConnection)url.OpenConnection(); urlConnection.SetRequestProperty("Content-Type", "application/xml"); urlConnection.Connect(); maIS = urlConnection.InputStream; retour = new DataTable(); retour.ReadXml(maIS); } catch (Exception ex) { throw new Exception("Erreur avec le service web '" + URL_ServiceWeb + "' : " + ex.Message); } return retour; }
Ce code fonctionne parfaitement, je récupère bien mon dataset au complet dans mon programme Android.
Le deuxième par contre me pose problème; Voici le bout de code :
pour l'exécuter : Outils_Android_Reseau.Service_Web.Recup_DataTable_ServiceWeb(_numSerie, "http://MonServeur/Updator_Service/api/Programmes");
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 public static DataTable Recup_DataTable_ServiceWeb(string filtre, string URL_ServiceWeb) { DataTable retour = null; HttpURLConnection urlConnection = null; try//Envoi Post { URL url = new URL(URL_ServiceWeb); urlConnection = (HttpURLConnection)url.OpenConnection(); urlConnection.RequestMethod = "POST"; urlConnection.SetRequestProperty("Content-Type", "application/xml"); //urlConnection.SetRequestProperty("Content-Type", "text/xml; charset=utf-8"); urlConnection.DoInput = true; urlConnection.DoOutput = true; Stream os = urlConnection.OutputStream; PrintWriter pw = new PrintWriter(os); pw.Print(filtre); pw.Close(); } catch (Exception ex) { throw new Exception("Erreur Lors de l'envoi : " + ex.Message); } try//Reception reponse { HttpStatus status = urlConnection.ResponseCode; if (status != HttpStatus.Ok) { retour = null; } else { retour = new DataTable(); retour.ReadXml(urlConnection.InputStream); } } catch (Exception ex) { throw new Exception("Erreur Lors de la réception de la réponse : " + ex.Message); } return retour; }
Quand je l'exécute, "urlConnection.ResponseCode" me renvoie systématiquement "Java.Net.HttpStatus.BadMethod"
Je tourne en rond depuis plusieurs heures et malgré les exemples similaires sur le web je ne trouve pas l'origine de mon problème
J'ai tendance à penser que le service web est correct vu que via Firefox j'obtiens bien dans les deux cas un XML représentant mon datatable.
Et au vu des exemples trouvé sur le web, je ne vois pas ce que j'ai pu louper dans le code coté Android.
Je ne suis ni un pro d'Android (Seulement 2 programmes assez simples à mon actif) ni d'ASP.Net en général (quelques petits projets simples seulement)
Quelqu'un peut'il m'éclairer ?
Merci
Partager