为什么此请求使用 HttpWebRequest 有效,但不适用于 RestSharp?
Why does this request works using HttpWebRequest but not with RestSharp?
我正在使用一个 API,它期望 body 请求中有一个 XML。首先,我通过 Postman 使用了 api 并且它起作用了,然后我使用 Postman 的工具将请求转换为 RestCharp C# 代码,然后使用该代码,我收到的响应与 Postman 不同。之后,我使用 Fiddler 生成带有邮递员请求的 c# 代码,并使用 fiddler 生成的代码我能够通过代码成功使用 API 。我只是想了解 postman 生成的代码和 Fiddler 生成的代码有什么区别。
这是从 Fiddler 生成的代码,它有效:
HttpWebRequest request =
(HttpWebRequest)WebRequest.Create("http://x.x.x.x.x");
request.Accept = "*/*";
request.KeepAlive = true;
request.Method = "POST";
request.ServicePoint.Expect100Continue = false;
byte[] postBytes = System.Text.Encoding.UTF8.GetBytes(body);
request.ContentLength = postBytes.Length;
Stream stream = request.GetRequestStream();
stream.Write(postBytes, 0, postBytes.Length);
stream.Close();
response = (HttpWebResponse)request.GetResponse();
这是使用 RestSharp 从 Postman 生成的代码(略有改动,但从 Postman 生成的代码仍然无效,我认为所做的更改不会影响结果)不工作:
var client = new RestClient("http://x.x.x.x.x");
client.ConfigureWebRequest((r) =>
{
r.ServicePoint.Expect100Continue = false;
r.KeepAlive = true;
});
var request = new RestRequest();
request.AddXmlBody(body);
IRestResponse response = client.Post(request);
return response;
我在 RestSharp 代码中尝试了很多东西,例如添加具有不同 content-types 和编码的 header,例如
request.AddHeader("Content-Type", "text/xml;charset=utf-8");
但没有任何效果。当 RestSharp 代码使用时 api 的响应说它收到 NPE 错误,我相信这意味着 NullPointerException,但是由于 api 通过邮递员和 Fiddler 生成的代码工作得很好,我认为问题不在 API。顺便说一句,代码中的参数 body 在两个代码中完全相同。
看起来请求正文与 API 预期的内容类型不匹配。当内容与 API 预期的内容类型不匹配时,您可能会收到 NPE 错误。
在您的提琴手生成的代码中,您发送 XML 字符串作为文本。
请添加以下代码:
request.AddHeader("Content-Type", "text/plain");
request.AddParameter("undefined", "<YourXml></YourXml>", ParameterType.RequestBody);
或
request.AddHeader("Content-Type", "application/xml");
request.AddParameter("undefined", "<YourXml></YourXml>", ParameterType.RequestBody);
而不是
request.AddXmlBody(body);
我正在使用一个 API,它期望 body 请求中有一个 XML。首先,我通过 Postman 使用了 api 并且它起作用了,然后我使用 Postman 的工具将请求转换为 RestCharp C# 代码,然后使用该代码,我收到的响应与 Postman 不同。之后,我使用 Fiddler 生成带有邮递员请求的 c# 代码,并使用 fiddler 生成的代码我能够通过代码成功使用 API 。我只是想了解 postman 生成的代码和 Fiddler 生成的代码有什么区别。
这是从 Fiddler 生成的代码,它有效:
HttpWebRequest request =
(HttpWebRequest)WebRequest.Create("http://x.x.x.x.x");
request.Accept = "*/*";
request.KeepAlive = true;
request.Method = "POST";
request.ServicePoint.Expect100Continue = false;
byte[] postBytes = System.Text.Encoding.UTF8.GetBytes(body);
request.ContentLength = postBytes.Length;
Stream stream = request.GetRequestStream();
stream.Write(postBytes, 0, postBytes.Length);
stream.Close();
response = (HttpWebResponse)request.GetResponse();
这是使用 RestSharp 从 Postman 生成的代码(略有改动,但从 Postman 生成的代码仍然无效,我认为所做的更改不会影响结果)不工作:
var client = new RestClient("http://x.x.x.x.x");
client.ConfigureWebRequest((r) =>
{
r.ServicePoint.Expect100Continue = false;
r.KeepAlive = true;
});
var request = new RestRequest();
request.AddXmlBody(body);
IRestResponse response = client.Post(request);
return response;
我在 RestSharp 代码中尝试了很多东西,例如添加具有不同 content-types 和编码的 header,例如
request.AddHeader("Content-Type", "text/xml;charset=utf-8");
但没有任何效果。当 RestSharp 代码使用时 api 的响应说它收到 NPE 错误,我相信这意味着 NullPointerException,但是由于 api 通过邮递员和 Fiddler 生成的代码工作得很好,我认为问题不在 API。顺便说一句,代码中的参数 body 在两个代码中完全相同。
看起来请求正文与 API 预期的内容类型不匹配。当内容与 API 预期的内容类型不匹配时,您可能会收到 NPE 错误。
在您的提琴手生成的代码中,您发送 XML 字符串作为文本。
请添加以下代码:
request.AddHeader("Content-Type", "text/plain");
request.AddParameter("undefined", "<YourXml></YourXml>", ParameterType.RequestBody);
或
request.AddHeader("Content-Type", "application/xml");
request.AddParameter("undefined", "<YourXml></YourXml>", ParameterType.RequestBody);
而不是
request.AddXmlBody(body);