2010-04-21 107 views
1

以下代碼會將我的應用程序登錄到服務器。如果登錄成功,該服務器將返回認證令牌。我需要使用該標記來查詢服務器的信息。在HttpSendRequest之後獲取身份驗證令牌

egressMsg := pchar('email='+LabeledEdit1.text+'&&password='+MaskEdit1.Text+#0); 
    egressMsg64 := pchar(Encode64(egressMsg)); 

    Reserved := 0; 

    // open connection 
    hInternetConn := InternetOpen('MyApp', INTERNET_OPEN_TYPE_PRECONFIG, NIL, NIL, 0); 

    if hInternetConn = NIL then 
    begin 
    ShowMessage('Error opening internet connection'); 
    exit; 
    end; 

    // connect 
    hHttpSession := InternetConnect(hInternetConn, 'myserver.com', 
    INTERNET_DEFAULT_HTTP_PORT, '', '', INTERNET_SERVICE_HTTP, 0, 0); 

    if hHttpSession = NIL then 
    begin 
    ShowMessage('Error connecting'); 
    exit; 
    end; 

    // send request 
    hHttpRequest := HttpOpenRequest(hHttpSession, 'POST', 
     '/myapp/login', NIL, NIL, NIL, 0, 0); 

    if hHttpRequest = NIL then 
    begin 
    ShowMessage('Error opening request'); 
    exit; 
    end; 

    label2.caption := egressMsg64 + ' '+inttostr(length(egressMsg64)); 
    res := HttpSendRequest(hHttpRequest, Nil, 
     DWORD(-1), egressMsg64, length(egressMsg64)); 

    if not res then 
    begin 
    ShowMessage('Error sending request ' + inttostr(GetLastError)); 
    exit; 
    end; 

    BufferSize := Length(infoBuffer); 

    res := HttpQueryInfo(hHttpRequest, HTTP_QUERY_STATUS_CODE, @infoBuffer, BufferSize, Reserved); 

    if not res then 
    begin 
    ShowMessage('Error querying request ' + inttostr(GetLastError)); 
    exit; 
    end; 

    reply := infoBuffer; 
    Memo1.Lines.Add(reply); 

    if reply <> '200' then 
    begin 
    //error here 
    end; 

    // how to I get the token here!!!! 

    InternetCloseHandle(hHttpRequest); 
    InternetCloseHandle(hHttpSession);   
    InternetCloseHandle(hInternetConn); 

如何獲得該令牌?我嘗試了查詢cookie,我嘗試了InternetGetCookie()以及更多。 代碼認識

感謝

傑斯

編輯

我發現,如果你使用的InternetReadFile你可以得到令牌。但是,該令牌以字節數組形式出現。以後很難將其發送到服務器......任何人都知道如何將字節數組轉換爲pchar或字符串?

回答

0

在這裏它是:

if not InternetReadFile(hHttpRequest, @token2, sizeof(token2), Reserved2) then 
    Memo1.Lines.Add('error = ' + inttostr(GetLastError)) 
    else 
    begin 
    for i:=1 to Reserved2 do 
     strtoken := strtoken + Chr(token2[i]); 

    Memo1.Lines.Add('token = '+strtoken); 
    Memo1.Lines.Add('recevied = '+inttostr(Reserved2)); 
    end; 

token2是一個字節數組。

1

對於正常的基於零的數組,不應該是'Chr(token2 [i-1])'嗎?

另外,假定非Unicode德爾福,你可以使用:

SetLength(strtoken, Reserved2); 
CopyMemory(@strtoken[1], @token2[0], Reserved2); 

注:這將在Unicode的德爾福打破,除非你聲明strtoken作爲AnsiString類型
對於Unicode知道德爾福使用TEncoding.ASCII。 GetString

+0

從我發現的token2 [0]中有數組的大小,所以我打電話給i:= 1 to Reserved2做 – Jessica 2010-04-22 18:37:42

+0

不夠公平。但我不禁感覺到有一個'錯誤1'的錯誤潛伏在那裏。如果您正在讀取Reserved2字節,則該數組只能保存從索引[0]到[Reserved2-1]的有效值。 token2 [Reserved2]不應該包含一個有用的值,除非token2的大小大於Reserved2,否則應該有一個範圍檢查錯誤。 – shunty 2010-04-23 12:13:25

+0

我收到一個錯誤:「常量表達式違反子範圍邊界」,光標放在@ token2 [0] – Jessica 2010-04-23 13:42:28

相關問題