2016-12-23 14 views
1

Я надеюсь, что кто-то может помочь с реальным примеромPOST данных с запросом, чтобы получить SessionToken

Из различных сообщений я получил это далеко, но я получаю Bad Request.

В основном я пытаюсь войти в систему, используя ключ AppToken, а затем извлекаю SessionToken из ответа. Это информация, они размещены с их API документации

  • Запрос (JSON)
  • POST/Войти/приложение
  • Content-Type: применение/JSON
  • { "Имя": "MICROS", "Key": "longstringasyourpasscodegeneratedfromtheapplication"}

реакция выглядит следующим образом (при использовании Simple 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> 

И от этого ответа мне нужно как-то получить «SessionToken» в переменную, которая будет использоваться в следующем запросе GET.

Это код, который я собрал до сих пор, который представляет собой фрагменты кода, которые я мог найти из других подобных вопросов (что, конечно же, не очень хорошо вписывалось в мой, по-видимому, совершенно уникальный/никогда не видный до типа запроса):

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(); 
     } 
    } 
} 

ответ

0

Если ваша документация API говорит вам послать полезную нагрузку приложения/JSON, то вам лучше не игнорировать, что, как тип содержимого application/x-www-form-urlencoded действительно что-то другое.

С приведенными ниже изменениями я получаю 401 Несанкционированный доступ, потому что я надеюсь, что ключ и/или имя недействительны. Поэтому я решил проблему с плохим запросом.

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(); 

Вот небольшой вспомогательный класс, который я использовал так в DataContractJsonSerializer мог выполнять свою работу:

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