[英]HTTP request with C#
我想转换函数中收到的Object,并根据需要将其转换为对象({"some_key": "some_value"})
。
这是我的代码:
public HttpRequests(string url, string method, Object data)
{
//The following prepares data, according to received parameter
if (data is Array)
{
data = (Array)data;
}
else if (data is Dictionary<Object, Object>)
{
data = ((Dictionary<string, string>)data)["something"] = platform_secret;
data = ((Dictionary<string, string>)data)["something2"] = "1";
}
method = method.ToUpper(); //POST or GET
this.url = just_url + url;
this.data = Newtonsoft.Json.JsonConvert.SerializeObject(data);
this.method = method;
}
public Object performRequest()
{
if (this.data != null && url != null)
{
WebRequest request = HttpWebRequest.Create(url);
byte[] data_bytes = Encoding.ASCII.GetBytes(Convert.ToChar(data)[]);
//^ this does not work. Am I supposed to do this?
// as I said, what I want is to get an object {key: something} that can be read
// by $_POST["key"] in the server
request.Method = method;
request.ContentType = "application/x-www-form-urlencoded"; //TODO: check
//request.ContentLength = ((Dictionary<string, string>) data);
request.ContentLength = data_bytes.Length;
Stream dataStream = request.GetRequestStream(); //TODO: not async at the moment
//{BEGIN DOUBT
dataStream.Write(data_bytes, 0, data_bytes.Length);
dataStream.Close();
//DOUBT: DO THIS ^ or THIS:_ ???
StreamWriter writer = new StreamWriter(dataStream);
writer.Write(this.data);
//End DOUBT}
WebResponse response = request.GetResponse();
Stream dataResponse = response.GetResponseStream();
writer.Close();
response.Close();
dataStream.Close();
return dataResponse.
}
我到底错过了什么?
当你最初分配this.data = Newtonsoft.Json.JsonConvert.SerializeObject(data);
,假设他的.data有类型字符串(如果不是,你可以改变)。
然后代替byte[] data_bytes = Encoding.ASCII.GetBytes(Convert.ToChar(data)[]);
你需要只写byte[] data_bytes = Encoding.ASCII.GetBytes(data);
使用完之后
//{BEGIN DOUBT
dataStream.Write(data_bytes, 0, data_bytes.Length);
dataStream.Close();
它将有助于使用一些数据进行调用,但它无助于解决您的问题。 request.ContentType = "application/x-www-form-urlencoded";
不期望数据是Newtonsoft.Json.JsonConvert.SerializeObject
序列化。 它期望一个字符串包含和分隔的urlencoded对。
name1=value1&name2=value2&name3=value3
因此,您需要使用此格式而不是JSON。
您需要使用第一段代码。 这是和exmaple。 但我猜,第二部分也可以奏效。 你在C#方面一无所获。 但是,问题可能出在您要转移的数据中。 例如,如果没有正确编码。
你应该做更接近这条线的事情......
void Main()
{
var formSerializer = new FormEncodedSerializer();
formSerializer.Add("key", "value");
formSerializer.Add("foo", "rnd");
formSerializer.Add("bar", "random");
var uri = @"http://example.com";
var contentType = @"application/x-www-form-urlencoded";
var postData = formSerializer.Serialize();
var http = new Http();
Console.WriteLine (http.Post(uri, postData, contentType));
}
public class Http
{
public string Post(string url, string data, string format)
{
var content = Encoding.UTF8.GetBytes(data);
var contentLength = content.Length;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.ServicePoint.Expect100Continue = false;
request.Method = "POST";
request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
request.ContentType = format;
request.ContentLength = contentLength;
using (Stream requestStream = request.GetRequestStream())
{
requestStream.Write(content, 0, content.Length);
}
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
using (Stream responseStream = response.GetResponseStream())
using (StreamReader reader = new StreamReader(responseStream))
{
return reader.ReadToEnd();
}
}
}`
public class FormEncodedSerializer
{
private Dictionary<string, string> formKeysPairs;
public FormEncodedSerializer(): this(new Dictionary<string, string>())
{
}
public FormEncodedSerializer(Dictionary<string, string> kvp)
{
this.formKeysPairs = kvp;
}
public void Add(string key, string value)
{
formKeysPairs.Add(key, value);
}
public string Serialize()
{
return string.Join("", this.formKeysPairs.Select(f => string.Format("&{0}={1}", f.Key,f.Value))).Substring(1);
}
public void Clear()
{
this.formKeysPairs.Clear();
}
}
我真的不明白你的服务期望,你需要以哪种格式发送数据。 无论如何,如果您将ContentType设置为“application / x-www-form-urlencoded”,则必须使用此格式对数据进行编码。 您只需使用此代码即可完成此操作;
var values = ((Dictionary<string, string>)data).Aggregate(
new NameValueCollection(),
(seed, current) =>
{
seed.Add(current.Key, current.Value);
return seed;
});
所以,你的数据就像“something = platform_secret&something2 = 1”一样发送
现在,您可以简单地发送表单数据:
WebClient client = new WebClient();
var result = client.UploadValues(url, values);
我认为你的第一个函数与签名public HttpRequests(string url, string method, Object data)
似乎没有任何逻辑错误,但在你的第二个函数与签名public Object performRequest()
你有一些问题:
如果您的方法是POST并且您的数据是JSON,则需要设置HTTP请求者,如下所示:
request.ContentType = "application/json";
最后,在关闭之前刷新你的流,就像这个request.Flush();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.