绝对 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编码值有关)
AFNetworking 问题:NSErrorFailingURLKey=url,NSLocalizedDescription=请求失败:错误请求 (400)