2016-04-29 4 views
0

Ich habe ein Problem beim Erstellen einer "Kaufrechnung" in der Sage One API. Unabhängig von den Änderungen, die ich an den übermittelten Daten vornimmt, erhalte ich anscheinend einen internen Dienstfehler von 500 und keine detaillierte Antwort, die sinnvolle Informationen enthält. Die Antwort ist immer die gleiche, egal welche Daten ich eintrage (mit nur was scheint, eine GUID im errorCode Feld und die Serverzeit zu sein). Die Antwort lautet wie folgt:Sage One API gibt 500 internen Dienstfehler beim Erstellen der Zahlungsrechnung zurück

{ 
"$diagnoses": [ 
{ 
    "$severity": "error", 
    "$dataCode": "UnexpectedError", 
    "$message": "Unexpected error", 
    "$source": { 
    "serverTime": "2016-04-29T15:48:11.637+00:00", 
    "errorCode": "3b83e1b5-164d-42d4-95b3-3479b09c93f1", 
    "requestPath": "/api/v2/purchase_invoices", 
    "queryString": "", 
     "requestMethod": "POST" 
     } 
    } 
    ] 
} 

ich positiv bin dies ist keine Genehmigung Problem, da ich beide bekommen und andere Datentypen diesen Stand erstellen. Dazu gehören Kontakte, die zum Erstellen einer Einkaufsrechnung benötigt werden.

Ich habe die Informationen auf ihre self-service site vorgestellt. Ich habe auch mit ihrer bare bones SDK als Grundlage für die meisten zugrunde liegenden Prozesse begonnen, mit denen ich arbeite. Seitdem habe ich die zugrundeliegende Struktur neu geschrieben, wobei ich dachte, dass sie ursprünglich durch das SDK verursacht wurde, was mich in die gleiche Situation führte - wo ich nur 500 interne Dienstfehler als Antwort erhalte.

Dies führt zu der Annahme, dass es ein Problem mit den Parametern selbst ist, da die Dokumentation einige Unterschiede zwischen den Parametern in der mittleren Spalte und den Daten im Beispielaufruf in der rechten Spalte aufweist. Insbesondere enthält das Beispiel zusätzliche Felder wie "extra_reference" und in den Werbebuchungen "product_id" und "product_code", die nicht in der mittleren Spalte aufgeführt sind.

Hier ist ein Teil des entsprechenden Code für den Anruf zu erinnern, wieder, dass die grundlegende Architektur sich ist, mit einigen Verfahrensänderungen in meine aktuelle Architektur passen, die nicht den eigentlichen Anruf beeinflussen:

protected override List<KeyValuePair<string, string>> GetPostDataValuesForCreate(
     SageOnePurchaseInvoice objectToCreate) 
    { 
     List<KeyValuePair<string, string>> postData = new List<KeyValuePair<string, string>>(); 

     postData.Add(new KeyValuePair<string, string>("expense[contact_id]", objectToCreate.ContactId.ToString())); 
     postData.Add(new KeyValuePair<string, string>("expense[date]", objectToCreate.Date)); 
     postData.Add(new KeyValuePair<string, string>("expense[due_date]", objectToCreate.DueDate)); 

     if (!string.IsNullOrWhiteSpace(objectToCreate.Reference)) 
     { 
      postData.Add(new KeyValuePair<string, string>("expense[reference]", objectToCreate.Reference)); 
     } 

     if (objectToCreate.ProjectId != 0) 
     { 
      postData.Add(new KeyValuePair<string, string>("expense[project_id]", objectToCreate.ProjectId.ToString())); 
     } 

     if (!string.IsNullOrWhiteSpace(objectToCreate.Notes)) 
     { 
      postData.Add(new KeyValuePair<string, string>("expense[notes]", objectToCreate.Notes)); 
     } 


     for (int i = 0; i < objectToCreate.LineItems.Length; i++) 
     { 
      string index = "expense[line_items_attributes][" + i.ToString() + "]["; 
      postData.Add(new KeyValuePair<string, string>(index + "description]", objectToCreate.LineItems[i].Description)); 
      postData.Add(new KeyValuePair<string, string>(index + "ledger_account_id]", objectToCreate.LineItems[i].LedgerAccount.Id.ToString())); 
      postData.Add(new KeyValuePair<string, string>(index + "quantity]", objectToCreate.LineItems[i].Quantity.ToString())); 
      postData.Add(new KeyValuePair<string, string>(index + "unit_price]", objectToCreate.LineItems[i].UnitPrice.ToString())); 
     } 

     return postData; 
    } 

