Android 错误:MultipartEntity,客户端发送的请求在语法上不正确

Posted

技术标签:

【中文标题】Android 错误:MultipartEntity,客户端发送的请求在语法上不正确【英文标题】:Android error : MultipartEntity , request sent by the client was syntactically incorrect 【发布时间】:2012-07-24 10:34:53 【问题描述】:

我想通过安全的 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 页面快照。

【问题讨论】:

您确定身份验证有效吗? 您可以在您的网络服务中发布您的映射 URL 吗?可能是您的 URL 请求与您映射的不同。 我检查了 URL 是否正确并在 HTML 页面中工作......但是 android 的代码给出了错误 您确定名称emailmusicData 等在小写/大写方面是正确的吗? 是的.....它是正确的,我仔细检查了它 【参考方案1】:

尝试在创建 HttpPost 对象时删除 setURI 方法并传入 URL,如下所示。这对我有用 (more here)。

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());
 

【讨论】:

只是接受它,因为赏金时间已经结束,我们有些接近解决方案,但问题仍然存在:(【参考方案2】:

似乎请求的标头不正确,如果您使用服务器端无法处理的different Auth protocol 或upper/lower case 或简单的wrong things in header,则可能会出现此问题。

【讨论】:

【参考方案3】:

不要通过尝试不同的组合来浪费您的时间。有一些 HTTP 请求工具可用于 HTTP,您可以使用这些工具跟踪您收到的请求和响应。例如。 HTTP Analyzer 下载试用版

从您的工作网络界面调用 URL,复制请求和响应 然后对程序执行相同的操作,该工具能够捕获您的请求和响应数据。

现在比较工作和不工作的请求,您肯定能够诊断问题,无论是标头问题还是某些与身份验证相关的问题。

【讨论】:

以上是关于Android 错误:MultipartEntity,客户端发送的请求在语法上不正确的主要内容,如果未能解决你的问题,请参考以下文章

Flutter Android Build Gradle错误配置根项目'android'?

Android Studio编译错误总结

android为啥会有以下错误?

Android Studio Android 资源链接失败错误.. AAPT:错误:找不到资源 android:attr/lStar。在 values.xml 105

无法构建 CastVideos-android,错误:路径名错误

Android 地图错误“找不到类 'android.app.AppOpsManager'”