【问题标题】:Android error : MultipartEntity , request sent by the client was syntactically incorrectAndroid 错误:MultipartEntity,客户端发送的请求在语法上不正确
【发布时间】: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 等在小写/大写方面是正确的吗?
  • 是的.....它是正确的,我仔细检查了它

标签: java android http-post httpclient multipartentity


【解决方案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 protocolupper/lower case 或简单的wrong things in header,则可能会出现此问题。

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-05
      • 1970-01-01
      • 1970-01-01
      • 2013-03-21
      相关资源
      最近更新 更多