Java 在Android中,当命令包含中文或空格时,如何发送HTTP命令?

Java 在Android中,当命令包含中文或空格时,如何发送HTTP命令?,java,android,http,Java,Android,Http,我正在开发一个应用程序,它可以与IP摄像头一起工作 以下命令格式适用于IP摄像头。 我可以输入任何值并发送到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 st

我正在开发一个应用程序,它可以与IP摄像头一起工作

以下命令格式适用于IP摄像头。

我可以输入任何值并发送到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)
    
    08-17 18:13:18.105:W/System.err(22120):java.net.ProtocolException:意外状态行:HTTP/0.0 400错误请求
    08-17 18:13:18.105:W/System.err(22120):位于com.android.okhttp.internal.http.StatusLine.(StatusLine.java:38)
    08-17 18:13:18.105:W/System.err(22120):位于com.android.okhttp.internal.http.HttpConnection.readResponse(HttpConnection.java:180)
    08-17 18:13:18.105:W/System.err(22120):位于com.android.okhttp.internal.http.HttpTransport.readResponseHeaders(HttpTransport.java:101)
    08-17 18:13:18.105:W/System.err(22120):位于com.android.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:628)
    08-17 18:13:18.105:W/System.err(22120):位于com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:388)
    08-17 18:13:18.105:W/System.err(22120):位于com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:332)
    08-17 18:13:18.106:W/System.err(22120):位于com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:500)
    08-17 18:13:18.106:W/System.err(22120):在tw.com.WIFI\u CAM\u R660.IPCamViewer.CameraCommand.sendRequest(CameraCommand.java:734)
    08-17 18:13:18.106:W/System.err(22120):在tw.com.WIFI_CAM_R660.IPCamViewer.CameraCommand$SendRequest.doInBackground(CameraCommand.java:773)
    08-17 18:13:18.106:W/System.err(22120):在tw.com.WIFI\u CAM\u R660.IPCamViewer.CameraCommand$SendRequest.doInBackground(CameraCommand.java:1)
    08-17 18:13:18.106:W/System.err(22120):在android.os.AsyncTask$2.call(AsyncTask.java:292)
    08-17 18:13:18.106:W/System.err(22120):在java.util.concurrent.FutureTask.run(FutureTask.java:237)
    08-17 18:13:18.106:W/System.err(22120):在android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
    08-17 18:13:18.106:W/System.err(22120):位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
    08-17 18:13:18.106:W/System.err(22120):位于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进行编码,以便它可以在查询字符串中传输

    您需要对各个参数本身执行此操作。例如:

    String encodedValue = URLEncoder.encode(value, "UTF-8");
    String url = "http://192.72.1.1/config?set&value=" + encodedValue;
    String result = sendRequest(url);
    

    您需要首先对URL进行编码,以便它可以在查询字符串中传输

    您需要对各个参数本身执行此操作。例如:

    String encodedValue = URLEncoder.encode(value, "UTF-8");
    String url = "http://192.72.1.1/config?set&value=" + encodedValue;
    String result = sendRequest(url);
    

    使用提供的解决方案Knossos,或者如果您的命令值已硬编码,则可以手动对其进行编码


    使用提供的解决方案Knossos,或者如果您的命令值已硬编码,则可以手动编码


    对于空格,请尝试添加
    (双引号)在值周围。应该是url编码,而且我发现您的URI很奇怪,从法律上讲,
    键/值
    参数应该总是成对显示,例如
    /config?set=true&value=11112222
    ,因此不建议使用参数
    没有值,并且可能会出现问题。不要执行“发送命令”“当HTTP获取操作时;这本身就是个问题。对于空格,请尝试添加
    (双引号)在值周围。应该是url编码,而且我发现您的URI很奇怪,从法律上讲,
    键/值
    参数应该总是成对显示,例如
    /config?set=true&value=11112222
    ,因此不建议使用参数
    没有值,并且可能会出现问题。不要执行“发送命令”“当HTTP获取操作时;这本身就是个问题。