private int GetSync()
{
try
{
ManualResetEvent mre = new ManualResetEvent(false);
int result = null;
Parallel.Invoke(async () =>
{
result = await SomeCalcAsync(5+5);
mre.Set();
});
mre.WaitOne();
return result;
}
catch (Exception)
{
return null;
}
}
Внимание на urllib2
для этого, это работает вполне хорошо. Не смешивайте с httplib
, это не API верхнего уровня.
то, Что Вы отмечаете, - то, что urllib2
не следует за перенаправлением.
необходимо свернуться в экземпляре HTTPRedirectHandler
, который будет ловить и следовать за перенаправлениями.
Далее, можно хотеть разделить значение по умолчанию на подклассы HTTPRedirectHandler
для получения информации, которую Вы тогда проверите как часть Вашего поблочного тестирования.
cookie_handler= urllib2.HTTPCookieProcessor( self.cookies )
redirect_handler= HTTPRedirectHandler()
opener = urllib2.build_opener(redirect_handler,cookie_handler)
можно тогда использовать этот opener
объект к POST и ДОБРАТЬСЯ, обработав перенаправления и cookie правильно.
можно хотеть добавить собственный подкласс HTTPHandler
, чтобы получить и зарегистрировать различные коды ошибки, также.
@S.Lott, спасибо. Ваше предложение работало на меня с некоторой модификацией. Вот то, как я сделал это.
data = urllib.urlencode(params)
url = host+page
request = urllib2.Request(url, data, headers)
response = urllib2.urlopen(request)
cookies = CookieJar()
cookies.extract_cookies(response,request)
cookie_handler= urllib2.HTTPCookieProcessor( cookies )
redirect_handler= HTTPRedirectHandler()
opener = urllib2.build_opener(redirect_handler,cookie_handler)
response = opener.open(request)
Я должен был сделать эту точную вещь сам недавно. Мне только были нужны классы из стандартной библиотеки. Вот выборка от моего кода:
from urllib import urlencode
from urllib2 import urlopen, Request
# encode my POST parameters for the login page
login_qs = urlencode( [("username",USERNAME), ("password",PASSWORD)] )
# extract my session id by loading a page from the site
set_cookie = urlopen(URL_BASE).headers.getheader("Set-Cookie")
sess_id = set_cookie[set_cookie.index("=")+1:set_cookie.index(";")]
# construct headers dictionary using the session id
headers = {"Cookie": "session_id="+sess_id}
# perform login and make sure it worked
if "Announcements:" not in urlopen(Request(URL_BASE+"login",headers=headers), login_qs).read():
print "Didn't log in properly"
exit(1)
# here's the function I used after this for loading pages
def download(page=""):
return urlopen(Request(URL_BASE+page, headers=headers)).read()
# for example:
print download(URL_BASE + "config")
Попробуйте твил - простой язык, который позволяет пользователям просматривать веб-сайты от интерфейса командной строки. С твилом можно перейти через веб-сайты, которые используют формы, cookie и самые стандартные функции Web. Главное, твил записан в Python
и имеет python API, например:
from twill import get_browser
b = get_browser()
b.go("http://www.python.org/")
b.showforms()
Я дал бы, Механизируют ( http://wwwsearch.sourceforge.net/mechanize/ ) выстрел. Это может обработать Ваш cookie/заголовки прозрачно.
Помимо того, что можно пропускать cookie, могло бы быть некоторое поле (поля) в форме, которую Вы не ОТПРАВЛЯЕТЕ на веб-сервер. Лучший способ состоял бы в том, чтобы получить фактический POST от веб-браузера. Можно использовать LiveHTTPHeaders или WireShark, чтобы отследить трафик и подражать тому же поведению в сценарии.
Funkload является большим инструментом тестирования веб-приложения также. Это обертывает webunit для обработки эмуляции браузера, затем дает Вам обоим функциональным и функции тестирования загрузки на вершине.