IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

XML/XSL et SOAP Discussion :

message soap en langage C [bad request]


Sujet :

XML/XSL et SOAP

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 49
    Points : 44
    Points
    44
    Par défaut message soap en langage C [bad request]
    Bonjour,
    Je veux envoyer un message soap à un service web sur sur serveur http.
    J'ai constitué le message soap avec la méthode "post" mais le serveur m'envoie bad request. J'ai cherché en vain mais je ne trouve pas ce qui ne va pas dans l'entête http de mon message SOAP.
    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
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
     
    #include <stdio.h>
    #include <sys/socket.h>
    #include <arpa/inet.h>
    #include <stdlib.h>
    #include <netdb.h>
    #include <string.h>
     
    int create_tcp_socket();
    #define PORT 80
    int create_tcp_socket(){  
       int sock; 
      if((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0){
        printf("Can't create TCP socket");
        exit(1);
      }
      return sock;
    }
     
    int main(int argc, char **argv){
      int sock;
      long hostadr;
      struct sockaddr_in servweb;
      struct hostent *hent;
      char servname[100];
      char fname[50]; 
      char line[512];
      char msgsoap[1000];
      char requet[2000];
      char buffer[2000];
      char *post = "POST /cgi/websvcbible.cgi HTTP/1.1\r\n Host: %s\r\n Content-Type: text/xml; charset=iso-8859-1 \r\n Content-Length: %d\r\n SOAPAction: 'http://www.stgregorioschurchdc.org/Bible#read_bible'\r\n\r\n";
      //char *url="";
      //char *soaction ="\"urn:Roman-IRoman#IntToRoman\"";
      FILE *fc;
     
      if(argc == 1){
        printf("USAGE: programme arg1(nom serveur) arg2(message Soap)\n");
        exit(1);
      }  
      strcpy(servname,argv[1]);
      strcpy(fname,argv[2]);
     
      bzero(&servweb,sizeof(servweb));//initialisation du sockaddr 
      //convertir host to ip
      hostadr = inet_addr(servname); //convertit l'adresse ip (n1.n2.n3.n4) en entier, renvoie 0 sinon)
      if ((long)hostadr != (long)-1) //on a alors une adresse ip
      {  
          bcopy(&hostadr,&servweb.sin_addr,sizeof(hostadr));
       }
       else //on a un nom DNS 
       { 
          hent = gethostbyname(servname);
          if (hent == NULL ){ 
    	printf("gethostbyname\n");
            exit(1);
          }
          else { 
            bcopy(hent->h_addr,&servweb.sin_addr,hent->h_length);
          }
       }
       servweb.sin_port = htons(PORT); //iniatilisation du port a 80
       servweb.sin_family = AF_INET;  // internet
       sock = create_tcp_socket();//creation de la socket tcp   
    	//Connexion
        if( connect(sock,(struct sockaddr *)&servweb, sizeof(struct sockaddr)) < 0){
         printf("probleme de connexion");
         exit(1);
        }
        else{
        printf("Connexion à %s sur le port %d\n", inet_ntoa(servweb.sin_addr), htons(servweb.sin_port));
       }
     
        //construction du message SOAP a envoyer
        fc = fopen(fname,"r");
        if(fc == NULL) {
    	printf("Impossible d'ouvrir le fichier\n");
            exit(1);
        }
     
        while(fgets(line,512,fc) != NULL){
          strncat(msgsoap,line,strlen(line));
        }  
        // printf("%s\n taille=%d\n",msgsoap,strlen(msgsoap));
     
        sprintf(requet,post,argv[1],strlen(msgsoap));
        strcat(requet,msgsoap);
        printf("Requete:\n<<START>>\n%s<<END>>\n",requet);
     
        //envoi du message 
        if(send(sock,requet,strlen(requet)+1,0) == -1){
          printf("Echec d'envoie de la requete\n");
          exit(1);
        }
        while (recv(sock,buffer,1500,0) >0){
        	printf("Reponse du serveur:\r\n %s",buffer);
        }
        close(sock);
        fclose(fc);
        return 0 ;
    }
    Je vous serai reconnaissant de m'aider! Merci

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Diable, on ne va pas se taper tout ça !
    Il serait tout de même plus simple d'enregistrer ce que tu envoies au serveur, avec un espion réseau genre Wireshark, et de nous le montrer, pour vérifier si ça a l'air correct.

    Enfin bon, pour ton information, dans une requête HTTP, les headers ne doivent pas être précédés d'un espace. Autrement dit, ce ne devrait pas être

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HTTP/1.1\r\n Host: %s\r\n Content-Type: text/xml; charset=iso-8859-1
    Mais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HTTP/1.1\r\nHost: %s\r\nContent-Type: text/xml; charset=iso-8859-1
    et ainsi de suite.
    Utiliser une bibliothèque de client HTTP serait une bien meilleure idée.
    En fait, utiliser une bibliothèque de client SOAP pourrait être une encore meilleure idée.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Réponses: 9
    Dernier message: 21/06/2006, 21h27
  2. Voir le message soap
    Par siddh dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 15/05/2006, 10h34
  3. Envoi de messages SOAP
    Par ep31 dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 13/12/2005, 12h58
  4. message SOAP valide
    Par ep31 dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 08/11/2005, 10h14
  5. [castor][SOAP] Probleme avec la validation du message SOAP
    Par VinceFromBcn dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 05/09/2005, 14h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo