使用 C# Restsharp,如何复制表单 post?
Using C# Restsharp, how can I replicate a form post?
我正在使用休息服务取回一些 json 数据。作为测试工具,他们给了我一个 url,如果我在浏览器中转到 url,我有一个表单,我可以在文本区域中放置一些 json,然后提交表单,我在页面重新加载时得到 json 结果。
我现在正尝试通过在 C# 中使用 RestSharp 以编程方式复制此内容,但我 运行 遇到了一个问题,即调用结果是我要访问的页面的 html (而不是 json 结果)
这是我的代码:
var client = new RestClient {BaseUrl = new Uri("http://myhost.com:22333") };
var request = new RestRequest { Method = Method.POST, Resource = "/site/api", RequestFormat = DataFormat.Json };
request.AddBody(new
{
fieldtype = "name", value = "joe"
});
request.AddHeader("accept", "application/json");
client.Authenticator = new NtlmAuthenticator();
var response = client.Execute(request);
var jsonDto = new JsonDeserializer().Deserialize<ResultObj>(response);
如果我在调试器中查看 response.Content(在任何反序列化之前),我会看到网页的 html 字符串,我以 post 的形式访问了该网页(某物像这样)
<html>
<body>
<form method='POST'>
<table>
<tr>
<td>Enter the JSON:</td>
<td>
<textarea name="json_input" cols="80" rows="30">
</textarea>
</td>
</tr>
<tr><td colspan='2'><input type='Submit' value='submit'></td></tr>
</table>
</form>
</body>
</html>
谁能告诉我我在这里遗漏了什么,因为我希望在 response.Content 中得到与我在浏览器中提交表单后看到的相同的 json 结果
试试这个:
var client = new RestClient {"http://myhost.com:22333/site/api"};
var request = new RestRequest { RequestFormat = DataFormat.Json };
request.AddBody(new
{
fieldtype = "name", value = "joe"
});
client.Authenticator = new NtlmAuthenticator();
var response = client.Post(request);
if (response.StatusCode == HttpStatusCode.OK)
{
var jsonDto = new JsonDeserializer().Deserialize<ResultObj>(response);
form
有一个名为 json_input
的文本字段,将用作请求参数。
<textarea name="json_input" cols="80" rows="30">
并且您的 AddBody
方法表明您正在发送带有 fieldtype
和 value
参数的请求。
尝试用以下方法替换 AddBody
方法:
request.AddBody(new { json_input = "{ fieldtype : \"name\", value : \"joe\"}" });
//OR
request.AddParameter("json_input",
"{ fieldtype : \"name\", value : \"joe\"}");
确保根据 API 控制器方法的预期创建模型。
我已经使用您提供的信息创建了一个示例,您需要将所有表单字段添加到模型中。
//Model for the data you are sending
public class TestModel
{
public string Name { get; set; }
}
//define client, request and model
var client = new RestClient {BaseUrl = new Uri("http://myhost.com:22333") };
var request = new RestRequest { Method = Method.POST, Resource = "/site/api", RequestFormat = DataFormat.Json };
var testModel = new TestModel() { Name = "joe" };
//serialize model as json and add it to the request
var json = request.JsonSerializer.Serialize(testModel);
request.AddParameter("application/json; charset=utf-8", json, ParameterType.RequestBody);
//execute request
IRestResponse response = client.Execute(request);
确保您发布到 API 的正确 URI。
继续检查您收到的 HTML,看看它是否给您任何错误。
希望对您有所帮助。
如 HTML 代码所示,表单的操作 URL 将等待以下表单字段:
- json_input
在您的代码中,您调用 request.AddBody(new { ... })
执行以下操作:
- 当您将
RequestFormat
设置为 DataFormat.Json
时,默认使用的序列化器是 JsonSerializer
.
- Content-Type header 设置为 "application/json".
new { ... }
将被序列化为 json 字符串,并且 AddBody()
调用被转换为对 AddParameter()
的调用,使用参数 name "application/json",作为参数 value json 字符串,作为参数 type ParameterType.RequestBody
。
使用 Fiddler2 你可以看到你的代码制作的 POST:
如图所示,请求 body 是 {"fieldtype":"name", "value":"joe"}
,如果服务器需要表单字段 fieldtype 和 值;但期待这样的请求 body json_input={ "fieldtype": "name", "value": "joe" }
(为清楚起见已解码)。在下图中,您可以使用 HTML:
查看 POST
另外,添加的参数类型是ParameterType.RequestBody
,所以只使用AddBody()
函数添加的第一个body,其余的丢弃。
您可以通过创建一个名为 "json_input" 的 Parameter
并将其传递给函数 AddParameter()
:
来解决此问题
var client = new RestClient { BaseUrl = new Uri("http://myhost.com:22333") };
var request = new RestRequest { Resource = "/site/api", RequestFormat = DataFormat.Json };
var param = new Parameter
{
Type = ParameterType.GetOrPost,
Name = "json_input",
Value = new
{
fieldtype = "name",
value = "joe"
}
};
request.AddParameter(param);
client.Authenticator = new NtlmAuthenticator();
var response = client.Post(request);
if (response.StatusCode == System.Net.HttpStatusCode.Created)
{
var deserializer = new JsonDeserializer();
var jsonDto = deserializer.Deserialize<ResultObj>(response);
}
使用 ParameterType.GetOrPost
可以添加任意数量的参数(表单字段)。
正如您在我的代码中看到的,我添加了一个 if
语句来检查响应中返回的 HTTP StatusCode
因为通常 HTTP POST returns a 201 创建 代码。
您可以添加 else
语句来检查属性 response.ErrorException
和 response.ErrorMessage
以查看问题所在。
可能是 POST 格式不正确,服务器将您重定向到同一页面重试。
我正在使用休息服务取回一些 json 数据。作为测试工具,他们给了我一个 url,如果我在浏览器中转到 url,我有一个表单,我可以在文本区域中放置一些 json,然后提交表单,我在页面重新加载时得到 json 结果。
我现在正尝试通过在 C# 中使用 RestSharp 以编程方式复制此内容,但我 运行 遇到了一个问题,即调用结果是我要访问的页面的 html (而不是 json 结果)
这是我的代码:
var client = new RestClient {BaseUrl = new Uri("http://myhost.com:22333") };
var request = new RestRequest { Method = Method.POST, Resource = "/site/api", RequestFormat = DataFormat.Json };
request.AddBody(new
{
fieldtype = "name", value = "joe"
});
request.AddHeader("accept", "application/json");
client.Authenticator = new NtlmAuthenticator();
var response = client.Execute(request);
var jsonDto = new JsonDeserializer().Deserialize<ResultObj>(response);
如果我在调试器中查看 response.Content(在任何反序列化之前),我会看到网页的 html 字符串,我以 post 的形式访问了该网页(某物像这样)
<html>
<body>
<form method='POST'>
<table>
<tr>
<td>Enter the JSON:</td>
<td>
<textarea name="json_input" cols="80" rows="30">
</textarea>
</td>
</tr>
<tr><td colspan='2'><input type='Submit' value='submit'></td></tr>
</table>
</form>
</body>
</html>
谁能告诉我我在这里遗漏了什么,因为我希望在 response.Content 中得到与我在浏览器中提交表单后看到的相同的 json 结果
试试这个:
var client = new RestClient {"http://myhost.com:22333/site/api"};
var request = new RestRequest { RequestFormat = DataFormat.Json };
request.AddBody(new
{
fieldtype = "name", value = "joe"
});
client.Authenticator = new NtlmAuthenticator();
var response = client.Post(request);
if (response.StatusCode == HttpStatusCode.OK)
{
var jsonDto = new JsonDeserializer().Deserialize<ResultObj>(response);
form
有一个名为 json_input
的文本字段,将用作请求参数。
<textarea name="json_input" cols="80" rows="30">
并且您的 AddBody
方法表明您正在发送带有 fieldtype
和 value
参数的请求。
尝试用以下方法替换 AddBody
方法:
request.AddBody(new { json_input = "{ fieldtype : \"name\", value : \"joe\"}" });
//OR
request.AddParameter("json_input",
"{ fieldtype : \"name\", value : \"joe\"}");
确保根据 API 控制器方法的预期创建模型。 我已经使用您提供的信息创建了一个示例,您需要将所有表单字段添加到模型中。
//Model for the data you are sending
public class TestModel
{
public string Name { get; set; }
}
//define client, request and model
var client = new RestClient {BaseUrl = new Uri("http://myhost.com:22333") };
var request = new RestRequest { Method = Method.POST, Resource = "/site/api", RequestFormat = DataFormat.Json };
var testModel = new TestModel() { Name = "joe" };
//serialize model as json and add it to the request
var json = request.JsonSerializer.Serialize(testModel);
request.AddParameter("application/json; charset=utf-8", json, ParameterType.RequestBody);
//execute request
IRestResponse response = client.Execute(request);
确保您发布到 API 的正确 URI。
继续检查您收到的 HTML,看看它是否给您任何错误。
希望对您有所帮助。
如 HTML 代码所示,表单的操作 URL 将等待以下表单字段:
- json_input
在您的代码中,您调用 request.AddBody(new { ... })
执行以下操作:
- 当您将
RequestFormat
设置为DataFormat.Json
时,默认使用的序列化器是JsonSerializer
. - Content-Type header 设置为 "application/json".
new { ... }
将被序列化为 json 字符串,并且AddBody()
调用被转换为对AddParameter()
的调用,使用参数 name "application/json",作为参数 value json 字符串,作为参数 typeParameterType.RequestBody
。
使用 Fiddler2 你可以看到你的代码制作的 POST:
如图所示,请求 body 是 {"fieldtype":"name", "value":"joe"}
,如果服务器需要表单字段 fieldtype 和 值;但期待这样的请求 body json_input={ "fieldtype": "name", "value": "joe" }
(为清楚起见已解码)。在下图中,您可以使用 HTML:
另外,添加的参数类型是ParameterType.RequestBody
,所以只使用AddBody()
函数添加的第一个body,其余的丢弃。
您可以通过创建一个名为 "json_input" 的 Parameter
并将其传递给函数 AddParameter()
:
var client = new RestClient { BaseUrl = new Uri("http://myhost.com:22333") };
var request = new RestRequest { Resource = "/site/api", RequestFormat = DataFormat.Json };
var param = new Parameter
{
Type = ParameterType.GetOrPost,
Name = "json_input",
Value = new
{
fieldtype = "name",
value = "joe"
}
};
request.AddParameter(param);
client.Authenticator = new NtlmAuthenticator();
var response = client.Post(request);
if (response.StatusCode == System.Net.HttpStatusCode.Created)
{
var deserializer = new JsonDeserializer();
var jsonDto = deserializer.Deserialize<ResultObj>(response);
}
使用 ParameterType.GetOrPost
可以添加任意数量的参数(表单字段)。
正如您在我的代码中看到的,我添加了一个 if
语句来检查响应中返回的 HTTP StatusCode
因为通常 HTTP POST returns a 201 创建 代码。
您可以添加 else
语句来检查属性 response.ErrorException
和 response.ErrorMessage
以查看问题所在。
可能是 POST 格式不正确,服务器将您重定向到同一页面重试。