绝对 URL .. 400 错误请求

Posted

技术标签:

【中文标题】绝对 URL .. 400 错误请求【英文标题】:Absolute URL .. 400 BAD Request 【发布时间】:2013-10-29 21:05:26 【问题描述】:

我目前正在我的应用程序中运行一个码头网络服务器。其中一位客户正在使用 HttpPost 调用我的 this。

有时它会起作用,有时他会收到 HTTP 400 BAD 请求。

这些是日志

About to connect() to 10.184.209.142 port 8080 
Trying 10.184.209.142... 
Connected to 10.184.209.142 (10.184.209.142) port 8080 
POST /CSCIntegration HTTP/1.1
User-Agent: CSC Test
Host: 10.184.209.142:8080
Accept: */*
From: anonymous@unknown.com
Connection: close
Content-Type: text/xml; charset=utf-8
Content-Length: 440

如果我使用 Junit 运行相同的程序,我看不到任何问题。

是因为 HttpPost 中缺少斜杠吗? 这个错误是因为jetty issue吗??

【问题讨论】:

【参考方案1】:

是因为 HttpPost 中缺少斜杠吗?这个错误是由于码头问题吗??

可能。这取决于两件事:

您是否使用未修复该问题的旧版 Jetty。如果您阅读linked bugzilla entry,则该错误已在一年前修复。

客户端是否使用缺少尾部斜杠的 URL。

如果我使用 Junit 运行相同的程序,我看不到任何问题。

不清楚你在说什么。

如果您说您可以手动重现问题,但不能通过 JUnit 测试(设计重现此问题),请检查您是否使用相同版本的 Jetty您的测试和生产系统中。然后检查配置差异。

如果您只是说您的 JUnit 测试没有涵盖这个问题,那么解决方案是显而易见的。编写一个确实涵盖它的新测试!

如果这些都没有帮助,那么您应该考虑将调试器附加到您的生产服务器(哎呀!)以找出实际发生的情况。

【讨论】:

目前我使用的是 jetty-7.4.4.v20110707,这个 bug 在之后的 jetty 版本中已经修复。我编写 Junit 的方式是启动码头服务器(与 prod 中使用的代码相同),然后在端口 8080 上本地调用它,如下所示: StringEntity se = new StringEntity("data") se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "text/xml")); HttpPost post = new HttpPost("localhost:8888/CSCIntegration"); post.setEntity(se); post.setHeader("Accept", "text/xml"); post.setHeader("Content-Type", "text/xml; charset =UTF-8"); 响应 = client.execute(post); 当使用 Jetty -7.4.4 以这种方式运行时,我在使用 URL localhost:8888/CSCIntegration 调用它时没有看到任何问题。所以我有点不确定这是否真的是因为 URL 末尾的斜杠。 我想你可能误解了这个错误。当我读到它时,它是关于具有完全空路径的 URL ......而不是不以斜杠结尾的非空路径。 1)您的测试用例没有测试出现错误的条件。 2) 除非您实际上尝试使用与客户使用的 URL 相同并且使用相同版本的 Jetty 的 URL 来重现问题,否则您可能是在浪费时间。创建一个执行此操作的自定义 JUnit 测试!

以上是关于绝对 URL .. 400 错误请求的主要内容,如果未能解决你的问题,请参考以下文章

PostMan发送请求参数带有路径特殊字符会返回400错误(与URL字符及URL编码值有关)

url 中的参数出现 400 错误请求错误

如何自定义响应错误 400 错误请求

AFNetworking 问题:NSErrorFailingURLKey=url,NSLocalizedDescription=请求失败:错误请求 (400)

Wordpress:在没有插件的情况下集成 Mailchimp 错误请求 400 Ajax URL

AWS S3 通过预签名 URL 上传返回 400 错误请求