Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 在HttpSendRequest之后获取身份验证令牌_Delphi_Token_Wininet - Fatal编程技术网

Delphi 在HttpSendRequest之后获取身份验证令牌

Delphi 在HttpSendRequest之后获取身份验证令牌,delphi,token,wininet,Delphi,Token,Wininet,以下代码将我的应用程序登录到服务器。如果登录成功,该服务器将返回身份验证令牌。我需要使用该令牌查询服务器以获取信息 egressMsg := pchar('email='+LabeledEdit1.text+'&&password='+MaskEdit1.Text+#0); egressMsg64 := pchar(Encode64(egressMsg)); Reserved := 0; // open connection hInternetConn

以下代码将我的应用程序登录到服务器。如果登录成功,该服务器将返回身份验证令牌。我需要使用该令牌查询服务器以获取信息

  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);
egroussmsg:=pchar('email='+LabeledEdit1.text+'&&password='+MaskEdit1.text+#0);
出口msg64:=pchar(Encode64(出口msg));
保留:=0;
//开放连接
hInternetConn:=互联网开放('MyApp',互联网开放类型\预配置,无,无,0);
如果hInternetConn=NIL,则
开始
ShowMessage(“打开internet连接时出错”);
出口
结束;
//连接
hHttpSession:=互联网连接(hInternetConn,'myserver.com',
INTERNET_默认_HTTP_端口','',INTERNET_服务_HTTP,0,0);
如果hHttpSession=NIL,则
开始
ShowMessage('连接错误');
出口
结束;
//发送请求
hhttpprequest:=HttpOpenRequest(hHttpSession,'POST',
'/myapp/login',NIL,NIL,NIL,0,0);
如果hhtprequest=NIL,则
开始
ShowMessage(“打开请求时出错”);
出口
结束;
标签2.caption:=出口msg64+“”+inttostr(长度(出口msg64));
res:=HttpSendRequest(hHttpRequest,无,
DWORD(-1),出口msg64,长度(出口msg64));
如果不是,那么
开始
ShowMessage('Error sending request'+inttostr(GetLastError));
出口
结束;
BufferSize:=长度(infoBuffer);
res:=HttpQueryInfo(hhttpprequest,HTTP\u QUERY\u STATUS\u CODE,@infoBuffer,BufferSize,Reserved);
如果不是,那么
开始
ShowMessage('Error querying request'+inttostr(GetLastError));
出口
结束;
回复:=infoBuffer;
备忘录1.行。添加(回复);
如果回答“200”,那么
开始
//这里出错
结束;
//如何在这里获得代币!!!!
InternetCloseHandle(hhtprequest);
InternetCloseHandle(hHttpSession);
InternetCloseHandle(hInternetConn);
我怎么才能拿到那个代币?我尝试了查询cookie,我尝试了InternetGetCookie()以及更多。 代码是赞赏的

谢谢

杰斯

编辑

我发现如果您使用InternetReadFile,您可以获得该令牌。然而,该令牌以字节数组的形式出现。以后很难使用它将其发送到服务器。。。有人知道如何将字节数组转换为pchar或字符串吗?

这是:

  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;
令牌2是一个字节数组。

这里是:

  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是一个字节数组。

对于普通的基于零的数组,它不应该是“Chr(token2[i-1])”吗

或者,假设使用非unicode Delphi,您可以使用:

SetLength(strtoken, Reserved2);
CopyMemory(@strtoken[1], @token2[0], Reserved2);
注意:除非您将strtoken声明为AnsiString,否则这将在Unicode Delphi中中断
对于支持Unicode的Delphi,使用TEncoding.ASCII.GetString

对于普通的基于零的数组,这不应该是“Chr(token2[i-1])”吗

或者,假设使用非unicode Delphi,您可以使用:

SetLength(strtoken, Reserved2);
CopyMemory(@strtoken[1], @token2[0], Reserved2);
注意:除非您将strtoken声明为AnsiString,否则这将在Unicode Delphi中中断

对于支持Unicode的Delphi,请使用TEncoding.ASCII.GetString

从我发现的情况来看,token2[0]中包含数组的大小,因此我要求I:=1以充分保留2 doFair。但我还是忍不住感觉到,在某个地方潜伏着一个“按1关闭”的错误。如果正在读取Reserved2字节,则数组只能保存索引[0]到[Reserved2-1]之间的有效值。token2[Reserved2]不应该包含有用的值,除非token2的大小大于Reserved2,否则应该存在范围检查错误。我得到一个错误:“常量表达式违反子范围边界”,光标放在@token2[0]之后。好,恐怕无法解释这一点。我在我的机器上找到的唯一InternetReadfile示例来自我的TMS库源代码,它使用您的方法将令牌/缓冲区复制到字符串,但具有“for I:=0 to Reserved2-1 do”。。。但是,如果它对您正常工作,那么请继续使用:-)根据我发现的情况,token2[0]具有数组的大小,因此我要求I:=1以充分保留2 doFair。但我还是忍不住感觉到,在某个地方潜伏着一个“按1关闭”的错误。如果正在读取Reserved2字节,则数组只能保存索引[0]到[Reserved2-1]之间的有效值。token2[Reserved2]不应该包含有用的值,除非token2的大小大于Reserved2,否则应该存在范围检查错误。我得到一个错误:“常量表达式违反子范围边界”,光标放在@token2[0]之后。好,恐怕无法解释这一点。我在我的机器上找到的唯一InternetReadfile示例来自我的TMS库源代码,它使用您的方法将令牌/缓冲区复制到字符串,但具有“for I:=0 to Reserved2-1 do”。。。但是,如果它对您有效,那么请坚持它:-)