2016-12-23 2 views
1

Ich hoffe, dass jemand mit einem konkreten Beispiel kann helfenPOST-Daten mit REQUEST zu bekommen session

Von verschiedenen Beiträgen, die ich so weit gekommen, aber ich behalte Bad Request bekommen.

Im Grunde genommen versuche ich, mich mit einem AppToken-Schlüssel anzumelden und dann das SessionToken aus der Antwort abzurufen. Dies ist die Informationen, die sie von ihrer API-Dokumentation veröffentlicht

  • Request (JSON)
  • POST/login/Anwendung
  • Content-Type: application/json
  • { "Name": "Micros", "Key": "longstringasyourpasscodegeneratedfromtheapplication"}

Die Antwort sieht wie folgt aus (wenn einfache REST-Client)

<Login xmlns="http://schemas.datacontract.org/2004/07/Tamigo.Services.Entities" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><DefaultCompanyId i:nil="true"/><DefaultCompanyName i:nil="true"/><DefaultDepartmentId i:nil="true"/><DefaultDepartmentName/><Email/><EmployeeId i:nil="true"/><ImageUrl i:nil="true"/><MenuId>0</MenuId><Name i:nil="true"/><Password/><Role>Application</Role><SessionToken>e1f35353-08f7-4213-a6b9-251313b36701</SessionToken></Login> 

Und von dieser Antwort muss ich irgendwie das "SessionToken" in eine Variable holen, die in der nächsten GET-Anfrage verwendet wird.

Dies ist der Code, den ich bisher zusammengestellt habe. Das sind Code-Teile, die ich von anderen ähnlichen Fragen finden konnte (die natürlich nicht gut in meine anscheinend völlig einzigartige/nie zuvor gesehene Art von Anfrage passten):

using System; 
using System.Xml; 
using System.Net; 
using System.Text; 
using System.IO; 

namespace RESTServicesXMLParseExample 
{ 
    class Program 
    { 
     static void Main(string[] args) 

     { 
      try 
      { 
       var request = 
        (HttpWebRequest)WebRequest.Create("https://api.tamigo.com/login/application"); 

       var postData = "Name=test"; 
       postData += "&Key=y3LIZ5u5yR9A7a98ypBdygQyIBrqQwZdfdfZKmgtErQ="; 
       var data = Encoding.ASCII.GetBytes(postData); 

       request.Method = "POST"; 


       request.ContentType = "application/x-www-form-urlencoded"; 
       request.ContentLength = data.Length; 

       using (var stream = request.GetRequestStream()) 
       { 
        stream.Write(data, 0, data.Length); 
       } 

       var response = (HttpWebResponse)request.GetResponse(); 

       var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd(); 

       //Create the REST Services 'Find by Query' request 

       XmlDocument locationsResponse = MakeRequest(responseString); 
       ProcessResponse(locationsResponse); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.Message); 
       Console.Read(); 
      } 
     } 


     //Submit the HTTP Request and return the XML response 
     public static XmlDocument MakeRequest(string requestUrl) 
     { 
      try 
      { 
       HttpWebRequest request = WebRequest.Create(requestUrl) as HttpWebRequest; 
       HttpWebResponse response = request.GetResponse() as HttpWebResponse; 

       XmlDocument xmlDoc = new XmlDocument(); 
       xmlDoc.Load(response.GetResponseStream()); 
       return (xmlDoc); 

      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.Message); 

       Console.Read(); 
       return null; 
      } 
     } 

     static public void ProcessResponse(XmlDocument locationsResponse) 
     { 
      //Create namespace manager 
      XmlNamespaceManager nsmgr = new XmlNamespaceManager(locationsResponse.NameTable); 
      nsmgr.AddNamespace("rest", "http://schemas.datacontract.org/2004/07/Tamigo.Services.Entities"); 


      XmlNodeList formattedAddressElements = locationsResponse.SelectNodes("//rest:SessionToken", nsmgr); 
      Console.WriteLine("SessionToken"); 
      foreach (XmlNode SessionToken in formattedAddressElements) 
      { 
       Console.WriteLine(SessionToken.InnerText); 
      } 
      Console.WriteLine(); 

      Console.WriteLine("Press any key to exit"); 
      Console.ReadKey(); 
     } 
    } 
} 

Antwort

0

Wenn Ihre API-Dokumentation sagen Sie, eine Anwendung/json Nutzlast zu senden, dann sind Sie besser nicht ignorieren, da die Content-Type application/x-www-form-urlencoded wirklich etwas anderes ist.

Mit den folgenden Änderungen bekomme ich eine 401 Unauthorized, weil ich hoffe, dass der Schlüssel und/oder der Name ungültig sind. Also habe ich die Bad Request-Sache gelöst. Hier

var request = (HttpWebRequest)WebRequest.Create("https://api.tamigo.com/login/application"); 

request.Method = "POST"; 
request.ContentType = "application/json"; 

// create the serializer for the Login class 
var ser = new DataContractJsonSerializer(typeof(Login)); 
// set our login values 
var login = new Login{ Name="test", Key ="y3LIZ5u5yR9A7a98ypBdygQyIBrqQwZdfdfZKmgtErQ=" }; 

// serialize the Login instance directly to the request stream 
ser.WriteObject(request.GetRequestStream(), login); 

// handle response 
var response = (HttpWebResponse)request.GetResponse(); 

var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd(); 

ist der kleine Helfer-Klasse, die ich verwendet, um die DataContractJsonSerializer seine Arbeit tun konnte:

public class Login 
{ 
    public string Name; 
    public string Key; 
}