我有一个看起来像这样的ApiController:
public class UploadController : ApiController
{
public StatusModel PostXML(string languageCode, string username, string password, string xml)
{
...
}
}
我正试图从这样的外部项目中调用此方法:
public StatusModel UploadXML() {
var client = new RestClient("");
string url = "http://localhost:52335/api/upload/PostXML/de/" + HttpUtility.UrlEncode(TESTXML) + "/user/password";
var request = new RestRequest(url, Method.POST);
return client.Execute<StatusModel>(request).Data;
}
当TESTXML变量是一个像“Test”这样的简单文本时,会调用web api方法并传输值,但是只要我将任何xml标记放入其中,即使它只是一个“&lt;”,尽管我使用了UrlEncoding,它仍然没有了。 不仅我的web api函数没有被调用,Ajax调用我的UploadXML方法跳转到错误函数,尽管获得了http响应200.
经过几个小时的努力寻找解决方案,我没有想法。我究竟做错了什么?如何在URL中传递XML字符串作为参数?
由于
答案 0 :(得分:1)
这里有很多问题,但通常你应该发布你的数据,而不是使用GET网址来创建帖子:domain.com/controller/action/some/data/here是一个获取请求。 domain.com/controller/action是您的帖子网址,其中的数据采用post url格式的参数。然后,您可以将您的操作绑定到模型,而不是像您所做的那样绑定单个参数。
以下是我在基类中使用的一些代码,用于在从服务器端代码调用API时进行所有API调用:
public string CreateApiRequest(string url, object model, bool isPost)
{
try
{
ASCIIEncoding encoding = new ASCIIEncoding();
string postData = "";
if(model != null)
{
postData = Strings.SerializeToQueryString(model).TrimEnd(Convert.ToChar("&"));
}
byte[] data = encoding.GetBytes(postData);
var serviceUrl = "http://" + HttpContext.Request.Url.Host + "/api/{0}";
// create the post and get back our data stream
var myRequest = (HttpWebRequest)WebRequest.Create(new Uri(string.Format(serviceUrl, url)));
if (isPost)
{
myRequest.Method = "POST";
myRequest.ContentType = "application/x-www-form-urlencoded";
myRequest.Accept = "application/json";
myRequest.ContentLength = data.Length;
Stream newStream = myRequest.GetRequestStream();
// Send the data.
newStream.Write(data, 0, data.Length);
newStream.Close();
}
else
{
myRequest.Method = "GET";
myRequest.Accept = "application/json";
}
// Get response
using (HttpWebResponse response = myRequest.GetResponse() as HttpWebResponse)
{
// Get the response stream
var reader = new StreamReader(response.GetResponseStream());
// Read the whole contents and return as a string
var myString = reader.ReadToEnd();
return myString;
}
}
catch (Exception ex)
{
// handle error here, I have my own custom mailer
throw;
}
}
这就是我所说的。
var model = JsonConvert.DeserializeObject<List<Address>>(CreateApiRequest(url: "Address", model: null, isPost: false));
希望这会有所帮助