使用MultipartEntityBuilder通过REST从Android发送数据

时间:2014-05-08 15:38:30

标签: android web-services rest post multipart

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

这是我的android代码:

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;

}

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

1 个答案:

答案 0 :(得分:0)

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

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

由于HttpURLConnection的界面不易使用,因此有一些包装库可以让生活更轻松。 Here is a list。如果您选择我提供的库(使用非常自由的MIT-License),您可以像这样创建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[]。在这个例子中,我们期望一个简单的String。

您的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;
}