我正在尝试通过Acumatica ERP的REST API创建销售订单和发票。 出于某种原因,我只是因为我使用几乎相同的JSON来创建发票而出现错误:
这是我的RestService:
public class RestService : IDisposable
{
private readonly HttpClient _httpClient;
private readonly string _acumaticaBaseUrl;
#region Ctor
public RestService(string acumaticaBaseUrl, string userName, string password, string company, string branch, string locale)
{
_acumaticaBaseUrl = acumaticaBaseUrl;
_httpClient = new HttpClient(
new HttpClientHandler
{
UseCookies = true,
CookieContainer = new CookieContainer()
})
{
BaseAddress = new Uri(acumaticaBaseUrl + "/entity/Default/6.00.001/"),
DefaultRequestHeaders =
{
Accept = {MediaTypeWithQualityHeaderValue.Parse("text/json") }
}
};
//Log in to Acumatica ERP
_httpClient.PostAsJsonAsync(
acumaticaBaseUrl + "/entity/auth/login", new
{
name = userName,
password = password,
company = company,
branch = branch,
locale = locale
}).Result
.EnsureSuccessStatusCode();
}
void IDisposable.Dispose()
{
_httpClient.PostAsync(_acumaticaBaseUrl + "/entity/auth/logout",
new ByteArrayContent(new byte[0])).Wait();
_httpClient.Dispose();
}
#endregion
//Data submission
public string Put(string entityName, string parameters, string entity)
{
var res = _httpClient.PutAsync(_acumaticaBaseUrl + "/entity/Default/6.00.001/" + entityName + "?" + parameters, new StringContent(entity, Encoding.UTF8, "application/json")).Result
.EnsureSuccessStatusCode();
return res.Content.ReadAsStringAsync().Result;
}
}
这是主要代码:
using (RestService service = new RestService(ACUMATICA_INSTANCE_URL, USERNAME,PASSWORD,COMPANY, "", "EN-US"))
{
Console.WriteLine("Login successful");
string order = @"{
""OrderNbr"":{ value: ""000204"" },
""CustomerID"":{ value: ""TESTCST005""},
""Details"": [
{
""InventoryID"": { value: ""301CMPST02"" },
""Quantity"": { value: 10 }
}]
}";
string invoice = @"{
""ReferenceNbr"":{ value: ""001032"" },
""CustomerID"":{ value: ""TESTCST005""},
""Details"": [
{
""InventoryID"": { value: ""DESIGN"" },
""Quantity"": { value: 10 }
}]
}";
try
{
Console.WriteLine("Trying to create the following Order");
Console.WriteLine(order);
string updatedOrder = service.Put("SalesOrder", null, order);
Console.WriteLine("Order created successful");
Console.WriteLine(updatedOrder);
Console.WriteLine("Trying to create the following Invoice");
Console.WriteLine(invoice);
string updatedInvoice = service.Put("SalesInvoice", null, invoice);
Console.WriteLine("Invoice created successful");
Console.WriteLine(updatedInvoice);
}
catch(Exception exc)
{
Console.WriteLine(exc.Message);
}
Console.ReadLine();
}
我无法找出问题所在。我得到的回应总是如下:
“StatusCode:500,ReasonPhrase:'内部服务器错误',版本:1.1,内容:System.Net.Http.StreamContent,标题:\ r \ n {\ r \ n X-Handled-By:Acumatica-PX .Export / AuthenticationManagerModule \ r \ n Cache-Control:private \ r \ n Set-Cookie:Locale = TimeZone = GMTM0500G& Culture = en-US; path = / \ r \ n Set-Cookie:UserBranch = 5; path = / \ r \ n服务器:Microsoft-IIS / 8.5 \ r \ n X-Powered-By:ASP.NET \ r \ n日期:2017年8月2日星期三13:02:49 GMT \ r \ n内容长度: 36 \ r \ n Content-Type:text / json; charset = utf-8 \ r \ n}“
我可以使用这些相同的值添加屏幕发票。 以下是使用Acumatica ERP REST API创建客户的示例 Creation of a Record
答案 0 :(得分:0)
我没有你的" PostAsJsonAsync"函数,所以我不得不恢复到Acumatica提供的文档中使用的方法,并使用以下内容:
string credentialsAsString = JsonConvert.SerializeObject(new
{
name = userName,
password = password,
//company = Properties.Settings.Default.CompanyName,
//branch = Properties.Settings.Default.Branch
});
var response = _httpClient.PostAsync(acumaticaBaseUrl + "/entity/auth/login", new StringContent(credentialsAsString, Encoding.UTF8, "application/json")).Result;
但是,一旦我这样做,我发现的唯一错误是JSON结构错误。 您忘记将值关键字放在双引号之间。
这:
string order = @"{
""OrderNbr"":{ value: ""000204"" },
""CustomerID"":{ value: ""TESTCST005""},
""Details"": [
{
""InventoryID"": { value: ""301CMPST02"" },
""Quantity"": { value: 10 }
}]
}";
应该由此纠正:
string order = @"{
""OrderNbr"":{ ""value"": ""000204"" },
""CustomerID"":{ ""value"": ""TESTCST005""},
""Details"": [
{
""InventoryID"": { ""value"": ""301CMPST02"" },
""Quantity"": { ""value"": 10 }
}]
}";
答案 1 :(得分:0)
我遇到了同样的问题并解决了。
问题是客户“ TESTCST005”在系统中不存在。 您需要创建一个新客户:)