我想要的是在对跨域进行Ajax调用时保护我的开发人员密钥。在我直接进入网址并插入密钥之前。喜欢这个
$.ajax({
url: "https://na.api.pvp.net/api/lol/na/v2.3/team/TEAM-ID?api_key=mykey",
type: "GET",
data: {},
success: function (json) {
console.log(json);
console.log(json[teamID].name);
console.log(json[teamID].fullId);
console.log(json[teamID].roster.ownerId);
console.log(json[teamID].tag);
},
error: function (error) {}
});
这会给我以下对象,我可以很容易地解析它。
然而,如上所述,任何人都可以在此过程中轻松抓住我的钥匙。所以我决定将这个动作移到我的Controller(是的,我知道这里不应该有业务逻辑,但它更安全,这是一个快速的过程。)
所以我现在正在做的是运行我的Javascript,它调用Controller以获得Json返回。
的Javascript
$.ajax({
url: "/Competitive/teamLookUp",
type: "POST",
data: "ID=" + teamID,
success: function (json) {
console.log(json);
},
error: function(error) {
}
});
然后我的控制器将其接收并尝试返回JSON。
[HttpPost]
public ActionResult teamLookUp(string ID)
{
HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create("https://na.api.pvp.net/api/lol/na/v2.3/team/" + ID + "?api_key=myKey");
myReq.ContentType = "application/json";
var response = (HttpWebResponse)myReq.GetResponse();
string text;
using (var sr = new StreamReader(response.GetResponseStream()))
{
text = sr.ReadToEnd();
}
return Json(new { json = text });
}
但是在此过程中,我返回的字符串不是JSON对象,因此我的脚本无法对其进行解析。
它将整个json作为一个长字符串返回。
此时我尝试将以下内容添加到我的控制器中。
var json2 = JsonConvert.DeserializeObject(text);
return Json(new { json = json2 });
但所有返回的都是一些空的Object。
过去4个小时我一直在试错,搜索和猜测。我不知道该怎么办了。我只是希望我的Controller传回一个像这样可以再次读取的Object。 (或者至少是某种格式化的json对象)
$.ajax({
url: "/Competitive/teamLookUp",
type: "POST",
data: "ID=" + teamID,
success: function (json) {
console.log(json);
console.log(json[teamID].name);
console.log(json[teamID].fullId);
console.log(json[teamID].roster.ownerId);
console.log(json[teamID].tag);
},
error: function (error) {}
});
答案 0 :(得分:4)
您的方法似乎不需要是POST
,因为它只是获取数据而不是修改数据。因此,您可以将其设置为GET
。
示例强>
[HttpGet]
public JsonResult teamLookUp(string ID)
{
// Your code
return Json(text, JsonRequestBehavior.AllowGet);
}
答案 1 :(得分:1)
以下是您的代码的摘录:
[HttpPost]
public ActionResult teamLookUp(string ID)
{
HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create("https://na.api.pvp.net/api/lol/na/v2.3/team/" + ID + "?api_key=myKey");
myReq.ContentType = "application/json";
// here's how to set response content type:
Response.ContentType = "application/json"; // that's all
var response = (HttpWebResponse)myReq.GetResponse();
string text;
using (var sr = new StreamReader(response.GetResponseStream()))
{
text = sr.ReadToEnd();
}
return Json(new { json = text }); // HERE'S THE ERRING LINE
}
根据您收到的回复,我可以理解text
已经包含您想要的JSON。
现在将return Json(new { json = text });
替换为Json(text);
,然后修复它。
要在评论中回答您的问题,请按以下步骤阅读回复数据:
$.ajax({
url: "/Competitive/teamLookUp",
type: "POST",
data: "ID=" + teamID,
dataType: "json", // type of data you're expecting from response
success: function (json) {
console.log(json);
console.log(json[teamID].name);
console.log(json[teamID].fullId);
console.log(json[teamID].roster.ownerId);
console.log(json[teamID].tag);
},
error: function (error) {}
});
答案 2 :(得分:0)
我认为问题在于你说return Json(new {json = text;})
。这告诉json序列化程序将所有数据转储到json对象中的一个名为' json'的属性中,这是你在响应中看到的。
请尝试return Json(text)
。
答案 3 :(得分:0)
使用 WebClient
结束[HttpPost]
public ActionResult teamLookUp(string ID)
{
string text = "";
try
{
using (var webClient = new System.Net.WebClient())
{
webClient.Encoding = Encoding.UTF8;
var json2 = webClient.DownloadString("https://na.api.pvp.net/api/lol/na/v2.3/team/" + ID + "?api_key=myKey");
return Json(json2);
}
}
catch (Exception e)
{
text = "error";
}
return Json(new { json = text });
}
我正常解析它,
$.ajax({
url: "/Competitive/teamLookUp",
type: "POST",
data: "ID=" + ID,
dataType: "json",
success: function (resp) {
if (resp["json"] == "error") {
// error reaching server
} else {
// successfully reached server
}
json = JSON && JSON.parse(resp) || $.parseJSON(resp);
var userID = ID;
teamName = json[userID].name;
teamID = json[userID].fullId;
teamCPT = json[userID].roster.ownerId;
teamTag = json[userID].tag;
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
// error
}
});
答案 4 :(得分:0)
我遇到了与原始海报相同的问题:ReadToEnd()调用结果会转义特殊字符,因此看起来不像接收端的JSON,但后来我看到一个类似的问题已回答here和认为别人读这篇文章可能会觉得有用。
总结一下:在原始海报尝试的控制器中反序列化是关键,但正如其他人所指出的那样,返回不需要新的{}调用。
拼凑在一起:
/Users/$USER/Library/Application Support/Google/Chrome/Default/History