这里有一种通过JLink使用Apache HTTP客户端的方法:
Needs["JLink`"]
ClearAll@urlString
urlString[userAgent_String, url_String] :=
JavaBlock@Module[{http, get}
, http = JavaNew["org.apache.commons.httpclient.HttpClient"]
]
你可以按照以下方式使用此函数:
$userAgent =
"Mozilla/5.0 (X11
urlString[$userAgent, "http://www.htttools.com:8080/"]
如果需要,您可以将结果提供给ImportString
:
ImportString[urlString[$userAgent, "mysite"], "Data"]
使用更复杂的代码可以实现流媒体方法,但以上采用基于字符串的方法已足够,除非目标网络资源非常大。
我在Mathematica 7和8中尝试了此代码,并且我预计它也适用于v6。请注意,不能保证Mathematica将来的版本中始终包含Apache HTTP客户端。
工作原理
尽管表述为Mathematica,但解决方案本质上是用Java实现的。Mathematica内置了一个Java运行时环境,并且Mathematica和Java之间的桥梁是称为JLink的组件。
正如这种跨技术解决方案所典型的那样,即使没有太多的代码,也存在相当多的复杂性。本答案的范围超出了详细讨论代码工作原理的范畴,但是有几个项目将强调作为进一步阅读建议。
代码使用Apache HTTP client。选择此Java库是因为它作为标准Mathematica分发的未公开部分而分发-并且它恰好是Import
似乎在内部使用的库。
urlString
的整个主体都被包装在JavaBlock
中。这确保了在操作过程中创建的任何Java对象都由Java和Mathematica内存管理器协调适当释放。
JavaNew
用于创建相关的 Apache HTTP 客户端对象,HttpClient
和 GetMethod
。像 http.getParams()
这样的 Java 表达式在 JLink 中表示为 http@getParams[]
。Apache HTTP 客户端文档中记录了 Java 类和方法。
使用 MakeJavaObject
有些不寻常。在这种情况下,需要将 Mathematica 字符串作为参数传递,而期望一个 Java Object
。如果期望一个 Java String
,JLink 将自动创建一个。但是当期望 Object
时,JLink 无法进行推断,因此使用 MakeJavaObject
来给 JLink 提示。
URLTools 怎么样?
顺便提一下,我尝试回答这个问题的第一件事就是使用 Utilities`URLTools`FetchURL
。它看起来非常有前途,因为它接受一个名为 "RequestHeaderFields"
的选项。不幸的是,这并没有起作用,因为该函数的当前实现仅将该选项用于 HTTP POST 动词 -- 而不是 GET。也许将来的 Mathematica 版本将支持 GET 的选项。
request_header_replace User-Agent Nutscrape/1.0 (CP/M; 8-bit)
。 - Sjoerd C. de Vries