Hier ist die eigentliche Methode, die die Web-Anfrage erstellt und ausgeführt werden:

public static string Create (Uri baseUrl, List> bodyParams, string Token, string signingSecret) { string result;

 string nonce = GenerateNonce(); 
     HttpWebRequest sageOneWebRequest = WebRequest.Create(baseUrl) as HttpWebRequest; 

     string PostParams = ConvertPostParams(bodyParams); 

     string signatureString = GetSignatureString(baseUrl, null, bodyParams, nonce, WebRequestMethods.Http.Post); 
     string signingKey = GetSigningKey(token, signingSecret); 
     string signature = GenerateHmac(signingKey, signatureString); 

     sageOneWebRequest.AllowAutoRedirect = true; 
     sageOneWebRequest.Accept = "*/*"; 
     sageOneWebRequest.UserAgent = "Itemize"; 
     sageOneWebRequest.Headers.Add("X-Signature", signature); 
     sageOneWebRequest.Headers.Add("X-Nonce", nonce); 
     sageOneWebRequest.ContentType = "application/x-www-form-urlencoded"; 
     sageOneWebRequest.Timeout = 100000; 
     sageOneWebRequest.Headers.Add("Authorization", "Bearer " + token); 
     sageOneWebRequest.Method = WebRequestMethods.Http.Post; 

     using (StreamWriter requestWriter = new StreamWriter(sageOneWebRequest.GetRequestStream())) 
     { 
      try 
      { 
       requestWriter.Write(PostParams); 
      } 
      catch(Exception ex) 
      { 
       throw new Exception("Exception thrown writing Post Params to Body", ex); 
      } 
     } 

     try 
     { 
      using (WebResponse response = sageOneWebRequest.GetResponse()) 
      { 
       Stream dataStream = response.GetResponseStream(); 
       using (StreamReader reader = new StreamReader(dataStream)) 
       { 
        result = reader.ReadToEnd(); 
       } 
      } 
     } 
     catch (WebException webex) 
     { 
      //This is where the error is caught 
      Logger.Error("Web Exception while processing Sage One Web Request: ", webex); 
      string text; 

      using (var sr = new StreamReader(webex.Response.GetResponseStream())) 
      { 
       text = sr.ReadToEnd(); 
      } 

      result = null; 
      throw new Exception("Web Exception thrown processing Sage One Request", webex); 
     } 
     catch (Exception ex) 
     { 
      Logger.Error("Exception while processing Sage One Web Request: ", ex); 
      result = null; 
      throw new Exception("Exception thrown processing Sage One Request", ex); 
     } 

     return result; 
    } 

Jede Hilfe mit diesem Problem würde sehr geschätzt werden! Vielen Dank!

bearbeiten: In Bezug auf den Vorschlag unten folgte die tatsächliche URL-Pfad ist „api.sageone.com/accounts/v2/purchase_invoices“, bemerkte nicht die requestpath in der Fehler empfangen.

Antwort

0

Sie eine Mitteilung verfassen, /purchase_invoices, noch Ihre Parameter sind für expense. Bitte verwenden Sie purchase_invoice Name, um Ihre Params zu verpacken.

0

Der Anforderungsweg ist gemäß der Fehlerreaktion nicht korrekt. Es zeigt "requestPath": "/ api/v2/purchase_invoices"

aber Dokumentation zeigt /accounts/v2/purchase_invoices

+0

Ich ändere meinen ursprünglichen Kommentar, aber es ist hier klar, die tatsächliche URL heißt "https://api.sageone.com/accounts/v2/purchase_invoices" wie in der Dokumentation angegeben. Ich weiß nicht, warum die API diese URL zurückgibt. –

Verwandte Themen