如何转换实体?

Raysefo

知名会员
已加入
2019年2月22日
留言内容
192
编程经验
10+
你好

我想知道是否可以将我的实体转换为这种格式?

C#:
version=V1&signature=5e7efbcf0c9cb2211&ApplicationCode=52e7cf966b724749a

提前致谢。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,497
地点
弗吉尼亚州切萨皮克
编程经验
10+
您可以,但是为什么呢?

通常,由于以下原因,当今大多数人避免将参数作为URL传递:
-URL黑客的可能性-有人可以使用您不希望看到的查询字符串中的无效数据开始调用WebAPI
-敏感信息的潜在暴露
-使用不同的浏览器达到URL长度限制-是的,有RFC,但并非所有人都遵循
-浏览器,代理等执行的URL编码/解码不一致-是的,虽然有RFC,但并非所有人都遵循

无论如何,如果仅关注特定类是固定的,则建立该查询字符串是一个简单的串联练习。如果您需要通用的东西,请参阅以下方法 堆栈溢出。它们基本上都枚举了一个类的属性,并开始根据属性名称和值构建一个字符串。
 

Raysefo

知名会员
已加入
2019年2月22日
留言内容
192
编程经验
10+
我正在尝试生成一个请求,这就是为什么我需要 @跳伞

C#:
//HTTPWebRequest
var request = (HttpWebRequest) WebRequest.Create("http://test/pinstore/" + url);
request.ContentType = "application/json";
request.Method = "POST";

//Generate Request
string requestString =
                      $"version={productRequest.version}&signature={productRequest.signature}&ApplicationCode={productRequest.ApplicationCode}";

using (var streamWriter = new StreamWriter(await request.GetRequestStreamAsync()))
{
     streamWriter.Write(requestString);
}

HttpWebResponse httpResponse = (HttpWebResponse) (await request.GetResponseAsync());
string json;
using (Stream responseStream = httpResponse.GetResponseStream())
{
     json = new StreamReader(responseStream).ReadToEnd();
}

response = new HttpResponseMessage
{
        StatusCode = System.Net.HttpStatusCode.OK,
        Content = new StringContent(json, System.Text.Encoding.UTF8, "application/json"),
};
                        
                  
return response;
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,497
地点
弗吉尼亚州切萨皮克
编程经验
10+
嗯...如果您请求的内容类型是JSON,为什么要发送Web表单内容?
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,923
地点
英国
编程经验
10+
我想知道是否可以将我的实体转换为这种格式?
不是直接没有。 Kinda击败了使用数据库映射器的目的。没有?
希望您打算对它们进行URL编码。乍一看,如果您不对它们进行编码,那么看起来好像游戏苏丹并不关心解码。他们必须采取什么保护措施来防止URI劫持。 。 。

如果您问我,他们应该考虑加密。但是他们没有问我,所以我猜谁在乎。
 
Last edited:

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,497
地点
弗吉尼亚州切萨皮克
编程经验
10+
在查看他的代码时,他不必担心URL黑客和劫持问题,因为他没有将字符串作为URL的查询字符串附加。相反,他将字符串作为HTTP POST的有效负载发送。

就个人而言,请遵循KISS和YAGNI原则。如果您的有效负载仅包含这3个字段,或者是两个不同类中的一组非常有限的字段,则只需使用已有的代码即可。无需实现进行反射的通用解决方案。

如上所述,您可能需要担心URL编码,但实际上取决于游戏API期望的有效负载类型。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,497
地点
弗吉尼亚州切萨皮克
编程经验
10+
如果要异步获取请求流,为什么还要异步获取响应流?是否因为您认为整个响应足够小而以异步方式获得响应时可以作为单个数据包出现?

无论如何,此处的异步与该线程的主题正交:为您对正在使用的游戏Web API的Web请求建立有效负载字符串。
 

Raysefo

知名会员
已加入
2019年2月22日
留言内容
192
编程经验
10+
这对你来说是个好消息 @跳伞@谢平  :) 我尝试了2100位用户的负载测试,没有错误。感谢您提供的所有支持,并为我造成的麻烦深表歉意。我希望最后一个问题是,响应可能不会很小,所以我应该从响应中删除等待吗?

这是代码示例:
C#:
//HTTPWebRequest
var request = (HttpWebRequest) WebRequest.Create("http://qa-api.mol.com/pinstore/" + url);
request.ContentType = "application/x-www-form-urlencoded";
request.Method = "POST";

var keyValueContent = productRequest.ToKeyValue();
var formUrlEncodedContent = new FormUrlEncodedContent(keyValueContent);
var urlEncodedString = await formUrlEncodedContent.ReadAsStringAsync();

