HttpURLConnection returns 发送 GET 请求后响应代码 500,即使它在本地工作
HttpURLConnection returns response code 500 after sending a GET request even though it works locally
作为 Selenium 测试用例的一部分,我正在尝试发送 HTTP GET 请求以从服务器下载文件。
如果我通过任何浏览器在本地执行此操作并且 returns HTTP OK 200,并且文件已下载,但是当我尝试使用 HttpURLConnection
class 发送请求时它没有。
我使用的方法:
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 Response Code :: 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 class 但结果是一样的。
解决了一个问题,开始了。
嗯,问题是什么?原来我的请求缺少可以验证用户身份的 Cookie header,具体来说就是 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
}
首先它打印所有的 cookies:
Cookies: [PHPSESSID=2ohpfb3jmhtddcgx1lidm5zwcs; path=/; domain=domain.com]
然后它是 PHPSESSID 的子字符串:
2ohpfb3jmhtddcgx1lidm5zwcs
之后我需要修改我的 sendGET 方法:
String sessionID = getPhpSessionID()
con.setRequestProperty("Cookie", "PHPSESSID=${sessionID}")
结果是:
GET Response Code :: 200
希望它对以后的人有所帮助:)
作为 Selenium 测试用例的一部分,我正在尝试发送 HTTP GET 请求以从服务器下载文件。
如果我通过任何浏览器在本地执行此操作并且 returns HTTP OK 200,并且文件已下载,但是当我尝试使用 HttpURLConnection
class 发送请求时它没有。
我使用的方法:
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 Response Code :: 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 class 但结果是一样的。
解决了一个问题,开始了。
嗯,问题是什么?原来我的请求缺少可以验证用户身份的 Cookie header,具体来说就是 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
}
首先它打印所有的 cookies:
Cookies: [PHPSESSID=2ohpfb3jmhtddcgx1lidm5zwcs; path=/; domain=domain.com]
然后它是 PHPSESSID 的子字符串:
2ohpfb3jmhtddcgx1lidm5zwcs
之后我需要修改我的 sendGET 方法:
String sessionID = getPhpSessionID()
con.setRequestProperty("Cookie", "PHPSESSID=${sessionID}")
结果是:
GET Response Code :: 200
希望它对以后的人有所帮助:)