如何从 Jersey Web 服务中的 android 读取多部分实体
how to read multipart entity from android in jersey web service
我正在从 android 客户端获取多部分实体,如下所示。
HttpClient httpClient = new DefaultHttpClient();
HttpPost postRequest = new HttpPost(
"http://localhost:9090/MBC_WS/rest/network/mobileUserPictureInsert1");
MultipartEntity reqEntity = new MultipartEntity(
HttpMultipartMode.BROWSER_COMPATIBLE);
reqEntity.addPart("message", new StringBody("hi moni"));
postRequest.setEntity(reqEntity);
HttpResponse response = httpClient.execute(postRequest);
在泽西,我正在尝试检索消息但只收到 object.the 代码是:
@Path("/mobileUserPictureInsert1")
@POST
@Consumes("multipart/*")
public String create(MultiPart multiPart){
BodyPartEntity bpe = (BodyPartEntity) multiPart.getBodyParts().get(0).getEntity();
String message = bpe.toString();
我在这里得到了一些对象,而不是消息值。我有什么错误 made.pl 帮帮我
是的,正确的结果。 toString()
将只使用 Object.toString()
,这将导致
getClass().getName() + '@' + Integer.toHexString(hashCode())
这很可能就是您所看到的。除非BodyEntityPart
overrides the toString()
, which it doesn't. You should instead be getting the InputStream
with BodyEntityPart.getInputStream()
。然后你可以用 InputStream
做任何事情。
一个简单的例子:
@POST
@Consumes("multipart/*")
public String create(MultiPart multiPart) throws Exception {
String message;
try (BodyPartEntity bpe
= (BodyPartEntity) multiPart.getBodyParts().get(0).getEntity()) {
message = getString(bpe.getInputStream());
}
return message;
}
private String getString(InputStream is) throws Exception {
StringBuilder builder = new StringBuilder();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(is))) {
String line;
while((line = reader.readLine()) != null) {
builder.append(line).append("\n");
}
}
return builder.toString();
}
另一个注意事项:您已经在使用 Jersey 多部分支持,您可以让生活更轻松,只需使用它的注释支持。例如,你可以做
@POST
@Consumes("multipart/*")
public String create(@FormDataParam("message") String message){
return message;
}
这样就容易多了。 @FormDataParam("message")
获取您在此处定义的正文名称:
reqEntity.addPart("message", new StringBody("hi moni"));
并转换为字符串。只要正文部分的 Content-Type 有可用的 MessageBodyReader,就应该能够自动转换。
- See more on Multipart support
- Here's another example showing a file upload
我正在从 android 客户端获取多部分实体,如下所示。
HttpClient httpClient = new DefaultHttpClient();
HttpPost postRequest = new HttpPost(
"http://localhost:9090/MBC_WS/rest/network/mobileUserPictureInsert1");
MultipartEntity reqEntity = new MultipartEntity(
HttpMultipartMode.BROWSER_COMPATIBLE);
reqEntity.addPart("message", new StringBody("hi moni"));
postRequest.setEntity(reqEntity);
HttpResponse response = httpClient.execute(postRequest);
在泽西,我正在尝试检索消息但只收到 object.the 代码是:
@Path("/mobileUserPictureInsert1")
@POST
@Consumes("multipart/*")
public String create(MultiPart multiPart){
BodyPartEntity bpe = (BodyPartEntity) multiPart.getBodyParts().get(0).getEntity();
String message = bpe.toString();
我在这里得到了一些对象,而不是消息值。我有什么错误 made.pl 帮帮我
是的,正确的结果。 toString()
将只使用 Object.toString()
,这将导致
getClass().getName() + '@' + Integer.toHexString(hashCode())
这很可能就是您所看到的。除非BodyEntityPart
overrides the toString()
, which it doesn't. You should instead be getting the InputStream
with BodyEntityPart.getInputStream()
。然后你可以用 InputStream
做任何事情。
一个简单的例子:
@POST
@Consumes("multipart/*")
public String create(MultiPart multiPart) throws Exception {
String message;
try (BodyPartEntity bpe
= (BodyPartEntity) multiPart.getBodyParts().get(0).getEntity()) {
message = getString(bpe.getInputStream());
}
return message;
}
private String getString(InputStream is) throws Exception {
StringBuilder builder = new StringBuilder();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(is))) {
String line;
while((line = reader.readLine()) != null) {
builder.append(line).append("\n");
}
}
return builder.toString();
}
另一个注意事项:您已经在使用 Jersey 多部分支持,您可以让生活更轻松,只需使用它的注释支持。例如,你可以做
@POST
@Consumes("multipart/*")
public String create(@FormDataParam("message") String message){
return message;
}
这样就容易多了。 @FormDataParam("message")
获取您在此处定义的正文名称:
reqEntity.addPart("message", new StringBody("hi moni"));
并转换为字符串。只要正文部分的 Content-Type 有可用的 MessageBodyReader,就应该能够自动转换。
- See more on Multipart support
- Here's another example showing a file upload