Delphi中怎么通过http get方式来调用url 如何使用WinInet的API来发送一个HTTP POST请...

作者&投稿:巩奚 (若有异议请与网页底部的电邮联系)
API接口使用HTTP协议,可接受HTTPGET 和HTTPPOST访问。
参数传递方式为application/x-www-url-encoded,编码方式为UTF-8,且须遵循URL 编码规范
(RFC3986)对保留字符进行百分号编码。
操作结果返回方式为XML,编码方式为UTF-8。
接口地址:
http://api.123.com/XMLHttpService.do

比如使用 API 创建域名,假设已有一个模板 ID 为 10,使用此模板注册一域名 456.com,注册一年,
以下是以HTTPGET方式调用 API的URL:
http://api.123.com/XMLHttpService.do?username=test@namemax.cn&password=888888&command=re
gisterDomainName&domainName=456.om&period=1&templateId=10

URL中的username paeeword command domainname period templateId都是参数

请问如何使用Delphi的http get 调用url,并返回?需要加什么控件?最好给出完整的代码。

若操作成功,服务器将返回以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<response>
<command>registerDomain</command>
<result>SUCCESSFUL</result>
<data>
<domain>456.com</domain>
<creationDate>2008-06-22 08:38:00</creationDate>
<expirationDate>2009-06-21 08:38:00</expirationDate>
<priceId>CNNIC-REG-1Y</priceId>
<price>1.0</price>
<autoRenew>false</autoRenew>
<template>
<templateId>1000</templateId>
<name>xxxxxx</name>
<registrant>
<cnOrganization>xxxxxx</cnOrganization>
<organization>xxxxxx</organization>
<cnName>哈哈</cnName>
<name>haha</name>
<cnProvince>shandong</cnProvince>
<province>linyi</province>
<cnCity>lili</cnCity>
<city>lili</city>
<cnAddress>dddd</cnAddress>
<address>dddd</address>
<postal>333333</postal>
<email>service@wwwwww.com</email>
<phone>+86.13833138033</phone>
<fax>+86.13833200533</fax>
</registrant>
<adminSameAsRegistrant>true</adminSameAsRegistrant>
<techSameAsRegistrant>true</techSameAsRegistrant>
<billingSameAsRegistrant>true</billingSameAsRegistrant>
</template>
<statuses>
<status>clientDeleteProhibited</status>
<status>clientTransferProhibited</status>
</statuses>
<nsList>
<ns>ns1.123.com</ns>
<ns>ns2.123.com</ns>
</nsList>
</data>
</response>

使用 TIdHttp 组件

Delphi中怎么通过http get方式来调用url~

API接口使用HTTP协议,可接受HTTPGET 和HTTPPOST访问。
参数传递方式为application/x-www-url-encoded,编码方式为UTF-8,且须遵循URL 编码规范
(RFC3986)对保留字符进行百分号编码。
操作结果返回方式为XML,编码方式为UTF-8。
接口地址:
http://api.123.com/XMLHttpService.do

比如使用 API 创建域名,假设已有一个模板 ID 为 10,使用此模板注册一域名 456.com,注册一年,
以下是以HTTPGET方式调用 API的URL:
http://api.123.com/XMLHttpService.do?username=test@namemax.cn&password=888888&command=re
gisterDomainName&domainName=456.om&period=1&templateId=10

URL中的username paeeword command domainname period templateId都是参数

请问如何使用Delphi的http get 调用url,并返回?需要加什么控件?最好给出完整的代码。

若操作成功,服务器将返回以下内容:


registerDomain
SUCCESSFUL

456.com
2008-06-22 08:38:00
2009-06-21 08:38:00
CNNIC-REG-1Y
1.0
false

1000
xxxxxx

xxxxxx
xxxxxx
哈哈
haha
shandong
linyi
lili
lili
dddd
dddd
333333
service@wwwwww.com
+86.13833138033
+86.13833200533

true
true
true


clientDeleteProhibited
clientTransferProhibited


ns1.123.com
ns2.123.com

1. 我把所有的URL /与代码。我这个来自杰夫・德沃尔现在,它的精细工作:function request(const AUrl, AData: AnsiString; blnSSL: Boolean = True): AnsiString;
var
aBuffer : Array[0..4096] of Char;
Header : TStringStream;
BufStream : TMemoryStream;
sMethod : AnsiString;
BytesRead : Cardinal;
pSession : HINTERNET;
pConnection : HINTERNET;
pRequest : HINTERNET;
parsedURL : TStringArray;
port : Integer;
flags : DWord;
begin
ParsedUrl := ParseUrl(AUrl);

