我正在使用YQL技巧绕过crossdomain.xml,如here所述,以便从我的一个Unity项目中的http://api.mtgdb.info/获取卡信息。它适用于名称中没有空格的卡,但是当出现时会出现“错误:400 Bad Request”。
我正在使用C#,我正在使用Uri.EscapeUriString()
来确保网址格式正确(因此空格变为%20)。
我的代码:
string fields = "name,manacost,convertedManaCost";
string bypassedURL = BypassCrosdomain("http://api.mtgdb.info/cards/" + info.Name + "?fields=" + fields, "json"); //info.Name is the card's name, either "ponder" or "aether vial"
var www = new WWW(url); //This is the Unity equivalent of an ajax GET
yield return www;
我制作的BypassCrossdomain方法:
string BypassCrosdomain(string url, string format) {
return
"http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20html%20where%20url%3D'" +
Uri.EscapeUriString(url) +
"'%0A&format=" + format;
}
因此,当我使用卡片“Ponder”尝试时,我没有得到任何错误,而旁路的URL是:
http://query.yahooapis.com/v1/public/yql?q=select%20 *%20from%20html%20where%20url%3D 'http://api.mtgdb.info/cards/ponder?fields=name,manacost,convertedManaCost' %0A&安培;格式= JSON
另一方面,当我尝试“Aether Vial”时,我收到400错误,网址为:
http://query.yahooapis.com/v1/public/yql?q=select%20 *%20from%20html%20where%20url%3D 'http://api.mtgdb.info/cards/aether%20vial?fields=name,manacost,convertedManaCost' %0A&安培;格式= JSON
我也尝试过其他几张卡片,同样的结果,那些没有空间的卡片,那些没有空间的卡片。
知道为什么会这样,以及如何解决它?
谢谢!
答案 0 :(得分:2)
您需要对您的网址字符串进行双重编码。
此链接有效:
注意我改了:
到
的http%3A%2F%2Fapi.mtgdb.info%2Fcards%2Faether%2520vial
Uri.EscapeUriString(Uri.EscapeUriString(url))
应该这样做。
这也适用于您的非空间名称。