Hey Udviklere,
jeg sidder lige og skal lave en Win32 application som skulle kunne en masse smarte ting, men der er lige en ting som jeg ikke selv har fundet ud af hvordan man laver!
Mit program skal nemlig kunne sende et http-get eller -post request med noget indhold til et php-script på min hjemmeside, så bliver de data der blev sendt behandlet og scriptet skriver noget ud som skal fanges af mit program igen!
Jeg håber der er nogle der kan stikke mig et godt link eller lige guide mig kort igennem hvilke metoder jeg skal bruge.
På forhånd tak,
Mobster @ Creationzone.net
Hej,
Du skal bruge en almidelig TCP/IP forbindelsen på port 80.
Så skal du benytte HTTP protokollen for at sende og modtage data.
For at bruge TCP/IP så prøv nogle af disse links:
http://www.codeguru.com/internet/winsockapi_wrappers.shtmlhttp://www.codeguru.com/internet/async_full_duplex.shtmlhttp://www.codeguru.com/internet/Get-Post.html (artikel + source).
HTTP protokollen består af 3 typer requests:
- GET
Angiver en URL med parameter på selve URL'en (eks. www.test.dk/test.php?p1=parm1&p2=none).
- POST
Angiver en URL hvor parameter bliver sendt seperat fra URL'en.
- HEAD
Angiver at du vil ha' et timestamp for siden (bruges f.eks. når du kun vil hente siden hvis den har
noget nyt indhold). HEAD kan indeholde de samme data som en POST eller en GET.
En request (fælles for dem alle) er delt op på følgende måde:
[Request-type] [Path] [HTTP version]
[Header-element:] [værdi]
--"-- (antallet af elementer kan variere fra server til server).
[End-header]
[data (kun ved en POST)]
En HTTP request er linie orienteret hvilket vil sige at hver linie i ovenstående eks. afsluttes med en "\\r\\n".
[request-type]
kan være een af de tre som jeg beskrev ovenfor (GET, POST eller HEAD).
[path]
er stien efter din host f.eks. hvis vi tager "www.test.dk/test.php" så er [path] = "/test.php".
[HTTP version]
kan være "HTTP/1.0" eller "HTTP/1.1".
[header-element:]
indeholder forskellige informationer til serveren.
Nogle af de mest interessante (jeg beskriver andre lidt senere) er:
1. "Content-Type:"
Her angiver du hvilken form for data som sendes. Når du POST'er eller GET'er så skal du
bruge "application/x-www-form-urlencoded".
2. "User-Agent:"
Angiver hvem som sender requesten (normalt vil du skrive dit program navn).
3. "Content-Length:"
Angiver lænden af [data] sektionen.
[End-header]
For at afslutte headeren skal der være 2 linie skift lige efter hinanden ("\\r\\n\\r\\n").
[data]
Her indsættes data som skal POST'es til serveren. Hvis vi bruger GET eks. ovenfor:
"www.test.dk/test.php?p1=parm1&p2=none" så vil parameterene stå i [data] sektionen
og ikke i [path] sektionen. Så vil data se således ud: "p1=parm1&p2=none".
Lad os se hvordan de forskellige request type vil se ud hvis vi bruger "www.test.dk/test.php?p1=parm1&p2=none" som vores URL:
GET:
GET /test.php?p1=parm1&p2=none HTTP/1.0
Content-Type: application/x-www-form-urlencoded
User-Agent: Udvikleren.dk
Content-Length: 0
POST:
POST /test.php HTTP/1.0
Content-Type: application/x-www-form-urlencoded
User-Agent: Udvikleren.dk
Content-Length: 16
p1=parm1&p2=none
HEAD (kan både bruges som POST og som GET):
HEAD /test.php HTTP/1.0
Content-Type: application/x-www-form-urlencoded
User-Agent: Udvikleren.dk
Content-Length: 16
p1=parm1&p2=none
eller
HEAD /test.php?p1=parm1&p2=none HTTP/1.0
Content-Type: application/x-www-form-urlencoded
User-Agent: Udvikleren.dk
Content-Length: 0
Så kommer vi til HTTP response!
Et HTTP response ligner heldigvis meget en POST request så der skulle det skulle ikke være så svært. Det skal dog siges at et response til en HEAD ikke har nogen data men at du i stedet skal
kigge på [header-element:]'erne "ETag" eller "Date".
HTTP Responsen ser således ud:
[HTTP version] [Status-Code] [Status-Description]
[Header-element:] [værdi]
--"-- (antallet af elementer kan variere fra server til server).
[End-header]
[data]
[Status-Code]
Angiver status for den sendte request. Dette kan være "200" (ok) eller "404" (page not found) osv.
[Status-Description]
Giver en beskrivelse af [Status-Code].
[HTTP version]
kan være "HTTP/1.0" eller "HTTP/1.1".
[header-element:]
Som forklaret tidligere.
[End-header]
Som forklaret tidligere.
[data]
Her kommer så dine data som sendes fra serveren. Det kan f.eks. være HTML, XML eller binær data. Type som [data] indeholder finder du i [header-element:]'et "Content-Type". Det kunne
f.eks. være "text/plain" eller "text/html" osv.
Et HTTP response kunne se således ud:
HTTP/1.0 200 OK
Server: Microsoft-ISS/5.0
Date: Sat. 10 May 2003 12:18:51 GMT
Content-Type: text/html
X-Powered-By: PHP/4.3.0
<HTML><body><pre>response</pre><body></HTML>
Når findelsen bliver afbrudt af serveren så er alle data sendt. Du kan dog i nogle tilfælde
komme ud for at data bliver sendt i "chunks" og så skal du dekode data på en lidt anden
måde (men det vil jeg ikke komme ind på nu).
Jeg håber det giver dig en idé om hvordan det skal gøres
Du kan evt. se WC3 standarden for HTTP protokollen.
Mvh
Michael.