如何在Java中使用HttpGet传递REST调用中的空格

15

我正在使用短信网关的REST API发送请求,当我发送一个简单的单词比如“Hello”时一切正常,但是如果我加上空格就会出问题。这是因为URI不能包含空格。

那么我需要怎样正确地实现我所需要的功能呢?

HttpClient httpclient = new DefaultHttpClient();
try {
    HttpGet httpget = new HttpGet("http://www.example.com/SecureREST/SimpleSMSsend?PhoneNumber=123&Message=hello how are you?");
httpget.addHeader(new BasicHeader("Accept", "application/json"));

// Create a response handler
ResponseHandler<String> responseHandler = new BasicResponseHandler();
String responseBody = httpclient.execute(httpget, responseHandler);
System.out.println("----------------------------------------");
System.out.println(responseBody);
System.out.println("----------------------------------------");
} finally {
httpclient.getConnectionManager().shutdown();
}

导致 IllegalArgumentException 异常的结果:

Exception in thread "main" java.lang.IllegalArgumentException
at java.net.URI.create(Unknown Source)
at org.apache.http.client.methods.HttpGet.<init>(HttpGet.java:69)
at main.main(main.java:36)
Caused by: java.net.URISyntaxException: Illegal character in query at index 97: https://www.example.com/SecureREST/SimpleSMSsend?PhoneNumber=123&Message=Hello, how are you?
at java.net.URI$Parser.fail(Unknown Source)
at java.net.URI$Parser.checkChars(Unknown Source)
at java.net.URI$Parser.parseHierarchical(Unknown Source)
at java.net.URI$Parser.parse(Unknown Source)
at java.net.URI.<init>(Unknown Source)
... 3 more

编辑:根据alexey28的建议,我正在使用Encoder,以下是我的操作方法:

String query = "?PhoneNumber=123&Message=Hello, how are you?";
String host = "https://www.example.com/SecureREST/SimpleSMSsend";
String encodedUrl = host + URLEncoder.encode(query,"utf-8");
HttpGet httpget = new HttpGet(encodedUrl);

但是会导致结果为

Exception in thread "main" org.apache.http.client.HttpResponseException: **Bad Request**
at org.apache.http.impl.client.BasicResponseHandler.handleResponse(BasicResponseHandler.java:67)
at org.apache.http.impl.client.BasicResponseHandler.handleResponse(BasicResponseHandler.java:54)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:735)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:709)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:700)
at main.main(main.java:47)

我在这里做错了什么?

请求进行编码后是:执行请求https://www.example.com/SecureREST/SimpleSMSsend%3FPhoneNumber%3D123%26Message%3DHello%2C+how+are+you%3F

1个回答

27

在发送请求之前,请使用URLEncoder对URL参数值进行编码:

String restUrl = URLEncoder.encode("You url parameter value", "UTF-8");

它将替换所有符号,包括空格 -> '+',以适合URL的正确符号。


1
这样做会导致 java.lang.IllegalStateException: 目标主机不能为空或在参数中设置。我的做法是:String restUrl = URLEncoder.encode("https://www.example.com/SecureREST/SimpleSMSsend?PhoneNumber=123&Message=Hello, how are you?", "UTF-8"); HttpGet httpget = new HttpGet(restUrl); - dukable
我已经更新了我的初始帖子以反映我现在遇到的问题。 - dukable
11
只对消息进行编码。URLEncoder会对URL中具有特殊含义的字符(如?和&)进行编码,因此对整个URL进行编码将使其无效。例如,HttpGet("http://www.example.com/SecureREST/SimpleSMSsend?PhoneNumber=123&Message=" + URLEncoder.encode("hello how are you?","UTF-8")) - erikxiv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接