【发布时间】:2014-05-21 16:48:25
【问题描述】:
我无法从 Random.org 获取号码。我正在关注他们的 API,并且我相信我已经正确构建了请求。这是请求代码:
self.GetResults = function () {
$.ajax({
url: 'https://api.random.org/json-rpc/1/invoke',
dataType: "json",
contentType: "application/json-rpc; charset=utf-8",
type: 'POST',
data: {
"jsonrpc": "2.0",
"method": "generateIntegers",
"params": {
"apiKey": "Get-a-free-one-at-the-site",
"n": 1,
"min": 1,
"max": 20
},
"id": 1
}
})
.done(function (data, status, request)
{
alert("Success! " + data[0]);
})
.fail(function (request, status, error)
{
alert("Failed " + error);
});
}
我遇到的问题如下:
- 如果我不包含
contentType: "application/json; charset=utf-8",则默认类型为"application/x-www-form-urlencoded; charset=UTF-8",根据jQuery API 文档。 Random.org 在他们的 API 中声明他们需要 JSON 请求(特别是 application/json-rpc,但 application/json 是可以接受的)。因此,我得到一个解析错误作为响应。 - 如果我确实包含了上述内容类型,则会收到错误消息“Access-Control-Allow-Headers 不允许请求标头字段 Content-Type。”
我已尝试将代码添加到 web.config 以允许请求标头如下:
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept" />
</customHeaders>
</httpProtocol>
来自这个帖子https://stackoverflow.com/a/12413863/981202,但运气不好。
我也尝试过如下修改 Global.asax:
protected void Application_PreSendRequestHeaders(object sender, EventArgs e)
{
HttpContext.Current.Response.Headers.Remove("Access-Control-Allow-Headers");
}
就像在另一个 Stack Overflow 帖子中一样(我没有链接),但这似乎也没有做到。为了清楚起见,我把这个函数放在 Application_Start() 函数之后。
您可能想知道为什么我不只使用 Random 类。原因是因为我想使用 Random.org,如果没有别的,那么作为练习。如果存在,我想找到解决此问题的方法。之前我这里有一些数据表明C#的Random类做的不是很好,但是我更正了,所以数据已经被删除了。是的,Random 类是一个选项,但正如我所提到的,我想找到解决这个问题的方法。
【问题讨论】:
-
你能链接到你在 random.org 上阅读的文档吗?我正在查看random.org/clients/http,根据我在那里看到的内容,您需要做的就是请求以下网址:random.org/integers/…。此外,即使 System.Random 并不是真正的随机,但似乎在数以万计的试验中,您会看到比这更好的分布。
-
你能展示你在哪里实现了 C# 随机类吗?使用相同的数据,运行我自己的测试生成的直线比你的要直线得多。
-
@pmcoltrane:我正在阅读的 Random.org 文档在这里:api.random.org/json-rpc/1 具体在这里:api.random.org/json-rpc/1/introduction 和这里(在 generateIntegers 下:api.random.org/json-rpc/1/basic
-
@Jonesy:我会尽我所能向你展示。 Counter 类只是一个 switch 语句,每次生成一个数字时都会将其递增 1。 if (response == 'y') { while (DateTime.Now
-
您应该在循环之外实例化 Random 一次。
Random rand = new Random();使用系统计时器作为其种子值创建一个新的 Random 实例。通过在循环内调用它,您可能会重复使用相同的计时器值对其进行播种。请参阅msdn.microsoft.com/en-us/library/h343ddh9.aspx 的备注。 (我将不得不查看您链接的 json-rpc 文档。)
标签: c# jquery ajax json random