2012-03-01 66 views
1

我想使用GoToWebinar API創建網絡研討會的註冊人。我遇到了代碼gotowebinar api php 我提供了我的用戶名和密碼來獲取oAuth對象。如上所述,這工作得非常好。 現在我想要做這樣的事情: 我有一個註冊頁面。當用戶填寫所需的詳細信息,選擇「註冊到網絡研討會」選項並點擊「提交」,我想使用CreateRegistrant API爲他進行在線講座。問題是,我沒有提供用戶名和密碼就無法獲得oAuth對象。有沒有辦法通過編程來創建oAuth對象?使用GoToWebinar創建註冊人

回答

0

我將我的API密鑰,UserID和密碼存儲在我的WebConfig中,然後將它們讀入登錄對象以供我在執行授權時使用。以下是我如何在C#中完成它:

public class Login 
{ 
    public string UserId 
    { get { return System.Configuration.ConfigurationManager.AppSettings["GTWUserId"]; } } 

    public string Password 
    { get { return System.Configuration.ConfigurationManager.AppSettings["GTWPassword"]; } } 

    public string APIKey 
    { get { return System.Configuration.ConfigurationManager.AppSettings["GTWAPIKey"]; } } 

} 

public string DoAuthorize() 
{ 
    Login lg = new Login(); 
    string sError = ""; 

    // first we need to create the uri for the web request 
    string uri = String.Format("https://api.citrixonline.com/oauth/access_token?grant_type=password&user_id={0}&password={1}&client_id={2}", 
        lg.UserId, lg.Password, lg.APIKey); 
    // then the request to login is created and sent. From the response 
    // we need to store at least the access token and the organizer key 
    // to use for further calls 

    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri); 
    request.Accept = "application/json"; 
    request.ContentType = "application/json"; 

    try 
    { 
     var response = request.GetResponse(); 

     //the following lines duplicate the response stream so we can read it for 
     //deserialization and also re-read it and write it out. 

     using (MemoryStream ms = new MemoryStream()) 
     { 
      var stream = response.GetResponseStream(); 
      stream.CopyTo(ms); 
      ms.Position = 0; 
      stream.Close(); 

      DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(ResponseDirectLogin)); 
      var deserialized = (ResponseDirectLogin)ser.ReadObject(ms); 
      auth.OauthToken = deserialized.AccessToken; 
      auth.OrganizerKey = deserialized.OrganizerKey; 
     } 
    } 
    catch (WebException e) 
    { 

     using (var sr = new StreamReader(e.Response.GetResponseStream())) 
      sError = sr.ReadToEnd(); 
     sError = String.Concat(sError, "/n", uri); 
    } 
    return sError; 
} 

public class Auth { 
    public string OauthToken { get; set; } 
    public string OrganizerKey { get; set; } 
} 
public static Auth auth = new Auth(); // This is actually in a BaseControlelr inherited by our MVC Home Controller. 

public string DoRegister(string WebinarKey) 
{ 

    // Here we authorize if we haven't alerady 
    if (auth.OauthToken == null) 
    { 
     sMessage = DoAuthorize(); 
    } 
    // first we need to create the uri for the web request 
    // OrganizerKey is your authorization key for the webinar organizer 
    string uri = String.Format(@"https://api.citrixonline.com/G2W/rest/organizers/{0}/webinars/{1}/registrants", 
        OrganizerKey, WebinarKey); 

    //then create and serialize the registrant object 


    // This is for when you have questions on your webinar, you can omit them if you don't have any 
    List<questions> q = GetQuestionKeys(Key, OrganizerKey); 
    List<response> responses_ = new List<response>(); 

    foreach (var question in q) 
    { 
     response res1 = new response(); 
     res1.questionKey = question.questionKey; 
     // determine which question and set the response 
     if (question.question == "question") 
     { 
      res1.responseText = "response"; 
      responses_.Add(res1); 
     } 
    } 
    var registrant = new Registrant 
    { 
     firstName = FirstName, 
     lastName = LastName, 
     email = EmailAddress, 
     responses = responses_.ToArray() 
    }; 

    JavaScriptSerializer ser = new JavaScriptSerializer(); 
    string json = ser.Serialize(registrant); 

    // then the request to create a registrant is created and sent 
    // N.B. we need to include the access token to the headers to access 
    // the user's account and data 

    try { 
     WebClient client = new WebClient(); 
     client.Headers = new WebHeaderCollection(); 
     client.Headers.Add("Accept", "application/vnd.citrix.g2wapi-v1.1+json"); 
     client.Headers.Add("Content-type", "application/json"); 
     client.Headers.Add("Authorization", string.Format("OAuth oauth_token={0}", OAuthToken)); 

     try 
     { 
      string resp = client.UploadString(uri, "POST", json); 
      var ok = ser.Deserialize<ResponseCreateRegistrantOk>(resp); 
     } 
     catch (WebException e) 
     { 
      //if there is an error, e.g. the registrant exists already 
      // we need an alternative deserialization 
      Stream s = new MemoryStream(); 

      using (Stream response = e.Response.GetResponseStream()) 
      { 
       byte[] buffer = new byte[1024]; 
       int byteCount; 
       do 
       { 
        byteCount = response.Read(buffer, 0, buffer.Length); 
        s.Write(buffer, 0, byteCount); 
       } while (byteCount > 0); 
      } 
      s.Seek(0, SeekOrigin.Begin); 

      string content = new StreamReader(s, Encoding.UTF8).ReadToEnd(); 
      s.Seek(0, SeekOrigin.Begin); 
      using (var err = new StreamReader(s)) 
      { 
       var sb = new StringBuilder("Registration Error\n"); 

       if (content.IndexOf("int_err_code") > -1) 
       { 
        var dupe = ser.Deserialize<ResponseCreateRegistrantDuplicate>(err.ReadToEnd()); 
        sb.AppendFormat(String.Format("Error Code: {0}<br />", dupe.ErrorCode)); 
        sb.AppendFormat(String.Format("Message: {0}<br />", dupe.Message)); 
       } 
       else 
       { 
        var dupe = ser.Deserialize<ResponseCreateRegistrantDuplicate>(err.ReadToEnd()); 
        sb.AppendFormat(String.Format("Description: {0}<br />", dupe.Description)); 
        //sb.AppendFormat(String.Format("Incident: {0}<br />", dupe.Incident)); 
        //sb.AppendFormat(String.Format("Registrant key: {0}<br />", dupe.RegistrantKey)); 
        sb.AppendFormat(String.Format("Join Url: {0}<br />", dupe.JoinUrl)); 
       } 

       sMessage = sb.ToString(); 
      } 
     } 
    } catch (Exception exc) { 
     exc.Data.Add("stringInfo", "inside"); 
     return ""; 
    } 
    return sMessage; 
} 
+0

@Anuja,你打算在這裏接受答案嗎? – MB34 2016-03-08 20:00:45