Result := '';

pSession := InternetOpen(nil, INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);

if Assigned(pSession) then
try
if blnSSL then
Port := INTERNET_DEFAULT_HTTPS_PORT
else
Port := INTERNET_DEFAULT_HTTP_PORT;
pConnection := InternetConnect(pSession, PChar(ParsedUrl[0]), port, nil, nil, INTERNET_SERVICE_HTTP, 0, 0);

if Assigned(pConnection) then
try
if (AData = '') then
sMethod := 'GET'
else
sMethod := 'POST';

if blnSSL then
flags := INTERNET_FLAG_SECURE or INTERNET_FLAG_KEEP_CONNECTION
else
flags := INTERNET_SERVICE_HTTP;

pRequest := HTTPOpenRequest(pConnection, PChar(sMethod), PChar(ParsedUrl[1]), nil, nil, nil, flags, 0);

if Assigned(pRequest) then
try
Header := TStringStream.Create('');
try
with Header do
begin
WriteString('Host: ' + ParsedUrl[0] + sLineBreak);
WriteString('User-Agent: Custom program 1.0'+SLineBreak);
WriteString('Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'+SLineBreak);
WriteString('Accept-Language: en-us,en;q=0.5' + SLineBreak);
WriteString('Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7'+SLineBreak);
WriteString('Keep-Alive: 300'+ SLineBreak);
WriteString('Connection: keep-alive'+ SlineBreak+SLineBreak);
end;

HttpAddRequestHeaders(pRequest, PChar(Header.DataString), Length(Header.DataString), HTTP_ADDREQ_FLAG_ADD);

if HTTPSendRequest(pRequest, nil, 0, Pointer(AData), Length(AData)) then
begin
BufStream := TMemoryStream.Create;
try
while InternetReadFile(pRequest, @aBuffer, SizeOf(aBuffer), BytesRead) do
begin
if (BytesRead = 0) then Break;
BufStream.Write(aBuffer, BytesRead);
end;

aBuffer[0] := #0;
BufStream.Write(aBuffer, 1);
Result := PChar(BufStream.Memory);
finally
BufStream.Free;
end;
end;
finally
Header.Free;
end;
finally
InternetCloseHandle(pRequest);
end;
finally
InternetCloseHandle(pConnection);
end;
finally
InternetCloseHandle(pSession);
end;
end;


ParseUrl是一个函数,在分割“/和TStringArray是一个字符串数组的URL。我还是要检查代码的明天,但它看起来很好,在我的嗅探器,我看到后数据被发送了头。

2. 我个人比较喜欢的突触库为我所有的TCP / IP协议的工作。例如,一个简单的HTTP post可以编码为:uses
httpsend;

function testpost;
begin
stm := tStringstream.create('param=value');
try
HttpPostBinary(' CodeGo.net
finally
stm.free;
end;
end;


该库是写得很好,很容易修改以满足您的特定最新发布的颠覆不工作为德尔福2009年和2010年德尔福的任何问题。这是基于,而是是一系列的类和其良好的多线程

3. 第三个(以HttpOpenRequest应该是你想要求的URL。这就是为什么描述的五分之一(lpszReferer)为“一个指向一个空结束的字符串,指定从哪个(获得了在请求的URL的URL。” 已发布的数据获取与发送HttpSendRequest;该lpOptional描述是这样的: 指向包含请求头之后发送任何可选的数据缓冲区。这对于POST和PUT操作。可选的数据可以被发送到服务器的资源。这可以是NULL如果不存在可选的数据发送。 第二至InternetOpen应该只是服务器,它不应该包含的协议。你与第六指定协议 当你发送的请求,您可以阅读与回应InternetReadFile和InternetQueryDataAvailable。 不要只检查是否API函数返回零,然后继续下一行。如果他们失败了,调用GetLastError找出原因。你已经发布的代码不会引发异常,所以这是徒劳的,以捕捉任何。 (和它的愚蠢的“处理”他们你这样做反正的方式。不要捕捉异常,你还不知道如何解决。让一切上去给调用者,或来电者的来电,等。)