Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/187.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 更新内容长度发送Base64时收到0错误_Android_Base64_Square_Retrofit - Fatal编程技术网

Android 更新内容长度发送Base64时收到0错误

Android 更新内容长度发送Base64时收到0错误,android,base64,square,retrofit,Android,Base64,Square,Retrofit,我正在尝试使用表单数据将字符串和Base64字符串发送到服务器。但是改装不断向我显示此错误: 04-07 06:44:19.366 D/Retrofit﹕ ---- ERROR http://localhost/api/reports?auth_token=.... 04-07 06:44:19.366 D/Retrofit﹕ java.io.IOException: content-length promised 29149 bytes, but received 0

我正在尝试使用表单数据将字符串和Base64字符串发送到服务器。但是
改装
不断向我显示此错误:

04-07 06:44:19.366    D/Retrofit﹕ ---- ERROR http://localhost/api/reports?auth_token=....

04-07 06:44:19.366    D/Retrofit﹕ java.io.IOException: content-length promised 29149 bytes, but received 0
        at libcore.net.http.RetryableOutputStream.close(RetryableOutputStream.java:49)
        at libcore.net.http.HttpEngine.readResponse(HttpEngine.java:818)
        at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:283)
        at libcore.net.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:497)
        at retrofit.client.UrlConnectionClient.readResponse(UrlConnectionClient.java:90)
        at retrofit.client.UrlConnectionClient.execute(UrlConnectionClient.java:48)
        at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:287)
        at retrofit.RestAdapter$RestHandler.access$500(RestAdapter.java:197)
        at retrofit.RestAdapter$RestHandler$1.obtainResponse(RestAdapter.java:243)
        at retrofit.CallbackRunnable.run(CallbackRunnable.java:38)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
        at retrofit.Platform$Android$2$1.run(Platform.java:134)
        at java.lang.Thread.run(Thread.java:841)
04-07 06:44:19.366    D/Retrofit:    ---- END ERROR
我的API URL如下所示:
http://localhost/api/reports?auth_token=“”

它接受两个参数作为表单数据

  • 报告类型
  • 形象
以下是我的完整代码:

报告服务

public interface ReportService {
    @FormUrlEncoded
    @POST("/reports")
    void report(@Query("auth_token") String authToken, @Field("report_type") String report_type, @Field("image") String image, Callback<Report> callback);
}
报告

void report() {
    String authToken = pref.getAuthToken();
    String base64String = ""; //base64 string goes here

    ReportAPI.getInstance(this).getService().report(authToken, "in", base64String, new Callback<Report>() {
        @Override
        public void success(Report report, Response response) {
            Log.e("Report", "Reported Date: " + report.report_in_date);
        }

        @Override
        public void failure(RetrofitError error) {
            Log.e("Report", error.getResponse() + ": Error");
        }
    });
}
我花了4天的时间试图解决这个问题


旁注:我也尝试使用
TypedString
TypedInput

例外情况是,设置了一个请求头,承诺提供一个29149字节的请求正文,但没有提供该正文。如果你的正文应该是29149字节,你需要弄清楚为什么它没有被写入。如果你的正文应该是空的,你需要找出
内容长度
标题的来源。

是的,我正在发送base64字符串,因此正文应该是29149字节。但我不知道为什么没有写入。更改字段中的参数是否会更改值29149?将base64字符串更改为不同长度的“xxx”,然后重试。这将确认问题是否如下所述。也可能是服务器端的问题。@当然,该值正在根据数据更改。api与PostMan配合得很好。不,我没有使用它。我记得在使用Url或HTTP客户端为android开发时遇到过类似的问题,这两个本机提供的HTTP库。您可以尝试将okhttp放入路径中,这将确保使用OKhttpClient。只是帮你解决问题,因为我用了很多改装,这个错误似乎是不可能的。
void report() {
    String authToken = pref.getAuthToken();
    String base64String = ""; //base64 string goes here

    ReportAPI.getInstance(this).getService().report(authToken, "in", base64String, new Callback<Report>() {
        @Override
        public void success(Report report, Response response) {
            Log.e("Report", "Reported Date: " + report.report_in_date);
        }

        @Override
        public void failure(RetrofitError error) {
            Log.e("Report", error.getResponse() + ": Error");
        }
    });
}
---> HTTP POST http://localhost/api/reports?auth_token=
04-07 06:58:14.912    D/Retrofit﹕ Content-Type: application/x-www-form-urlencoded; charset=UTF-8
04-07 06:58:14.912    D/Retrofit﹕ Content-Length: 29149
04-07 06:58:14.916    D/Retrofit﹕ report_type=in&image=...base64string_goes_here...
04-07 06:58:14.916    D/Retrofit﹕ ---> END HTTP (29149-byte body)