C# HttpClient 不发送 POST 变量
C# HttpClient not sending POST variables
我正在尝试制作一个应用程序,它将向 https://owlexpress.kennesaw.edu/prodban/bwckschd.p_get_crse_unsec 发送 POST 请求,其中包含一些信息和 return 一个 class 列表。
你可以到这里去搜索"I'm using Fall 2015, MATH, Course 1190"。
https://owlexpress.kennesaw.edu/prodban/bwckschd.p_disp_dyn_sched
当我 运行 下面的代码时,它会将它 return 的内容输出到进入网络浏览器组件的字符串。它显示:
Class Schedule Search
Fall Semester 2015
Mar 31, 2015
Stop You must select at least ONE subject .
我使用 Chrome 调试找到 POST 值并将它们设置为我正常使用网站时的值。我什至包括了一些饼干以备不时之需。
编辑:
好的,新一期。我使用了一个有效的浏览器并得到了这个:"term_in=201508&sel_subj=dummy&sel_day=dummy&sel_schd=dummy&sel_insm=dummy&sel_camp=dummy&sel_levl=dummy&sel_sess=dummy&sel_instr=dummy&sel_ptrm=dummy&sel_attr=dummy&sel_subj=MATH&sel_crse=1190&sel_title=&sel_insm=%25&sel_from_cred=&sel_to_cred=&sel_camp=%25&sel_levl=%25&sel_ptrm=%25&sel_instr=%25&begin_hh=0&begin_mi=0&begin_ap=a&end_hh=0&end_mi=0&end_ap=a"
不过我无法发送它,因为它使用了一些名称两次,例如 sel_subj(这些是我在字典中的键值)
代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Net.Http;
using System.Net;
namespace ClassChecker
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
methods methods1 = new methods();
public MainWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
string temp = methods1.getData2();
Console.ReadLine();
webBrowser.NavigateToString(temp);
}
}
public class methods
{
public string getData2()
{
var cookieContainer = new CookieContainer();
using (var handler = new HttpClientHandler() { CookieContainer = cookieContainer })
using (var client = new HttpClient(handler))
{
client.BaseAddress = new Uri("https://owlexpress.kennesaw.edu");
var values = new Dictionary<string, string>
{
{ "sel_subj", "MATH" },
{ "term_in", "201508" },
{ "sel_day", "dummy"},
{ "sel_schd", "dummy"},
{ "sel_insm", "%"},
{ "sel_camp", "%"},
{ "sel_levl", "%"},
{ "sel_sess", "dummy"},
{ "sel_instr", "%"},
{ "sel_ptrm", "%"},
{ "sel_attr", "dummy"},
{ "sel_crse", "1190" },
{ "sel_title", "" },
{ "sel_from_cred", "" },
{ "sel_to_cred", "" },
{ "begin_hh", "0" },
{ "begin_mi", "0" },
{ "begin_ap", "a" },
{ "end_hh", "0" },
{ "end_mi", "0" },
{ "end_ap", "a" }
};
var content = new FormUrlEncodedContent(values);
cookieContainer.Add(client.BaseAddress, new Cookie("SESSID", "MFlIU0VSMTgxNjYx"));
cookieContainer.Add(client.BaseAddress, new Cookie("BIGipServerowlexpress-all", "2239289986.0.0000"));
client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("text/html"));
var result = client.PostAsync("/prodban/bwckschd.p_get_crse_unsec", content).Result;
string resultContent = result.Content.ReadAsStringAsync().Result;
MessageBox.Show(result.Headers.ToString());
return resultContent;
}
}
}
}
根据我们在评论中的讨论,您要发布的服务需要一组具有 'dummy' 值的参数和另一组具有实际值的相同参数。
如果您使用 NameValueCollection 作为进入 FormUrlEncodedContent 构造函数的参数,您将能够使用重复键。然后它应该工作
我正在尝试制作一个应用程序,它将向 https://owlexpress.kennesaw.edu/prodban/bwckschd.p_get_crse_unsec 发送 POST 请求,其中包含一些信息和 return 一个 class 列表。
你可以到这里去搜索"I'm using Fall 2015, MATH, Course 1190"。 https://owlexpress.kennesaw.edu/prodban/bwckschd.p_disp_dyn_sched
当我 运行 下面的代码时,它会将它 return 的内容输出到进入网络浏览器组件的字符串。它显示:
Class Schedule Search
Fall Semester 2015
Mar 31, 2015
Stop You must select at least ONE subject .
我使用 Chrome 调试找到 POST 值并将它们设置为我正常使用网站时的值。我什至包括了一些饼干以备不时之需。
编辑:
好的,新一期。我使用了一个有效的浏览器并得到了这个:"term_in=201508&sel_subj=dummy&sel_day=dummy&sel_schd=dummy&sel_insm=dummy&sel_camp=dummy&sel_levl=dummy&sel_sess=dummy&sel_instr=dummy&sel_ptrm=dummy&sel_attr=dummy&sel_subj=MATH&sel_crse=1190&sel_title=&sel_insm=%25&sel_from_cred=&sel_to_cred=&sel_camp=%25&sel_levl=%25&sel_ptrm=%25&sel_instr=%25&begin_hh=0&begin_mi=0&begin_ap=a&end_hh=0&end_mi=0&end_ap=a"
不过我无法发送它,因为它使用了一些名称两次,例如 sel_subj(这些是我在字典中的键值)
代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Net.Http;
using System.Net;
namespace ClassChecker
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
methods methods1 = new methods();
public MainWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
string temp = methods1.getData2();
Console.ReadLine();
webBrowser.NavigateToString(temp);
}
}
public class methods
{
public string getData2()
{
var cookieContainer = new CookieContainer();
using (var handler = new HttpClientHandler() { CookieContainer = cookieContainer })
using (var client = new HttpClient(handler))
{
client.BaseAddress = new Uri("https://owlexpress.kennesaw.edu");
var values = new Dictionary<string, string>
{
{ "sel_subj", "MATH" },
{ "term_in", "201508" },
{ "sel_day", "dummy"},
{ "sel_schd", "dummy"},
{ "sel_insm", "%"},
{ "sel_camp", "%"},
{ "sel_levl", "%"},
{ "sel_sess", "dummy"},
{ "sel_instr", "%"},
{ "sel_ptrm", "%"},
{ "sel_attr", "dummy"},
{ "sel_crse", "1190" },
{ "sel_title", "" },
{ "sel_from_cred", "" },
{ "sel_to_cred", "" },
{ "begin_hh", "0" },
{ "begin_mi", "0" },
{ "begin_ap", "a" },
{ "end_hh", "0" },
{ "end_mi", "0" },
{ "end_ap", "a" }
};
var content = new FormUrlEncodedContent(values);
cookieContainer.Add(client.BaseAddress, new Cookie("SESSID", "MFlIU0VSMTgxNjYx"));
cookieContainer.Add(client.BaseAddress, new Cookie("BIGipServerowlexpress-all", "2239289986.0.0000"));
client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("text/html"));
var result = client.PostAsync("/prodban/bwckschd.p_get_crse_unsec", content).Result;
string resultContent = result.Content.ReadAsStringAsync().Result;
MessageBox.Show(result.Headers.ToString());
return resultContent;
}
}
}
}
根据我们在评论中的讨论,您要发布的服务需要一组具有 'dummy' 值的参数和另一组具有实际值的相同参数。
如果您使用 NameValueCollection 作为进入 FormUrlEncodedContent 构造函数的参数,您将能够使用重复键。然后它应该工作