我正在開發一個應用程序,它可以使用IP攝像頭。如何在Android命令中包含中文或空格時發送HTTP命令?
以下命令格式適用於IP攝像機。 http://192.72.1.1/config?set&value=XXXXX
而且我可以鍵入任何值併發送到IP攝像機。
當命令是http://192.72.1.1/config?set&value=111
,它可以發送到IP攝像機。 IP攝像機也響應正常。
但是當我嘗試發送包含空格或中文的命令時,它會失敗。
http://192.72.1.1/config?set&value=111 222
http://192.72.1.1/config?set&value=二三四
的代碼是這樣的:
public static String sendRequest(URL url) {
try {
//Show the command
Log.i("CameraCommand", url.toString()) ;
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection() ;
urlConnection.setUseCaches(false) ;
urlConnection.setDoInput(true) ;
urlConnection.setConnectTimeout(3000) ;
urlConnection.setReadTimeout(8000) ;
urlConnection.connect() ;
int responseCode = urlConnection.getResponseCode() ;
Log.i("CameraControlFragment", "responseCode = " + urlConnection.getResponseCode()) ;
if (responseCode != HttpURLConnection.HTTP_OK) {
return null ;
}
InputStream inputStream = urlConnection.getInputStream() ;
Writer writer = new StringWriter() ;
char[] buffer = new char[1024] ;
try {
Reader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8")) ;
int n ;
while ((n = reader.read(buffer)) != -1) {
writer.write(buffer, 0, n) ;
}
} finally {
inputStream.close() ;
}
String string = writer.toString() ;
Log.i("CameraControlFragment", "string = " + string) ;
return string ;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace() ;
}
return null ;
}
當命令包括空間或中國,它顯示以下日誌:
08-17 18:13:18.105: W/System.err(22120): java.net.ProtocolException: Unexpected status line: HTTP/0.0 400 Bad Request
08-17 18:13:18.105: W/System.err(22120): at com.android.okhttp.internal.http.StatusLine.<init>(StatusLine.java:38)
08-17 18:13:18.105: W/System.err(22120): at com.android.okhttp.internal.http.HttpConnection.readResponse(HttpConnection.java:180)
08-17 18:13:18.105: W/System.err(22120): at com.android.okhttp.internal.http.HttpTransport.readResponseHeaders(HttpTransport.java:101)
08-17 18:13:18.105: W/System.err(22120): at com.android.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:628)
08-17 18:13:18.105: W/System.err(22120): at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:388)
08-17 18:13:18.105: W/System.err(22120): at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:332)
08-17 18:13:18.106: W/System.err(22120): at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:500)
08-17 18:13:18.106: W/System.err(22120): at tw.com.WIFI_CAM_R660.IPCamViewer.CameraCommand.sendRequest(CameraCommand.java:734)
08-17 18:13:18.106: W/System.err(22120): at tw.com.WIFI_CAM_R660.IPCamViewer.CameraCommand$SendRequest.doInBackground(CameraCommand.java:773)
08-17 18:13:18.106: W/System.err(22120): at tw.com.WIFI_CAM_R660.IPCamViewer.CameraCommand$SendRequest.doInBackground(CameraCommand.java:1)
08-17 18:13:18.106: W/System.err(22120): at android.os.AsyncTask$2.call(AsyncTask.java:292)
08-17 18:13:18.106: W/System.err(22120): at java.util.concurrent.FutureTask.run(FutureTask.java:237)
08-17 18:13:18.106: W/System.err(22120): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
08-17 18:13:18.106: W/System.err(22120): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
08-17 18:13:18.106: W/System.err(22120): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
08-17 18:13:18.106: W/System.err(22120): at java.lang.Thread.run(Thread.java:818)
的CameraCommand.java:734
爲int responseCode = urlConnection.getResponseCode()
;
有人知道如何發送包含空格和中文的命令嗎?
在此先感謝。
對於空間,嘗試圍繞他增值'「'(雙引號)。 –
應該是URL編碼 – armnotstrong
並且還我發現你的URI只是奇怪,在法律上'鍵/ value'參數應始終成對顯示,如'/ config?set = true&value = 11112222',所以參數'set'沒有值不推薦,並且可能會出現問題。 – armnotstrong