幾乎我所有的開發經驗都在桌面應用程序中。我目前使用的是Delphi 2010,我需要編寫一個SOAP客戶端來訪問加州EDD維護的用於處理工資數據的Web服務。我放棄了Delphi WSDL Importer,因爲幕後幕後發生的事情太多了,我似乎無法取得任何進展。我下載了Fiddler2並一直使用它來查看我一直在寫給網絡的內容。我發現這個過程發佈,我覺得我現在正在某個地方。發佈數據並獲得SOAP客戶端的響應
//from StackOverflow Andreas Rejbrand 06/04/2012
procedure WebPostData(const UserAgent: string; const Server: string; const Resource: string; const Data: AnsiString); overload;
var
hInet: HINTERNET;
hHTTP: HINTERNET;
hReq: HINTERNET;
const
accept: packed array[0..1] of LPWSTR = (PChar('*/*'), nil);
header: string = 'Content-Type: text/plain';
begin
hInet := InternetOpen(PChar(UserAgent), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
try
hHTTP := InternetConnect(hInet, PChar(Server), INTERNET_DEFAULT_HTTP_PORT, nil, nil, INTERNET_SERVICE_HTTP, 0, 1);
try
hReq := HttpOpenRequest(hHTTP, PChar('POST'), PChar(Resource), nil, nil, @accept, 0, 1);
try
if not HttpSendRequest(hReq, PChar(header), length(header), PChar(Data), length(Data)) then
raise Exception.Create('HttpOpenRequest failed. ' + SysErrorMessage(GetLastError));
finally
InternetCloseHandle(hReq);
end;
finally
InternetCloseHandle(hHTTP);
end;
finally
InternetCloseHandle(hInet);
end;
end;
我改變了內容類型,因爲原來似乎永遠不會返回。
我一直在呼籲這樣的:
procedure TForm1.Button1Click(Sender: TObject);
var sl: TStringList;
s: String;
begin
sl := TStringList.Create;
sl.LoadFromFile('C:\Documents and Settings\Jack\Desktop\My Reading\FSET Development\Ping.xml');
s := sl.Text;
sl.Free;
WebPostData('BNWebSvc', 'FSETTESTPROD.EDD.CA.GOV','fsetservice', s);
end;
在我的瀏覽器,主機(FSETTESTPROD.EDD.CA.GOV)存在,並且響應它是可用的。當我發佈時,我可能會因爲附加Web服務名稱而出現404錯誤。在Fiddler2,輸出看起來是這樣的:
POST http://FSETTESTPROD.EDD.CA.GOV/fsetservice HTTP/1.1
Accept: */*
Content-Type: text/plain
User-Agent: BNWebSvc
Host: FSETTESTPROD.EDD.CA.GOV
Content-Length: 2190
Pragma: no-cache
Cookie: __utma=158387685.1851397844.1321382260.1321382260.1321382260.1; __utmz=158387685.1321382260.1.1.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=calif%20edd%20eft%20payroll%20processor%20batch%20processing
<?xml version="1.0" encoding="utf-8"?>
<log>
<inputMessage utc="3/2/2007 10:45:44 PM" messageId="urn:uuid:c07c9aef-28db-4843-8dfc-c5b4d3dc363b">
<processingStep description="Unprocessed message">
<soap:Envelope xmlns:xop="http://www.w3.org/2004/08/xop/include" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<soap:Header>
<wsa:Action>//edd.ca.gov/Ping</wsa:Action>
<wsa:MessageID>urn:uuid:c07c9aef-28db-4843-8dfc-c5b4d3dc363b</wsa:MessageID>
<wsa:ReplyTo>
<wsa:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:Address>
</wsa:ReplyTo>
<wsa:To>http://localhost:3031/EDD.DMRC.FSET.WebServices/FsetService.asmx</wsa:To>
<wsse:Security soap:mustUnderstand="1">
<wsu:Timestamp wsu:Id="Timestamp-0983e8c1-e822-4648-8066-33839f54a6a0">
<wsu:Created>2007-03-02T22:45:41Z</wsu:Created>
<wsu:Expires>2007-03-02T22:50:41Z</wsu:Expires>
</wsu:Timestamp>
<wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="SecurityToken-0d55d82c-d16d-4c0e-826b-21bf7c805a0f">
<wsse:Username>MyUserName</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">MyPassword</wsse:Password>
<wsse:Nonce>w6dgDz1DMzKntFsFdEcjhw==</wsse:Nonce>
<wsu:Created>2007-03-02T22:45:41Z</wsu:Created>
</wsse:UsernameToken>
</wsse:Security>
</soap:Header>
<soap:Body>
<Ping xmlns="http://edd.ca.gov/">
</Ping>
</soap:Body>
</soap:Envelope>
</processingStep>
</inputMessage>
</log>
我將需要發送此使用HTTPS時,這是工作,我可能需要合併,爲了得到它的工作。
我在正確的方向前進?
從安地列斯的過程並沒有說明如何檢索響應。我如何檢索回覆?