我正在尝试使用HTTPUrlConnection获取URL,但是我总是得到500个代码,但是当我尝试从浏览器访问相同的URL或使用curl时,它工作正常!
这是代码
try{
URL url = new URL("theurl");
HttpURLConnection httpcon = (HttpURLConnection) url.openConnection();
httpcon.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
httpcon.setRequestProperty("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:14.0) Gecko/20100101 Firefox/14.0.1");
System.out.println(httpcon.getHeaderFields());
}catch (Exception e) {
System.out.println("exception "+e);
}
当我打印标题字段时,它会显示500个代码..当我将URL更改为google.com之类的其他内容时,它可以正常工作。但我不明白为什么它在这里不起作用,但它在浏览器和curl上工作正常。
任何帮助都将受到高度赞赏..
谢谢,
答案 0 :(得分:8)
这主要是因为编码而发生的。 如果您使用浏览器确定,但在程序中获得500(内部服务器错误),那是因为浏览器具有关于字符集和内容类型的高度复杂的代码。
这是我的代码,它适用于ISO8859_1作为charset和英语的情况。
public void sendPost(String Url, String params) throws Exception {
String url=Url;
URL obj = new URL(url);
HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();
con.setRequestProperty("Acceptcharset", "en-us");
con.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
con.setRequestProperty("charset", "EN-US");
con.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
String urlParameters=params;
// Send post request
con.setDoOutput(true);
con.setDoInput(true);
con.connect();
//con.
DataOutputStream wr = new DataOutputStream(con.getOutputStream());
wr.writeBytes(urlParameters);
wr.flush();
wr.close();
int responseCode = con.getResponseCode();
System.out.println("\nSending 'POST' request to URL : " + url);
System.out.println("Post parameters : " + urlParameters);
System.out.println("Response Code : " + responseCode);
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
//print result
System.out.println(response.toString());
this.response=response.toString();
con.disconnect();
}
在主程序中,将其称为:
myclassname.sendPost("https://change.this2webaddress.desphilboy.com/websitealias/orwebpath/someaction","paramname="+URLEncoder.encode(urlparam,"ISO8859_1"))
答案 1 :(得分:6)
状态代码500表明Web服务器上的代码已崩溃。使用HttpURLConnection#getErrorStream()以更好地了解错误。请参阅Http Status Code 500
答案 2 :(得分:2)
我遇到了" URL在浏览器中工作的问题,但是当我在java中使用http-get时,我得到500错误"。
在我的情况下,问题是常规的http-get在/default.aspx和/login.aspx之间的无限重定向循环中结束
URL oUrl = new URL(url);
HttpURLConnection con = (HttpURLConnection) oUrl.openConnection();
con.setRequestMethod("GET");
...
int responseCode = con.getResponseCode();
发生的事情是:服务器提供三部分cookie,con.getResponseCode()仅使用其中一个部分。标题中的cookie数据如下所示:
header.key = null
value = HTTP/1.1 302 Found
...
header.key = Location
value = /default.aspx
header.key = Set-Cookie
value = WebCom-lbal=qxmgueUmKZvx8zjxPftC/bHT/g/rUrJXyOoX3YKnYJxEHwILnR13ojZmkkocFI7ZzU0aX9pVtJ93yNg=; path=/
value = USE_RESPONSIVE_GUI=1; expires=Wed, 17-Apr-2115 18:22:11 GMT; path=/
value = ASP.NET_SessionId=bf0bxkfawdwfr10ipmvviq3d; path=/; HttpOnly
...
所以服务器只收到三分之一的所需数据时感到困惑:你已经登录了!没等了,你必须登录。不,您已登录,...
要解决无限重定向循环,我必须手动查找重定向并手动解析标题为" Set-cookie"条目。
con = (HttpURLConnection) oUrl.openConnection();
con.setRequestMethod("GET");
...
log.debug("Disable auto-redirect. We have to look at each redirect manually");
con.setInstanceFollowRedirects(false);
....
int responseCode = con.getResponseCode();
使用此代码解析cookie,如果我们在responseCode中获得重定向:
private String getNewCookiesIfAny(String origCookies, HttpURLConnection con) {
String result = null;
String key;
Set<Map.Entry<String, List<String>>> allHeaders = con.getHeaderFields().entrySet();
for (Map.Entry<String, List<String>> header : allHeaders) {
key = header.getKey();
if (key != null && key.equalsIgnoreCase(HttpHeaders.SET_COOKIE)) {
// get the cookie if need, for login
List<String> values = header.getValue();
for (String value : values) {
if (result == null || result.isEmpty()) {
result = value;
} else {
result = result + "; " + value;
}
}
}
}
if (result == null) {
log.debug("Reuse the original cookie");
result = origCookies;
}
return result;
}
答案 3 :(得分:1)
确保您的连接允许以下重定向 - 这是您的连接与浏览器之间行为差异的可能原因之一(默认情况下允许重定向)。
它应该返回代码3xx,但可能还有其他地方可以将其更改为500以进行连接。
答案 4 :(得分:0)
在我的情况下,事实证明服务器总是返回我想要访问的页面的HTTP / 1.1 500(在浏览器中,如在Java中),但仍然成功地传递了网页内容。
通过浏览器访问特定页面的人员没有注意到,因为他将看到页面而没有错误消息,在Java中我必须读取错误流而不是输入流(感谢@Muse)。
但是,我不知道为什么。可能是让Crawlers离开的一种模糊方式。答案 5 :(得分:0)
这是一个老问题,但我有同样的问题并以这种方式解决了。
这可能有助于其他同样的情况。
在我的情况下,我在本地环境中开发系统,当我从浏览器检查我的Rest Api时,每件事情都运行良好,但我在Android系统中一直抛出HTTP错误500。
问题是当你在Android上工作时,它适用于VM(虚拟机),这表示你的本地计算机防火墙可能会阻止你的虚拟机访问本地URL(IP)地址。
您只需要在计算机防火墙中允许它。如果您尝试从网络外部访问系统,则同样适用。
答案 6 :(得分:0)
我遇到了同样的问题,我们的问题是其中一个参数值中有一个特殊的符号。我们使用URLEncoder.encode(String, String)