如何创建跨域 HTTP 请求
How to create a cross domain HTTP request
我有一个网站,我需要一种通过 http 请求从不同网站获取 html 数据的方法,我四处寻找实现它的方法,大多数人说是通过 ajax 改为调用。
ajax 调用被链接阻止,所以我想尝试一个普通的跨域 http 请求,希望它不会以任何方式被阻止。
如果您有服务器 运行ning 并且能够在其上 运行 编码,您可以在服务器端进行 HTTP 调用。请记住,尽管大多数网站只允许每个 IP 地址调用这么多次,因此您无法通过这种方式为大量用户提供服务。
这是一个简单的 httpListener,当 QueryString 包含 ?site=http://linkedin.com
:
时下载网站内容
// setup an listener
using(var listener = new HttpListener())
{
// on port 8080
listener.Prefixes.Add("http://+:8080/");
listener.Start();
while(true)
{
// wait for a connect
var ctx = listener.GetContext();
var req = ctx.Request;
var resp = ctx.Response;
// default page
var cnt = "<html><body><a href=\"/?site=http://linkedin.com\">click me</a> </body></html>";
foreach(var key in req.QueryString.Keys)
{
if (key!=null)
{
// if the url contains ?site=some url to an site
switch(key.ToString())
{
case "site":
// lets download
var wc = new WebClient();
// store html in cnt
cnt = wc.DownloadString(req.QueryString[key.ToString()]);
// when needed you can do caching or processing here
// of the results, depending on your needs
break;
default:
break;
}
}
}
// output whatever is in cnt to the calling browser
using(var sw = new StreamWriter(resp.OutputStream))
{
sw.Write(cnt);
}
}
}
要使上述代码正常工作,您可能需要为 url 设置权限,如果您使用的是开发箱,请执行以下操作:
netsh http add urlacl url=http://+:8080/ user=Everyone listen=yes
在生产环境中为用户使用合理的值。
设置好 运行 上述代码后,将浏览器指向
http://localhost:8080/
(注意最后的/)
您将得到一个带有 link 的简单页面:
单击 link 将向 httplistener 发送一个新请求,但这次使用查询字符串 site=http://linkedin.com
。服务器端代码将获取给定 url 处的 http 内容,在本例中为 LinkedIn.com。结果是 one-on-one 发送回浏览器,但您可以根据您的要求执行 post-processing/caching 等。
合法notice/disclaimer
大多数网站不喜欢以这种方式被抓取,而且他们的服务条款实际上可能禁止这样做。确保您不做会损害网站可靠性或导致对您采取法律行动的非法行为。
我有一个网站,我需要一种通过 http 请求从不同网站获取 html 数据的方法,我四处寻找实现它的方法,大多数人说是通过 ajax 改为调用。
ajax 调用被链接阻止,所以我想尝试一个普通的跨域 http 请求,希望它不会以任何方式被阻止。
如果您有服务器 运行ning 并且能够在其上 运行 编码,您可以在服务器端进行 HTTP 调用。请记住,尽管大多数网站只允许每个 IP 地址调用这么多次,因此您无法通过这种方式为大量用户提供服务。
这是一个简单的 httpListener,当 QueryString 包含 ?site=http://linkedin.com
:
// setup an listener
using(var listener = new HttpListener())
{
// on port 8080
listener.Prefixes.Add("http://+:8080/");
listener.Start();
while(true)
{
// wait for a connect
var ctx = listener.GetContext();
var req = ctx.Request;
var resp = ctx.Response;
// default page
var cnt = "<html><body><a href=\"/?site=http://linkedin.com\">click me</a> </body></html>";
foreach(var key in req.QueryString.Keys)
{
if (key!=null)
{
// if the url contains ?site=some url to an site
switch(key.ToString())
{
case "site":
// lets download
var wc = new WebClient();
// store html in cnt
cnt = wc.DownloadString(req.QueryString[key.ToString()]);
// when needed you can do caching or processing here
// of the results, depending on your needs
break;
default:
break;
}
}
}
// output whatever is in cnt to the calling browser
using(var sw = new StreamWriter(resp.OutputStream))
{
sw.Write(cnt);
}
}
}
要使上述代码正常工作,您可能需要为 url 设置权限,如果您使用的是开发箱,请执行以下操作:
netsh http add urlacl url=http://+:8080/ user=Everyone listen=yes
在生产环境中为用户使用合理的值。
设置好 运行 上述代码后,将浏览器指向
http://localhost:8080/
(注意最后的/)
您将得到一个带有 link 的简单页面:
单击 link 将向 httplistener 发送一个新请求,但这次使用查询字符串 site=http://linkedin.com
。服务器端代码将获取给定 url 处的 http 内容,在本例中为 LinkedIn.com。结果是 one-on-one 发送回浏览器,但您可以根据您的要求执行 post-processing/caching 等。
合法notice/disclaimer
大多数网站不喜欢以这种方式被抓取,而且他们的服务条款实际上可能禁止这样做。确保您不做会损害网站可靠性或导致对您采取法律行动的非法行为。