web-dev-qa-db-ja.com

REST呼び出しでHttpGetを使用してjava

SMSゲートウェイのREST APIを使用して呼び出しを送信しています。「Hello」のような単純なWordを送信すると、すべて問題ありませんが、追加するとスペースを使用すると問題が発生しました。これは、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が示唆しているように、私はエンコーダーを使用しています。これが私が今していることです:

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

13
dukable

送信する前に、URLEncoderを使用してURLパラメーター値をエンコードします。

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

スペースを含むすべての記号-> '+'をURLの適切な記号に置き換えます

24
alexey28