英文:
Getting 400 after a get response, although the url is well formatted
问题
执行以下代码进行get请求:
resp, err := http.Get(path)
在此之前,我打印了path
变量,大致如下:
http://localhost:8080/api/history/resources/count?startedAfter="2021-03-06T15%3A27%3A13.894415787%2B0200"
当我点击链接时,它返回200
和有效的json
响应。
然而,代码本身失败并打印了以下内容:
<!doctype html><html lang="en"><head><title>HTTP Status 400 – Bad Request</title>Invalid character found in the request target [/api/history/resources/count?startedAfter="2021-03-06T15%3A27%3A13.894415787%2B0200"]. The valid characters are defined in RFC 7230 and RFC 3986</p><p><b>Description</b> The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).</p><p><b>Exception</b></p><pre>java.lang.IllegalArgumentException: Invalid character found in the request target [/api/history/resources/count?startedAfter="2021-03-06T15%3A27%3A13.894415787%2B0200"]. The valid characters are defined in RFC 7230 and RFC 3986
org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:491)
org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:260)
org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590)
org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
java.base/java.lang.Thread.run(Thread.java:834)
</pre><p><b>Note</b> The full stack trace of the root cause is available in the server logs.</p><hr class="line" /><h3>Apache Tomcat/9.0.36</h3></body></html>
为什么会这样呢?
英文:
Performing a get url as follows
resp, err := http.Get(path)
Beforehand, I print the path
variable which is more or less like this
http://localhost:8080/api/history/resources/count?startedAfter="2021-03-06T15%3A27%3A13.894415787%2B0200"
When I click on the link, it does return 200
and a valid json
response.
However the code itself fails and prints:
<!doctype html><html lang="en"><head><title>HTTP Status 400 – Bad Request</title>Invalid character found in the request target [&#47;api&#47;history&#47;resources&#47;count?startedAfter=&quot;2021-03-06T15%3A27%3A13.894415787%2B0200&quot;]. The valid characters are defined in RFC 7230 and RFC 3986</p><p><b>Description</b> The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).</p><p><b>Exception</b></p><pre>java.lang.IllegalArgumentException: Invalid character found in the request target [&#47;apit&#47;history&#47;resources&#47;count?startedAfter=&quot;2021-03-06T15%3A27%3A13.894415787%2B0200&quot;]. The valid characters are defined in RFC 7230 and RFC 3986
org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:491)
org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:260)
org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590)
org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
java.base&#47;java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
java.base&#47;java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
java.base&#47;java.lang.Thread.run(Thread.java:834)
</pre><p><b>Note</b> The full stack trace of the root cause is available in the server logs.</p><hr class="line" /><h3>Apache Tomcat/9.0.36</h3></body></html>
Why is that?
答案1
得分: 1
你的查询参数中的引号似乎导致了服务器上的错误。尝试像这样修改:
apiURL := "http://localhost:8080/api/history/resources/count"
req, err := http.NewRequest("GET", apiURL, nil)
if err != nil {
log.Fatal(err)
}
apiParams := req.URL.Query()
apiParams.Add("startedAfter", "2021-03-06T15:27:13.894415787+0200")
req.URL.RawQuery = apiParams.Encode()
res, err := http.DefaultClient.Do(req)
试试这样,然后回复结果。
英文:
The quotes in your query param seem to be causing the error at the server. Try something like this
apiURL := "http://localhost:8080/api/history/resources/count"
req, err := http.NewRequest("GET", apiURL, nil)
if err != nil {
log.Fatal(err)
}
apiParams := req.URL.Query()
apiParams.Add("startedAfter", "2021-03-06T15:27:13.894415787+0200")
req.URL.RawQuery = apiParams.Encode()
res, err := http.DefaultClient.Do(req)
try that and revert.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论