当前位置: 首页 > 面试题库 >

带有锚点的链接的HttpClient出现400错误

朱皓
2023-03-14
问题内容

这是我的代码

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

到目前为止,该方法适用于我尝试过的每个网址,但某些包含锚的网址除外。这些锚定URL中的一些返回400。奇怪的是,并不是所有包含锚定的链接,其中许多都可以正常工作。

不幸的是,我必须非常通用,因为我无法在此处提供特定的网址。

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

有什么想法要寻找吗?

例如: http://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中剥离。

跟进

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

但是,我认为,如果可以安全地假定您的URL都是有效的绝对HTTP或HTTPS URL,则以下内容也应适用。

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


 类似资料:
  • 问题内容: 可以在Angularjs中使用锚链接吗? 即: 谢谢 问题答案: 看来有几种方法可以做到这一点。 选项1:本机角度 Angular提供了一项服务,但文档严重缺乏,我无法使其正常工作。 请访问http://www.benlesh.com/2013/02/angular-js-scrolling-to-element-by- id.html, 以获取有关的一些见解。 选项2:自定义指令/本

  • 是否可以使用Angularjs锚链接? 即: 非常感谢。

  • 问题内容: 无论如何(在CSS中)是否要避免在页面..中引入文本和链接的下划线? 问题答案: 使用CSS。这会删除和元素的下划线: 有时您需要覆盖元素的其他样式,在这种情况下,可以在规则上使用修饰符:

  • 使用Maven生成JavaDoc时,我收到一条错误消息“错误获取链接:”,指的是一个文件javadoc-bundle-选项。其中包含带有目录的javadocResourcesDirectory。即使我创建了那个目录,我仍然会得到相同的错误。如何更正错误?

  • 我在一台主机上安装了一台mysql服务器,我希望通过加密连接从另一台主机连接到mysql服务器(两者都运行Ubuntu12.04)。我已经创建并传输了证书,并手动测试了设置。我可以从Linux命令行使用密钥和证书连接到远程mysql服务器,因此服务器配置似乎是正确的: 我不知道怎么了,有什么想法吗?谢了!

  • 我使用jsoup解析一些页面的链接,然后使用httpclient测试链接,看看它们是否工作。我网页上的一些链接是,我想忽略这些。