using (var streamWriter = new StreamWriter(await request.GetRequestStreamAsync()))
{
      streamWriter.Write(urlEncodedString);
}

HttpWebResponse httpResponse = (HttpWebResponse) (await request.GetResponseAsync());
string json;
using (Stream responseStream = httpResponse.GetResponseStream())
{
      json = new StreamReader(responseStream).ReadToEnd();
}
                    
            
return response;

这是ToKeyValues:

C#:
public static IDictionary<string, string> ToKeyValues(this object metaToken)

{

     if (metaToken == null)

     {

         return null;

     }


     JToken token = metaToken as JToken;

     if (token == null)

     {

         return ToKeyValues(JObject.FromObject(metaToken));

     }


     if (token.HasValues)

     {

         var contentData = new Dictionary<string, string>();


         foreach (var child in token.Children().ToList())

         {

              var childContent = child.ToKeyValues();

              if (childContent != null)

              {

                    contentData = contentData.Concat(childContent).ToDictionary(k => k.Key, v => v.Value);

              }

         }


         return contentData;

}


var jValue = token as JValue;

if (jValue?.Value == null)

{

     return null;

}


var value = jValue?.Type == JTokenType.Date

         ? jValue?.ToString("o", CultureInfo.InvariantCulture)

         : jValue?.ToString(CultureInfo.InvariantCulture);


return new Dictionary<string, string> {{token.Path, value}};

}
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,497
地点
弗吉尼亚州切萨皮克
编程经验
10+
Since you are returning response on line 23, 和 not really doing anything with the HttpWebResponse because you just throw away the json string, you might as well just delete lines 15-22.
 

Raysefo

知名会员
已加入
2019年2月22日
留言内容
192
编程经验
10+
我以某种方式添加了缺少的代码,这是完整的代码:
C#:
//HTTPWebRequest
var request = (HttpWebRequest)WebRequest.Create("http://qa-api.mol.com/pinstore/" + url);
request.ContentType = "application/x-www-form-urlencoded";
request.Method = "POST";

var keyValueContent = gameRequest.ToKeyValue();
var formUrlEncodedContent = new FormUrlEncodedContent(keyValueContent);
var urlEncodedString = await formUrlEncodedContent.ReadAsStringAsync();

using (var streamWriter = new StreamWriter(await request.GetRequestStreamAsync()))
{
      streamWriter.Write(urlEncodedString);
}

HttpWebResponse httpResponse = (HttpWebResponse)(await request.GetResponseAsync());
string json;
using (Stream responseStream = httpResponse.GetResponseStream())
{
      json = new StreamReader(responseStream).ReadToEnd();
}

response = new HttpResponseMessage
{
      StatusCode = System.Net.HttpStatusCode.OK,
      Content = new StringContent(json, System.Text.Encoding.UTF8, "application/json"),
};



return response;
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,497
地点
弗吉尼亚州切萨皮克
编程经验
10+
为什么不只是使用 流内容 on line 25? Just pass in the httpResponse.GetResponseStream(), so that you can get rid of lines 16-20.

为什么不只是使用 复制 ToAsync() 替换8-13行?
 

Raysefo

知名会员
已加入
2019年2月22日
留言内容
192
编程经验
10+
@跳伞 我不明白如何使用copytoasync?

C#:
//HTTPWebRequest
var request = (HttpWebRequest) WebRequest.Create("http://qa-api.mol.com/pinstore/" + url);
request.ContentType = "application/x-www-form-urlencoded";
request.Method = "POST";

var keyValueContent = productRequest.ToKeyValue();
var formUrlEncodedContent = new FormUrlEncodedContent(keyValueContent);
var urlEncodedString = await formUrlEncodedContent.ReadAsStringAsync();
using (var streamWriter = new StreamWriter(await request.GetRequestStreamAsync()))
{
     streamWriter.Write(urlEncodedString);
}

HttpWebResponse httpResponse = (HttpWebResponse) (await request.GetResponseAsync());
                
response = new HttpResponseMessage
{
     StatusCode = httpResponse.StatusCode,
     Content = new 流内容(httpResponse.GetResponseStream()),
};
                        
return response;
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,497
地点
弗吉尼亚州切萨皮克
编程经验
10+
还是您只是从其他地方复制并粘贴了它?它所做的只是将内容复制到流中。听起来像是实际上恰当地命名的功能的完美匹配。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,923
地点
英国
编程经验
10+
@Skydiver我不明白如何使用copytoasync?
怎么会?该文档很有见地。
您甚至不知道您的8-12行目前正在做什么?
再一次,忽略重要的问题?如果您不知道自己的代码在做什么,那么您如何期望它正常工作?
 
最佳 底部