Avatar billede lubker Nybegynder
20. januar 2013 - 12:03 Der er 5 kommentarer og
1 løsning

Send variabler med HTTP Post til URL

Findes der en nem måde at sende variabler via HTTP Post til en URL adresse fra C++? Jeg har ikke behov for at modtage data. udelukkende sende.

Jeg benytter Borland Developer Studio 2006.
Avatar billede arne_v Ekspert
20. januar 2013 - 15:54 #1
Der er flere muligheder:
* low level socket API
* high level WinInet API
* noget web service API som jeg mener Borland kommer med
Avatar billede arne_v Ekspert
20. januar 2013 - 15:54 #2
Eksempel paa socket API:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#include <windows.h>
#include <errno.h>

void get(char *hostname,int port,char *path, char *args)
{
  FILE *fp;
  int sd,status,len,first,tmp;
  char cmd[512],resp[51200],*body;
  struct sockaddr local,remote;
  struct hostent *hostinfo;
  /* create socket */
  sd=socket(AF_INET,SOCK_STREAM,0);
  if(sd<0) {
      printf("Error creating socket: %s\n",strerror(errno));
      goto fin;
  }
  /* bind socket */
  local.sa_family=AF_INET;
  memset(local.sa_data,0,sizeof(local.sa_data));
  status=bind(sd,&local,sizeof(local));
  if(status<0) {
      printf("Error binding socket: %s\n",strerror(errno));
      goto fin;
  }
  /* lookup host */
  hostinfo=gethostbyname(hostname);
  if(!hostinfo) {
      printf("Error looking up host: %s\n",hostname);
      goto fin;
  }
  /* connect to host */
  remote.sa_family=hostinfo->h_addrtype;
  memcpy(remote.sa_data+2,hostinfo->h_addr_list[0],hostinfo->h_length);
  *((short *)remote.sa_data)=port;
  tmp=remote.sa_data[0];
  remote.sa_data[0]=remote.sa_data[1];
  remote.sa_data[1]=tmp;
  status=connect(sd,&remote,sizeof(remote));
  if(status!=0) {
      printf("Error connecting to host: %s port: %d\n",hostname,port);
      goto fin;
  }
  /* send POST request */
  sprintf(cmd,"POST %s HTTP/1.1\r\nHost: %s\r\nConnection: close\r\nContent-Length: %d\r\n\r\n%s\r\n",
          path,hostname,strlen(args),args);
  status=send(sd,cmd,strlen(cmd),0);
  if(status<0) {
      printf("Error sending POST request\n");
      goto fin;
  }
  /* read response */
  while ((len=recv(sd,resp,sizeof(resp),0))>0) {
      printf("%s",resp);
  }
fin:
  closesocket(sd);
  return;
}

int main(int argc,char *argv[])
{
  WSADATA WSAData;
  WSAStartup(0x0101,&WSAData);
  get("www.xxxx.dk",80,"/cgi-bin/script","f1=val1&f2=val2");
  WSACleanup();
  return 0;
}
Avatar billede arne_v Ekspert
20. januar 2013 - 16:00 #3
Jeg mener at Bertel har et WinInet eksempel som han har postet mange gange.

Eller finder Google bl.a.:

http://stackoverflow.com/questions/5557159/post-form-data-using-wininet-c
Avatar billede lubker Nybegynder
20. januar 2013 - 16:03 #4
TakTak. Jeg kigger på det. Fik hul igennem med indy. Men tester det lige og ser hvad der virker bedst.
Avatar billede lubker Nybegynder
20. januar 2013 - 19:21 #5
Hej Arne.
Jeg holdt mig til indy, det kræver kun få linjer kode og virker perfekt.
Lægger du et svar?

Daniel
Avatar billede arne_v Ekspert
20. januar 2013 - 19:33 #6
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester