我试图从c#调用rest api方法。问题是它传递给body参数的所有内容类型。我在下面共享了我的代码。除了这段代码,我试图将body参数写成请求为stream.It也不起作用。我也尝试过'application / x-www-form-urlencoded'作为内容类型。
从c#sample调用rest api方法:
string token = Server.UrlEncode("v0WE/49uN1/voNwVA1Mb0MiMrMHjFunE2KgH3keKlIqei3b77BzTmsk9OIREken1hO9guP3qd4ipCBQeBO4jiQ==");
string url = "http://localhost:2323/api/Applications/StartProcess?token=" + token;
string data = @"{""ProcessParameters"": [{ ""Name"":""flowStarter"",""Value"": ""Waffles"" }],
""Process"": ""RESTAPISUB""}";
System.Net.Http.HttpClient client = new System.Net.Http.HttpClient();
client.BaseAddress = new System.Uri(url);
byte[] cred = UTF8Encoding.UTF8.GetBytes("username:password");
client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(cred));
client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
System.Net.Http.HttpContent content = new StringContent(data, UTF8Encoding.UTF8, "application/json");
HttpResponseMessage messge = client.PostAsync(url, content).Result;
string description = string.Empty;
if (messge.IsSuccessStatusCode)
{
string result = messge.Content.ReadAsStringAsync().Result;
description = result;
}
Rest api方法:
[HttpPost]
[ActionName("StartProcess")]
public int StartProcess([FromUri]string token,[FromBody]WorkflowStartParameters parameters)
{
try
{
LoginInformation info = CasheProcesses.ReadCashe(token);
eBAWSAPI api = Service.GetWSService();
WorkflowProcess proc = api.StartProcess(info.Id, info.Password, info.ImpersonateUserId, info.Language, parameters);
return proc.ProcessId;
}
catch (Exception ex)
{
throw new Exception("An error occured when starting process,exception detail:" + ex);
}
}
WorkflowStartParameters类结构:
public class WorkflowStartParameters
{
public WorkflowParameter[] ProcessParameters;
public string Process { get; set; }
}
public class WorkflowParameter
{
public string Name { get; set; }
public string Value { get; set; }
}
我经常搜索这个问题。这似乎是一个非常普遍的问题。我刚刚发现这个解决方案正常工作,将请求参数传递给rest api方法并从那里读取body参数。但对我来说这不是一个有效的解决方案。
如果您有任何想法,请随时分享。
谢谢, Zehra
答案 0 :(得分:0)
我不知道它是否能解决你的问题,但让我试一试。 我想您不必在通话中使用Server.UrlEncode,但是:
Dim myUri As New Uri(Token)
我猜你也不能编码你的用户名和密码 - 尝试将它们作为字符串传递。
答案 1 :(得分:0)
您的问题似乎在这里:
public class WorkflowStartParameters
{
public WorkflowParameter[] ProcessParameters; <---- needs get/set
public string Process { get; set; }
}
这需要是一个正确序列化的公共属性。目前,您已将其设置为公共字段。只需添加{get;组;并尝试一下。我还将研究使用Newtonsoft.Json进行序列化以确保您的对象正确序列化。尝试使用转义字符串将会弄乱您发送的数据。
顺便说一下,有时可能会出现序列化数组的问题,我会将其更改为:
public List<WorkflowParameter> ProcessParameters{get;set;}
答案 2 :(得分:0)
最后,我已经实现了向服务器发送填写的数据。这是关于序列化问题。但是在发送数据之前它不适用于json序列化。我已经将DataContract属性添加到我的类中,它可以正常工作。
不幸的是,当我从java脚本调用ajax调用它没有DataContract属性时仍然无法弄清楚这一点但是如果我在c#中调用它它需要DataContract属性。如果有人分享有关此信息,我将不胜感激!
我正在分享新的类结构,除此之外还有其他一切:
[Serializable]
[DataContract]
public class WorkflowParameter
{
[DataMember]
public string Name { get; set; }
[DataMember]
public string Value { get; set; }
}
[Serializable]
[DataContract]
public class WorkflowStartParameters
{
[DataMember]
public WorkflowParameter[] ProcessParameters { get; set; }
[DataMember]
public string Process { get; set; }
}