• XMLHTTPRequest如何访问需要安全验证的网站


    以下是在Delphi中的代码,在其他的语言或脚本如C# / JavaScript /  ASP.NET / ASP / PHP中也是一样的,XMLHTTPRequest的使用是通用的。

    网上说可以直接这样:

            httpReq.open('Get',url,True,edt_User.Text,edt_Pwd.Text) //请不要在此放入验证用户和密码,会出错!
    这个在连接Restful服务中出错!发送Header信息就没有问题,EncodeString()是Delphi中进行Base64编码的函数,编码前的格式为:username:password

            UsrPwd_Base64 := edt_User.Text+':'+edt_Pwd.Text;
            UsrPwd_Base64 := 'Basic '+EncodeString(UsrPwd_Base64);//'Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=='
            HttpReq.setRequestHeader('Authorization', UsrPwd_Base64);


    完整代码如下:

    procedure TTestForm.ExecServerMethodByXMLHttp(const useGet: Boolean);
    var
      url,UsrPwd_Base64: string;
      HttpReq:IXMLHTTPRequest;
      JsonParamStr:string;
    begin
      Memo1.Lines.Clear;
      Memo1.Lines.Add('XMLHTTPRequest '+RadioGroup1.Items[RadioGroup1.ItemIndex]+'方式:');
      Memo1.Lines.Add('====================================');
    
      HttpReq := CoXMLHTTP.Create;//早期版本如Delhp7中则为 HttpReq := CoXMLHTTPRequest.Create;
      //两种提交请求的方式:Get和Post,Get是通过URL地址传递参数如果是中文需要转码,需要添加时间戳 Post不需要添加时间戳
      //get url := 'http://localhost:5269/api/webmemberapi/NewMemberRegister?timestamp='+inttostr(Windows.GetTickCount);
      url := edt_SrvIp.Text+':'+edt_Port.Text+'/peci/rest/TServerMethods/GetRoomInfo_ByRoom/';
      url := url+GetParamStr_Delphi;
    
      if useGet then
      begin
        //http get
        if chk_Pwd.Checked then
          //httpReq.open('Get',url,True,edt_User.Text,edt_Pwd.Text) //请不要在此放入验证用户和密码,会出错!
          httpReq.open('Get',url,False,EmptyParam,EmptyParam)
        else
          httpReq.open('Get',url,False,EmptyParam,EmptyParam);
      end else
      begin
        //http post 如用post方法实际上是调用updateGetRoomInfo_ByRoom,post方式会在函数名前加上update前缀
        httpReq.open('Post', url, False, EmptyParam, EmptyParam);
      end;
    
        if chk_Pwd.Checked then //如果服务器需要验证用户,请把验证信息放入Header中。
        begin
          begin
            UsrPwd_Base64 := edt_User.Text+':'+edt_Pwd.Text;
            UsrPwd_Base64 := 'Basic '+EncodeString(UsrPwd_Base64);//'Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=='
            HttpReq.setRequestHeader('Authorization', UsrPwd_Base64);
          end;
        end;
      //HttpReq.setRequestHeader('Accept', 'application/x-www-form-urlencoded');
      //HttpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    
      HttpReq.setRequestHeader('If-Modified-Since', '0');
      HttpReq.setRequestHeader('Accept', 'application/json');
      HttpReq.setRequestHeader('Content-Type', 'application/json');
      HttpReq.setRequestHeader('Charset', 'utf-8');
      //请求主体
      try
        if useGet then
        begin
          //http get 如果url中已包含了参数,则无需在此再次传递参数
          HttpReq.send(EmptyStr);
        end else
        begin
          //http post
          JsonParamStr := GetParamStr_Json;//GetParamStr_Delphi;//
          HttpReq.send(JsonParamStr);
        end;
    
    
        Memo1.Lines.Add(HttpReq.responseText);
      except
         on Ex:Exception do
            Memo1.Lines.Add(Ex.Message);
      end;
    end;
    


  • 相关阅读:
    WebView与 JS 交互方式
    ES6常用知识点
    Flash Builder 破解与开发环境配置
    如何修改默认浏览器
    基本数据类型和常用内建对象
    VS 2010 使用技巧
    javascript之事件驱动编程的几个基本概念
    javascript笔记之DHTML基础
    浏览器对象模型
    开发心得记录
  • 原文地址:https://www.cnblogs.com/xieyunc/p/9126485.html
Copyright © 2020-2023  润新知