我正在尝试发送HTTP GET请求,以从服务器下载文件作为Selenium测试用例的一部分。
如果我通过任何浏览器在本地进行操作,它将正常工作并返回HTTP OK 200,并下载了该文件,但是当我尝试使用HttpURLConnection
类发送任务时却没有。
我正在使用的方法:
static sendGET(String URL){
URL obj = new URL(URL)
CookieHandler.setDefault(new CookieManager())
Authenticator.setDefault (new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication ("login", "password".toCharArray());
}
})
HttpURLConnection con = (HttpURLConnection) obj.openConnection()
HttpURLConnection.setFollowRedirects(true)
con.setRequestMethod("GET")
con.setRequestProperty("User-Agent", "Mozilla/5.0")
int responseCode = con.getResponseCode()
System.out.println("GET Response Code :: " + responseCode)
return responseCode
}
GET响应码:: 500
从服务器日志中我得到:
CRITICAL 08:51:39 php Call to a member function getId() on null
{
"exception": {}
}
调用getId()的行:@AndiCover
$response = $transmitter->downloadFile($fileID, $this->getUser()->getId());
这似乎使用户身份验证出现问题。
我也尝试使用HttpGet类,但结果是相同的。
最佳答案
找出问题所在,就可以了。
好吧,这是什么问题?原来,我的请求缺少一个可以验证用户身份的Cookie标头,具体地说,它是PHPSESSID。为了获取当前的PHPSESSID,我创建了一个方法,该方法检索所有cookie,然后将字符串字符串PHPSESSID:
static getPhpSessionID(){
String cookies = driver.manage().getCookies()
System.out.println("Cookies: ${cookies}")
cookies = cookies.substring(cookies.lastIndexOf("PHPSESSID=") + 10)
cookies = cookies.substring(0, cookies.indexOf(";"))
System.out.println("${cookies}")
return cookies
}
首先,它会打印所有cookie:
Cookies:[PHPSESSID = 2ohpfb3jmhtddcgx1lidm5zwcs;路径= /; domain = domain.com]
然后将其子字符串PHPSESSID:
2ohpfb3jmhtddcgx1lidm5zwcs
之后,我需要修改sendGET方法:
String sessionID = getPhpSessionID()
con.setRequestProperty("Cookie", "PHPSESSID=${sessionID}")
结果是:
GET响应码:: 200
希望它对以后的人有所帮助:)