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