2012년 11월 21일 수요일

IdHttp 에서 get post 사용하기


 클라이언트가 HTTP프로토콜을 이용해서 서버에 무언가를 전달할 때 Get 이나 Post가 사용됩니다. GET은 주소줄에 값이 ?뒤에 쌍으로 이어붙고 여러개일 경우에는 & 으로 반복하고,  POST는 숨겨져서(body안에) 보내집니다. GET은 URL에 이어붙기 때문에 길이제한이 있어서 많은양의 데이터는 보내기 어렵고 POST는 많은 양을 보내기에 적합합니다.(역시 용량제한은 있지만) 즉 http://url/exam.asp?date=20121121&area=all 같이 하는 것이 GET방식이고 form을 이용해서 submit을 하는 형태가 POST입니다.
  게시판의 리스트를 가져온다고 하면 당연히 GET을 쓸 것이고 글을 작성한다고 하면 POST를 이용하는 것이 일반적입니다.  GET은 서버에서 어떤 데이터를 가져와서 보여준다거나 하는 용도이지 서버의 값이나 상태등을 바꾸지 않습니다.
 정리하면 GET은
 - URL에 정보가 담겨서 전송된다.
 - 전송할 수 있는 정보의 길이가 제한되어 있다.
 - 퍼머링크로 사용될 수 있다.
POST
 - header의 body에 담겨서 전송된다.
 - URL 상에 전달한 정보가 표시되지 않는다.
 - GET에 비해서 보안상 약간의 우위에 있다. (사실상 동일하다)
 - 전송할 수 있는 데이터의 길이 제한이 없다.
 - 퍼머링크로 사용할 수 없다.
 - 서버 쪽에 어떤 작업을 명령할 때 사용한다. (데이터의 기록, 삭제, 수정 등)

 idHttp 에서 Get 사용
 var iSS: TStringStream;
 begin
   iSS:= TstringStream.create;
   idHttp.get('URL', iSS);
   Memo1.lines.text:= iSS.DataString;
   iSS.Free;
 end;

idHttp 에서 Post 사용

var iStrings: TStrings;
begin
  iStrings.values['loginID']:= 'id';
  iStrings.Values['Pwd']:= 'pwd';
  Memo1.Lines.text:= idHttp.post('http://url/emac.asp', iStrings);
iStrings.free;
end;

 WebVrowser 에서 쿠키 갖어 오기
   mmResult.Lines.Text:= WebBrowser1.OleObject.Document.Cookie;
 
 idHttp 에 쿠기 저장하기 1.
    IdHTTP1.Response.RawHeaders.Add('Cookie: '+ mmResult.Lines.Text);
    이 때  Cookie: 또는 Set-Cookie: 등으로 바꿔서 사용하므로 선택하여 사용 필요(paros에서 확인)

idHttp 에 쿠기 저장하기 2.
  TWebBrowserHelper = class Helper for TWebBrowser
  public
    function GetCookieValue(Name: string): string;
    function GetSessionID(Const id:string): string;
  end;
  function TWebBrowserHelper.GetCookieValue(Name: string): string;
var
  Doc: IHTMLDocument2;
  sList, tList: TStringList;
  i: Integer;
begin
  Result := '';
  Doc := Self.Document as IHTMLDocument2;
  if not assigned(Doc) then exit;
  sList := TStringList.Create;
  tList := TStringList.Create;
  try
    ExtractStrings([';'], [], PChar(Doc.cookie), sList);
    for i := 0 to sList.Count - 1 do begin
      tList.Clear;
      ExtractStrings(['='], [], PChar(Trim(sList[i])), tList);
      if AnsiCompareText(tList[0], Name) = 0 then begin
        Result := tList[1];
        exit;
      end;
    end;
  finally
    FreeAndNil(sList);
    FreeAndNil(tList);
  end;
end;

function TWebBrowserHelper.GetSessionID(const id: string): string;
begin
  Result := Self.GetCookieValue(id);
end;

edSessionID.Text 에 PHPSessionID 등 세션 아이디가 있음
웹 개발자가 멋대로 만들기에 찾아서 기록, 또는 방법 1을 사용 하여 찾을 수 있음...
procedure TForm1.btSetCookieClick(Sender: TObject);
var IdURI: TIdUri;
begin
  IdURI := TIdUri.Create(WebBrowser1.LocationURL);
  edSessionValue.Text:= WebBrowser1.GetSessionID(Trim(edSessionID.Text));
  IdCookieManager1.AddServerCookie(edSessionID.Text+'='+edSessionValue.Text, IDUri);
  iduri.Free;
end;


 http/1.1 302 Found 예외 에러 발생 하면 IdHttp 의 속성을 HandleRedirects := True; 해주면 됩니다.

댓글 없음:

tensorflow gpu 사용하기에서

 tensorflow 설치시 주의해야 한다. # Anything above 2.10 is not supported on the GPU on Windows Native python - m pip install "tensorflow<2.11...