【问题标题】:Use MultipartEntityBuilder to send data from Android through REST使用 MultipartEntityBuilder 通过 REST 从 Android 发送数据
【发布时间】:2014-05-08 15:38:29
【问题描述】:

我正在尝试从我的 android 应用程序向 REST WebService 发送一些简单的字符串。但是,在我的 WebService 中,我总是收到一个空值。 [编辑]我使用 Multipart 是因为将来我还想连同字符串一起发送图像。

这是我的安卓代码:

HttpPost httppost = new HttpPost(url);
MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create();
entityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
entityBuilder.addTextBody("email", "teste");
entityBuilder.addTextBody("password", "123");
httppost.setEntity(entityBuilder.build());
response = httpclient.execute(httppost);
HttpEntity resEntity = response.getEntity();
StatusLine statusLine = response.getStatusLine();
int statusCode = statusLine.getStatusCode();

if(statusCode == HttpStatus.SC_OK) {
     Toast.makeText(mContext, "=]", Toast.LENGTH_SHORT).show();    //This line is executed
} else {
    Toast.makeText(mContext, "=[", Toast.LENGTH_SHORT).show();
}

这是我的网络服务代码:

@POST
@Path("/cadastrarUsuario")
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces(MediaType.APPLICATION_JSON)
public UsuarioVO postUsuario(@PathParam("email") final String email) {
    System.out.println("E-mail: " + email); 

    return usuario;

}

我总是收到无效的电子邮件。我猜@PathParam 或@FormParam 在这里不会真正起作用。但是接收参数的正确方法是什么?

【问题讨论】:

    标签: android web-services rest post multipart


    【解决方案1】:

    Multipart 更适合文件上传。在您的情况下,轻量级表单提交将是合适的。然后身体包含例如email=teste&pwd=123Content-Typeapplication/x-www-form-urlencoded

    您应该知道it's not recommended 在Android 中使用HttpClient >= GINGERBREAD。首选是HttpURLConnection

    由于 HttpURLConnection 的接口并不容易使用,所以有一些包装库可以让生活更轻松。 Here is a list。如果您选择了我提供的库(使用非常宽松的 MIT-Licence),您可以像这样创建您的 REST 请求:

    Webb webb = Webb.create();
    webb.setBaseUri("http://myserver/app-path");
    Response<String> response = webb
                .post("/cadastrarUsuario")
                .param("email", "teste")
                .param("pwd", "123")
                .asString();
    
    if (response.isSuccess()) {
        Log.i(TAG, "response: " + response.getBody());
    } else {
        Log.w(TAG, "HTTP-Code: " + response.getStatusCode());
    }
    

    您还可以接收其他类型,例如JSONObjectbyte[]。在这个例子中,我们期望一个简单的字符串。

    您的 Java REST 资源应该有点不同:

    @POST
    @Path("/cadastrarUsuario")
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED) // <-- 
    @Produces(MediaType.APPLICATION_JSON)
    public UsuarioVO postUsuario(@FormParam("email") final String email,
                                 @FormParam("pwd") final String pwd) {
        System.out.println("E-mail: " + email); 
    
        return usuario;
    }
    

    【讨论】:

    • 您好,感谢您的快速回复。我忘了说我正在使用 Multipart,因为我还想在将来发送图像和字符串。您提到的这些包装库中的任何一个都可以在同一个发布请求中发送图像和字符串吗?
    • 你想和图片一起发送什么样的字符串(多少?,多长时间?)?你有图像在内存中还是作为 sdcard 上的文件?
    • 我想将电子邮件、密码和图像作为存储在内存中的字节数组发送。我已经对如何获取图像和压缩图像有了一些想法。
    • 电子邮件和密码对我来说听起来像是某种身份验证标头。如果您符合标准,例如基本身份验证,您可以利用一些现有的软件组件。也许您的服务器端 REST 库已经有办法拦截请求并授权调用。
    • 我最终使用 base64 将 blob 转换为字符串,到目前为止它运行良好。还是谢谢你:)
    猜你喜欢
    • 1970-01-01
    • 2014-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-04
    相关资源
    最近更新 更多