Вот способ использования HTTP-клиента Apache через JLink:
Needs["JLink`"]
ClearAll@urlString
urlString[userAgent_String, url_String] :=
JavaBlock@Module[{http, get}
, http = JavaNew["org.apache.commons.httpclient.HttpClient"]
; http@getParams[]@setParameter["http.useragent", MakeJavaObject@userAgent]
; get = JavaNew["org.apache.commons.httpclient.methods.GetMethod", url]
; http@executeMethod[get]
; get@getResponseBodyAsString[]
]
Вы можете использовать эту функцию следующим образом:
$userAgent =
"Mozilla/5.0 (X11;Linux i686) AppleWebKit/534.24 (KHTML,like Gecko) Chrome/11.0.696.68 Safari/534.24";
urlString[$userAgent, "http://www.htttools.com:8080/"]
При желании вы можете передать результат ImportString
:
ImportString[urlString[$userAgent, "mysite"], "Data"]
Потоковый подход был бы возможен с использованием более сложного кода, но принятый выше строковый подход, вероятно, достаточно хорош, если целевой веб-ресурс не очень велик.
Я пробовал этот код в Mathematica 7 и 8, и я ожидаю, что он работает и в v6. Помните, что нет никаких гарантий, что Mathematica всегда будет включать HTTP-клиента Apache в будущих выпусках.
Как это работает
Несмотря на выражение в Mathematica, решение по существу реализовано на Java. Mathematica поставляется со встроенной средой исполнения Java, а мост между Mathematica и Java представляет собой компонент под названием JLink .
Как это типично для таких кросс-технологических решений, существует значительная сложность, даже когда кода немного. Обсуждение того, как работает код, выходит за рамки этого ответа, но некоторые пункты будут выделены в качестве предложений для дальнейшего чтения.
Код использует HTTP-клиент Apache . Эта библиотека Java была выбрана потому, что она поставляется в качестве незадекларированной части стандартного дистрибутива Mathematica - и она также является той, которую Import
использует для внутреннего использования.
Все тело urlString
завернуто в JavaBlock
. Это обеспечивает правильное освобождение любых объектов Java, созданных в ходе операции, путем координации действий менеджеров памяти Java и Mathematica.
JavaNew
используется для создания соответствующих объектов клиента Apache HTTP, HttpClient
и GetMethod
. Выражения Java, такие как http.getParams()
, выражаются в JLink как http@getParams[]
. Классы и методы Java описаны в документации клиента Apache HTTP.
Использование MakeJavaObject
несколько необычно. Это необходимо в этом случае, поскольку строка Mathematica передается в качестве аргумента, где ожидается Java Object
. Если ожидается Java String
, JLink автоматически создаст его. Но JLink не может сделать этот вывод, когда ожидается Object
, поэтому MakeJavaObject
используется, чтобы дать JLink подсказку.
А как насчет URLTools?
Кстати, первым, что я попытался ответить на этот вопрос, было использование Utilities`URLTools`FetchURL
. Это выглядело очень многообещающе, так как он принимает опцию под названием "RequestHeaderFields"
. Увы, это не сработало, потому что нынешняя реализация этой функции использует эту опцию только для глаголов HTTP POST, а не GET. Возможно, какая-то будущая версия Mathematica будет поддерживать опцию GET.