【问题标题】:Send a String from Android to a Spring server将字符串从 Android 发送到 Spring 服务器
【发布时间】:2017-08-03 08:15:39
【问题描述】:

我正在尝试将字符串从我的 android 应用程序发送到服务器。该字符串包含:用户名、密码和以 base 64 编码的图像。它们之间是一个空格(“”)。我正在使用 heroku 来存储服务器,并使用 postgreSQL 数据库。我有一个名为 users 的表,其中包含以下列:userid,password, encoded image,所有这些都是格式文本。

当我创建一个新用户时,我给出了userid and the password,列编码图像为空。当我想将图像上传到服务器并编辑encodedimage 列时,我想对表进行更新。

这是我从 android 发送字符串的方式:

request=Utils.name+" "+Utils.password;
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            image.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream);
            request = request+ " " + Base64.encodeToString(byteArrayOutputStream.toByteArray(), Base64.DEFAULT);
try {
        URL url = new URL(params[0]);
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
        urlConnection.setReadTimeout(15000);
        urlConnection.setConnectTimeout(15000);
        urlConnection.setRequestMethod("POST");
        urlConnection.setDoOutput(true);
        urlConnection.setChunkedStreamingMode(0);

        OutputStream outputStream = urlConnection.getOutputStream();
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream, "UTF-8");
        BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
        bufferedWriter.write(request);

        bufferedWriter.flush();
        bufferedWriter.close();
        outputStreamWriter.close();
        outputStream.close();

        int response=urlConnection.getResponseCode();
        urlConnection.disconnect();
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

如果我从cmd 更新我的表,它可以工作,但从代码它不能。

这是我的控制器:

@Controller
public class UploadController implements Constant {
    @RequestMapping(value = "/upload-image", method = RequestMethod.POST)
    public void handleUploadImageRequest(@RequestBody String request) {
        String[] details = request.split(" ");
        String name = details[0];
        String password = details[1];
        byte[] decodedImage = Base64.getDecoder().decode(details[2]);
        if (decodedImage.length > 0) {
            try {
                Image image = ImageIO.read(new ByteArrayInputStream(decodedImage));
                Connection connection = null;
                Statement statement = null;
                String updateUSER = "UPDATE " + TABLE_USERS + " SET " + COLUMN_ENCODEDIMAGE + "='" + details[2]
                        + "' WHERE " + COLUMN_USERID + "='" + name + "' AND '" + COLUMN_PASSWORD + "='" + password + "';";
                try {
                    connection = DatabaseUtils.getConnection();
                    statement = connection.createStatement();
                    statement.executeUpdate(updateUSER);
                    statement.close();
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

在heroku日志中我发现:

org.springframework.http.converter.HttpMessageNotReadableException:缺少所需的请求正文:public void com.rares.controllers.UploadController.handleUploadImageRequest(java.lang.String)

android 代码可以吗?问题出在哪里或者我应该怎么做。请不要指出我不推荐使用的方法。 我

【问题讨论】:

    标签: java android spring-mvc heroku httpurlconnection


    【解决方案1】:

    发错了。您的请求应该更像:

    request = "username=" + userName
             + "&password=" + passWord
             + "&image=" + base64String.
    

    然后这些值应该是 url 编码的。

    【讨论】:

    • 但我知道如何使用 split(" ") 获取控制器中的值
    • 你能用你的方法编辑我的控制器吗?我应该用请求参数来做吗?为什么现在请求正文没有用?
    • 如您所见,您将不再发送空格。所以也没有空间分割。
    • 但我不明白为什么我应该像你所说的那样从 Android 发送值。你能解释一下吗?
    • 如果您发送 key=value 对,这就是一种可以做到的方式。如果你做一个 POST。
    猜你喜欢
    • 2015-10-20
    • 2012-05-21
    • 2011-08-02
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-19
    相关资源
    最近更新 更多