HttpClient与锚点链接出错400错误

这是我的代码:

DefaultHttpClient client = new DefaultHttpClient(); HttpGet request = new HttpGet(url); HttpResponse response = client.execute(request); 

这适用于我迄今为止尝试的每个url,除了一些包含锚点的url。 这些锚定url中的一些返回400.奇怪的是,并非所有包含锚点的链接,其中很多都可以正常工作。

不幸的是,我必须非常一般,因为我无法在这里提供具体的url。

链接完全有效,并且在任何浏览器中都可以正常工作,但HttpClient在尝试链接时返回400。 如果我删除锚,它将工作。

任何想法要找什么?

例如: http://www.somedomain.com/somedirectory/somepage#someanchorhttp://www.somedomain.com/somedirectory/somepage#someanchor

对于仿制药再次抱歉

编辑:我应该提到这是针对Android的。

正如@Greg Sansom所说,不应该使用锚点/片段发送URL。 URL的片段部分与服务器无关。

以下是HTTP 1.1规范相关部分的预期URL语法:

  http_URL = "http:" "//" host [ ":" port ] [ abs_path [ "?" query ]] 

注意:语法中没有fragment部分。

如果您确实发送fragment会发生什么情况是特定于服务器实现。 我希望你会看到各种各样的回答:

  • 有些服务器会默默地剥离/忽略片段部分。 (这是你期望发生的事情)。
  • 某些服务器可能会将此视为请求错误,并以400响应。
  • 某些服务器可能会错误地将片段视为路径或查询的一部分,并根据片段对服务器的“混淆”程度给出404或其他响应。
  • 有些服务器实际上可能会使片段具有特定含义。 (这让我感到愚蠢,但你永远都不知道……)

IMO,最明智的解决方案是在实例化HttpGet对象之前将其从URL中HttpGet

跟进

从URL字符串中删除片段的推荐方法是将其转换为java.net.URLjava.net.URI实例,提取相关组件,使用这些组件创建新的java.net.URLjava.net.URI实例(当然java.net.URI片段),最后将其转回String。

但是,如果您可以放心地假设您的URL都是有效的绝对HTTP或HTTPS URL,我认为以下内容也应该有效。

  int pos = url.indexOf("#"); String strippedUrl = (pos >= 0) ? url.substring(0, pos) : url; 

您在url中对锚点的使用不正确。 当我们执行“获取”时,我们需要获取整个资源(页面)。 锚点只是标记位置的标记,通常一旦页面加载,您的浏览器将滚动到锚点的位置。 在特定锚点“获取”页面没有意义 – 必须提取整个页面。

您的结果可能不一致,因为某些Web服务器忽略了锚点组件,而其他Web服务器正在纠正您的错误。

解决方案是在运行代码之前删除URL的#anchor部分。

String user_url2 =“uhttp://www.somedomain.com/somedirectory/somepage#someanchor”;

  HttpClient client = new DefaultHttpClient(); HttpGet siteRequest = new HttpGet(user_url2); StringBuilder sb = new StringBuilder(); HttpResponse httpResponse; try { httpResponse = client.execute(siteRequest); HttpEntity entity = httpResponse.getEntity(); InputStream in = entity.getContent(); String line = null; BufferedReader reader = new BufferedReader( new InputStreamReader(in)); while ((line = reader.readLine()) != null) { sb.append(line); } result = sb.toString(); 

结果字符串将显示url值

Android HttpClient中存在一个错误,该错误已在HttpClient 1.2中修复,但未向Android移植

https://issues.apache.org/jira/browse/HTTPCLIENT-1177

https://github.com/apache/httpclient/commit/be6347aef0f7450133017b775113a8f3fadd2f1c

我已在以下位置打开了错误报告: https : //code.google.com/p/android/issues/detail?id = 65909