2012-06-18 90 views
0

我正在开发一个将数据分享至LinkedIn用户档案的程序。我正在使用Delphi XE2,OAuth和LinkedIn API。我能够获得Access令牌。然后我想更新状态。所以,我的代码是将数据分享至LinkedIn api用户的状态更新档案

procedure TForm1.Button2Click(Sender: TObject); 
var 
IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL ; 
Url,sign : String; 
Response  : TStringStream; 
slist  : TStringList; 
str   : WideString; 
Arequest1 : TOAuthRequest; 
AuthHeader : WideString; 
begin 
    with http do 
    Begin 
    IdSSLIOHandlerSocketOpenSSL1 := TIdSSLIOHandlerSOcketOpenSSL.Create(nil); 
    with idSSLIOHandlerSocketOpenSSL1 do 
    begin 
     SSLOptions.Method := sslvTLSv1; 
     SSLOptions.SSLVersions := [sslvTLSv1]; 
     SSLOptions.Mode := sslmBoth; 
     SSLOptions.VerifyMode := []; 
     SSLOptions.VerifyDepth := 0; 
     host := ''; 
    end; 
    IOHandler := IdSSLIOHandlerSocketOpenSSL1; 
    AllowCookies := True; 
    Request.ContentRangeEnd := 0; 
    Request.ContentRangeStart := 0; 
    Request.ContentType := 'application/xml'; 
    Request.ContentEncoding := 'utf-8'; 
    Request.BasicAuthentication := False; 
    Request.Connection := 'Keep-Alive'; 
    request.host := 'api.linkedin.com'; 
    Request.Accept := 'text/xml, */*'; 
    Request.UserAgent := 'Mozilla/5.0 (Windows NT 5.1; rv:13.0) Gecko/20100101 Firefox/13.0' ; 
    HTTPOptions := [hoForceEncodeParams]; 
    end; 
    Url := 'https://api.linkedin.com/v1/people/~/shares'; 
    Consumer := nil; 
    Consumer := TOAuthConsumer.Create(ConsumerKey, ConsumerSecret); 
    Arequest1 := TOAuthRequest.Create(Url); 
    sign  := HMAC.build_signature(Arequest1,Consumer,Token); 
    sign  := TOAuthUtil.urlEncodeRFC3986(sign); 
    http.Request.CustomHeaders.Clear; 
    AuthHeader  := 'OAuth '+ 'oauth_nonce="'+Arequest1.GenerateNonce+'",'+ 'oauth_signature_method="'+HMAC.get_name+'",'+ 'oauth_timestamp="'+Timestamp+'",'+ 'oauth_consumer_key="'+Consumer.Key+'",'+ 'oauth_token="'+Token.Key+'",'+ 'oauth_signature="'+sign+'",'+ 'oauth_version="1.0"'; 
     http.Request.CustomHeaders.Add(AuthHeader); 
     slist  := TStringList.Create; 

     slist.Text := '<?xml version="1.0" encoding="UTF-8"?><share><comment>Posting from the API using XML</comment>'+ 
        '<content><title>A title for your share</title><submitted-url>http://developer.linkedin.com</submitted-url>'+ 
        '<submitted-image-url>http://lnkd.in/Vjc5ec</submitted-image-url></content><visibility>'+ 
        '<code>anyone</code></visibility></share>'; 
    Response := TStringStream.Create; 
    http.Request.ContentLength := length(slist.Text); 
    try 
    http.post(Url,slist,Response); 
    Finally 
    ShowMessage(Response.DataString); 
    http.Free; 
    ARequest.Free; 
    end; 
end; 

我面对401未经授权。请检查我的问题@ A1rPun。请帮助我

回答

0

感谢您提供完整的代码示例。我见过你在你以前的question上评论过你在Delphi XE2中使用indy 10。

问题可能是因为indy 10中的SSL身份验证有问题。Full explanation here您可以做的是试图获得稳定版本的indy组件。

该代码似乎没有错误,除了一些本来可以释放的资源外;)。

我真的希望在更新你的indy时你的问题将得到解决。

+0

我试过从svn Revision(4771)更新indy(10.5.8)。仍面临同样的问题401未经授权。请帮助我@ A1rPun。我正在尝试很多解决方案。 – vikas

+0

嗨@ A1rPun你没有得到我的问题。请告诉我一些东西。我在XML中获得自己的地位,但没有做后期请帮助我。如果你有一段时间然后我想和你聊天。所以请联系我..... – vikas

+0

请任何人都帮助我。直到现在我不张贴XML的头。所有时间面临401错误。我的响应是 BYE79V9AXB [未授权]。 OAU:2j71bnoc4x5f | 3b2f15bd-a2c8-474f-ae05-541dd9b76468 | * 01 | * 01:1340895531:PxhePw0/XHdvPz9cP3k/Px5WXz8 = 请帮我............ – vikas