我使用此处显示的代码创建了一个测试html表单,当我在Key文本框中输入一个值时,选择两个类型中的第一个,然后单击Continue按钮,浏览器窗口将导航到一个XML版本的网页。如果我在表单操作行上用JSON替换XML,它将以JSON格式呈现相同的网页。将其替换为SUBMIT,生成的网页将只是一个普通的网页。
<!DOCTYPE html>
<html lang="en-us">
<head>
<meta charset="utf-8" />
</head>
<body>
<form action="https://www.someaddress.com/xxxxxxxxxx/999999999/XML" method="post">
<table role="presentation">
<tr>
<th><label for="key">Key</label></th>
<td><input type="text" id="key" name="key" size="10" autofocus> </td>
</tr>
<tr>
<th>Type</th>
<td>
<label><input type="radio" name="type" id="type1" value="type1"> Type 1</label>
<label><input type="radio" name="type" id="type2" value="type2"> Type 2</label>
</td>
</tr>
<tr>
<td></td>
<td><button type="submit" class="btn btn--primary">Continue</button></td>
</tr>
</table>
</form>
</body>
</html>
我遇到的问题是尝试将上面的网络表单的操作转换为下面的控制台应用程序的方法。当使用WebClient时(这是该应用程序在其他几个地方与Web交互的方式),字符串变量的值应该如何&#34;数据&#34;写入,以便它将被发布到传递给方法的目标IP地址并返回包含作为网页的XML数据的字符串?我已尝试下面显示的行(已采取从我在搜索互联网上找到这个问题的答案时找到的一个网页,以及MyKeyVal和type1的值被转义的双引号包围,但这两种方式都不适用于我。我收到错误,说明“第14行第6位的元开始标记与第22行第3位的结束标记不匹配”,但由于“数据”变量没有任何标记,我不确定应该更改什么来解决这样的错误。
static string Submit(string ip, string id)
{
string response;
using (var client = new WebClient())
{
Uri uri = new System.Uri("https://" + ip + "/xxxxxxxxxx/" + id + "/XML");
string data = "key = MyKeyVal type = type1";
response = client.UploadString(uri, data);
}
//additional parsing of the response goes here
return response;
}
答案 0 :(得分:0)
我的一位同事提出以下建议,尽管它没有使用WebClient,但它确实解决了我遇到的问题:
static string Submit(string ip, string id)
{
string response;
var client = (HttpWebRequest)WebRequest.Create("https://" + ip + "/xxxxxxxxxx/" + rt + "/XML");
client.ContentType = "application/x-www-form-urlencoded";
client.Method = "POST";
var requestStream = client.GetRequestStreamAsync().Result;
var data = Encoding.UTF8.GetBytes("key=MyKeyVal&type=type1");
requestStream.Write(data, 0, data.Length);
var result = client.GetResponseAsync().Result;
using (var reader = new StreamReader(result.GetResponseStream()))
{
response = reader.ReadToEnd();
}
//additional parsing of the response goes here
return response;
}