当url有空格时绕过Crosdomain错误400

时间:2014-05-30 22:11:37

标签: c# unity3d

我正在使用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

我也尝试过其他几张卡片,同样的结果,那些没有空间的卡片,那些没有空间的卡片。

知道为什么会这样,以及如何解决它?

谢谢!

1 个答案:

答案 0 :(得分:2)

您需要对您的网址字符串进行双重编码。

此链接有效:

http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20html%20where%20url%3D%27http%3A%2F%2Fapi.mtgdb.info%2Fcards%2Faether%2520vial?fields=name,manacost,convertedManaCost%27%0A&format=json

注意我改了:

  

http://api.mtgdb.info/cards/aether%20vial

  

的http%3A%2F%2Fapi.mtgdb.info%2Fcards%2Faether%2520vial

Uri.EscapeUriString(Uri.EscapeUriString(url))应该这样做。

这也适用于您的非空间名称。