gpt4 book ai didi

android - HttpClient 和 MultipartEntity 与 Jersey Multipart 和 Android

转载 作者:行者123 更新时间:2023-11-29 02:15:44 25 4
gpt4 key购买 nike

我有一个 rest 网络服务,它采用带有多部分消息的 POST 方法:

@Path("transferFile")     
@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces(MediaType.APPLICATION_XML)
public String multipartTest(com.sun.jersey.multipart.MultiPart data) {
try {
// get first body part (index 0)
BodyPart bp = multiPart.getBodyParts().get(0);
etc..

现在我正在尝试为此编写一个 Java 客户端。我从一个简单的 Jersey 客户端开始:查看 plaincopy 到剪贴板打印?

    MultiPart multiPart = new MultiPart();  
multiPart.bodyPart( new BodyPart(wavestream,MediaType.APPLICATION_OCTET_STREAM_TYPE));

Client c = Client.create();
WebResource r = c.resource("http://127.0.0.1:8080/webapp:);
response=r.path("transferFile").type(MediaType.MULTIPART_FORM_DATA).accept(MediaType.APPLICATION_XML).post(String.class, multiPart);

这很好用 - 一切正常。但是我需要这个客户端在 Android 上工作,我在该平台上使用 Jersey 时遇到了麻烦。所以我使用正常的方式在 android 上发送多部分消息:

    HttpClient client = new DefaultHttpClient();
client.getParams().setParameter("http.socket.timeout", new Integer(90000)); // 90 second

HttpPost httpPost = new HttpPost("http://127.0.0.1:8080/webapp/transferFile");
httpPost.setHeader("Content-Type", MediaType.MULTIPART_FORM_DATA );

//tried with and without base64
byte [] encodedWavestream = Base64.encodeBytesToBytes(wavestream);
InputStream ins = new ByteArrayInputStream(encodedWavestream);
InputStreamBody body = new InputStreamBody(ins, "test" );
int send = ins.available();

MultipartEntity requestContent = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE );
requestContent.addPart("stream", body);

httpPost.setEntity(requestContent);
HttpResponse Response = client.execute(httpPost);

这会给服务器带来烦人的响应:

HTTP Status 400 - Bad Request  
The request sent by the client was syntactically incorrect (Bad Request).

我检查了服务器日志文件,但那里什么也没有。所以我不知道这个错误的根源是什么。我写了一个简单的 html 页面,其中包含一个发布公式和“multipart/form-data”内容类型,它也可以工作! soapUI 自动生成的请求也可以!为什么我的客户端不起作用?有人可以帮忙吗?

最佳答案

Jersey 有错误。参见 Chunked encoding problem .

此问题仅在少数客户端(iOS、Android)中出现。

如果您将 Content-Type 设置为 application/octet-stream,那么 application/octet-stream 的 Jersey MessageWriter 将设置 Content-Length 和不作为分块传输方法发送。

solution对于 Jersey 客户:

ClientConfig config = new DefaultClientConfig();
config.getProperties().put(ClientConfig.PROPERTY_CHUNKED_ENCODING_SIZE, 32 * 1024);

但它不适用于 iOS 或 Android 的客户端。所以我测试了 Apache 文件上传。 Threre 是另一个错误:“流意外结束”。

只有 Oreilly upload 可以为所有客户端上传正确的文件。这是我的代码:

public Object[] getParametersAndFiles(HttpServletRequest request) throws IOException {
log.debug("OreillyUpload");
Properties params = new Properties();
LinkedHashMap files = new LinkedHashMap();

File tempDirectory = new File(System.getProperty("java.io.tmpdir"));

MultipartParser mp = new MultipartParser(request, 1*1024*1024); // 10MB
Part part;
while ((part = mp.readNextPart()) != null) {
String name = part.getName();
if (part.isParam()) {
// it's a parameter part
ParamPart paramPart = (ParamPart) part;
String value = paramPart.getStringValue();
params.put(name, value);

log.debug("param; name=" + name + ", value=" + value);
}
else if (part.isFile()) {
// it's a file part
FilePart filePart = (FilePart) part;
String fileName = filePart.getFileName();
if (fileName != null) {
// the part actually contained a file
File file = new File(tempDirectory,fileName);
long size = filePart.writeTo(file);
files.put(name, file);

log.debug("file; name=" + name + "; filename=" + fileName +
", filePath=" + filePart.getFilePath() +
", content type=" + filePart.getContentType() +
", size=" + size);

}
else {
// the field did not contain a file
log.debug("file; name=" + name + "; EMPTY");
}
}
}

return new Object[] {params, files};
}

这是 Jersey 服务器代码(警告所有 Jersey 上传注释(如“@FormDataParam”)应该被删除):

@POST
@Path("uploadMarkup")
@Produces(MediaType.APPLICATION_JSON)
// @Consumes(MediaType.MULTIPART_FORM_DATA)
//// public void uploadMarkup(
// public JSONWithPadding uploadMarkup(
// @FormDataParam("markupFile") InputStream markupFile,
// @FormDataParam("markupFile") FormDataContentDisposition details,
// @FormDataParam("slideNum") int slideNum) {
public JSONWithPadding uploadMarkup(@Context HttpServletRequest request) {
Object[] data = uploadService.getParametersAndFiles(request);
...
}

关于android - HttpClient 和 MultipartEntity 与 Jersey Multipart 和 Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4085839/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com