安卓错误:MultipartEntity,客户端发送的请求语法有误。

12

我需要通过安全的RESTful Web服务发送歌曲(mp3 / wav)文件和一些数据。我使用MultipartEntity来创建HttpPost请求。但是当我通过HttpClient执行它时,服务器会返回以下错误:

HTTP状态400-错误请求 类型:状态报告 消息:错误请求 客户端发送的请求在语法上不正确(错误请求)。

但是,如果我们从Web界面调用该服务,服务表现良好。请帮助解决问题。

这是代码:

HttpClient httpclient = new DefaultHttpClient();
HttpPost postRequest = new HttpPost();
        try {
            MultipartEntity reqEntity = new MultipartEntity();

            reqEntity.addPart("email", new StringBody("test@testmail.com"));
            reqEntity.addPart("password", new StringBody("123"));
            reqEntity.addPart("title", new StringBody("My new song"));
            reqEntity.addPart("musicData", new FileBody(new File(FilePath))); 

            // FIlePath is path to file and contains correct file location

            postRequest.setEntity(reqEntity);

            postRequest.setURI(new URI(ServiceURL));
            HttpResponse response = httpclient.execute(postRequest);

        } catch (URISyntaxException e) {
            Log.e("URISyntaxException", e.toString());
        } 

我还为MultipartEntity包含了apache-mime4j、httpclient、httpcore和httpmime JAR文件。

这是服务的HTML页面快照。 在此输入图片描述


你确定认证工作正常吗? - Mark
你能在你的Web服务中也发布你的映射URL吗?可能是你的URL请求与你映射的不同。 - tolgap
我检查了URL,它在HTML页面中是正确的并且能够工作...但是对于Android代码来说却出现错误。 - Azhar
你确定 emailmusicData 等名称的大小写是正确的吗? - pawelzieba
是的,没错,我已经仔细检查过了。 - Azhar
你确定认证没有使用头参数吗? - Dharmendra
3个回答

5
尝试删除setURI方法,并在创建HttpPost对象时传递URL,如下所示。这对我起作用(更多信息请参见此处)。
HttpClient httpclient = new DefaultHttpClient();
HttpPost postRequest = new HttpPost(ServiceURL);
try {
    MultipartEntity reqEntity = new MultipartEntity();

    reqEntity.addPart("email", new StringBody("test@testmail.com"));
    reqEntity.addPart("password", new StringBody("123"));
    reqEntity.addPart("title", new StringBody("My new song"));
    reqEntity.addPart("musicData", new FileBody(new File(FilePath)));     
    postRequest.setEntity(reqEntity);

    HttpResponse response = httpclient.execute(postRequest);

} catch (URISyntaxException e) {
    Log.e("URISyntaxException", e.toString());
} 

只接受它,因为赏金时间已经结束,我们某种程度上接近解决方案,但问题仍然存在 :( - Azhar

3

2
不要浪费时间尝试不同的组合。有一些HTTP请求工具可用于HTTP,您可以使用它们来跟踪您收到的请求和响应。例如,HTTP分析器下载试用版。
从您的工作Web界面调用URL,复制请求和响应,然后从程序中执行相同的操作,该工具足够能够捕获您的请求和响应数据。
现在比较工作和非工作请求,您肯定能够诊断问题,无论是头信息问题还是某些身份验证相关问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接