CouchDB通过Android截取返回错误的JSONObject GET-Response

CouchDB通过Android截取返回错误的JSONObject GET-Response,android,network-programming,couchdb,android-volley,couchdb-futon,Android,Network Programming,Couchdb,Android Volley,Couchdb Futon,嘿,我的Android CouchDB项目有些问题 我在Android中使用截击来处理网络请求 问题是我没有得到完整的JSON数据。 请求的url为: myServerAddress:databaseport/databasename/documentname/ 通过应用程序的响应是: {"ok":true,"id":"E-c5b6d7c16ecb41cd8dadaf3514c968","rev":"1-41f6abc7851b1ad60d169149c557e7fc"} 如果我在浏览器中尝试

嘿,我的Android CouchDB项目有些问题

我在Android中使用截击来处理网络请求

问题是我没有得到完整的JSON数据。 请求的url为:

myServerAddress:databaseport/databasename/documentname/

通过应用程序的响应是:

{"ok":true,"id":"E-c5b6d7c16ecb41cd8dadaf3514c968","rev":"1-41f6abc7851b1ad60d169149c557e7fc"}
如果我在浏览器中尝试完全相同的URL,我的回答是正确的:
{u id:“E-c5b6d7c16ecb41cd8dadafaf3514c968”,“u rev:“1-41f6abc7851b1ad60d169149c557e7fc”,“player:{“solvedPuzzels:[false,false,false,false,false,false,false],“triesPerPuzzel:[0,0,0],“invests:[],“settings:{“gameTime”:4,“numberOfPlayers”:2,“puzzels”:7}

奇怪的是,我在我的应用程序中的多个请求中使用了它,在某些情况下,它运行得非常好

这是我的代码: 首先,我有一个用于截击请求的助手类:

public class NetworkVolley {

public static JsonObjectRequest POST(String url, final JSONObject json, Response.Listener listener){
    JsonObjectRequest request = new JsonObjectRequest(Request.Method.PUT
            , url,json, listener,
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.e("Volley", "onErrorResponse: ", error );
                    Log.e("Volley", "onErrorResponse: "+new String(error.networkResponse.data, StandardCharsets.UTF_8) );
                }
            })
    {

        @Override
        public Map<String,String> getHeaders()throws AuthFailureError {
            Map<String, String> params = new HashMap<>();
            params.put("Accept-Charset", AppConfig.CHARSET);
            params.put("Content-Type", "application/json");
            params.put("Accept","application/json");
            String encoding =  Base64.encodeToString(AppConfig.SERVER_COUCHDB_AUTHENIFICATIONDATA.getBytes(Charset.forName("utf-8")), Base64.DEFAULT);
            params.put("Authorization","Basic "+ encoding);;
            return params;
        }

        @Override
        public byte[] getBody() {
            return json.toString().getBytes();
        }

    };

    return request;
}


public static JsonObjectRequest GET(String url, Response.Listener listener){
    JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null,
            listener,
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.e("Volley User", "onErrorResponse: ", error);
                }
            }) {

        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            Map<String, String> params = new HashMap<>();
            params.put("Accept-Charset", AppConfig.CHARSET);
            params.put("Content-Type", "application/json");
            params.put("Accept", "application/json");
            String encoding = Base64.encodeToString(AppConfig.SERVER_COUCHDB_AUTHENIFICATIONDATA.getBytes(Charset.forName("utf-8")), Base64.DEFAULT);
            params.put("Authorization", "Basic " + encoding);
            ;
            return params;
        }
    };
    return request;
}
到目前为止,一切都很顺利

I/Game Obj: onResponse: {"ok":true,"id":"E-69329c12008541949cba062559a3e2","rev":"2-2e7fa50583c3dbd4eca8eaf103567da7"}
W/System.err: org.json.JSONException: No value for invites
第二个输出我不明白为什么我没有收到完整的数据。

我解决了它

缓存是问题所在

Volley.newRequestQueue(getContext()).getCache().clear();

如果我在执行截击获取请求之前添加此命令

您能显示一些代码吗?在第一种情况下,您似乎正在创建文档。我认为数据库有问题,但我将显示一些代码。我在其他活动中创建文档。然后我得到了文档并阅读了它,在我收到错误的数据之前,我在URL的末尾加了一个反斜杠。然后我更改文档并在单击listview中的对象后保存它。到目前为止,一切都正常,但我需要再次从数据库中获取数据,但它不起作用,但它与我第二次使用相同URL调用的方法完全相同,但我没有收到完整的数据。您可以跟踪确切的HTTP请求吗?通过应用程序的响应不是一个文档(不是GET),而是您在提交或发布新文档后得到的响应类型。(ID也不同。)是的,接收到的请求看起来像来自PUT或POST,但实际上是GET。我检查了文件ID不同的ID在我的帖子中是个错误。在程序中,这些参数是相同的。对不起。我现在将把我的代码添加到我的帖子中……我怀疑这是CouchDB的错,我猜Volley并没有真正发送GET请求。也许您可以使用WireShark之类的工具跟踪实际的HTTP请求,或者检查CouchDB日志。文件E-69329c12008541949cba062559a3e2的第1版和第2版之间有什么区别?
I/Game Obj: onResponse: {"ok":true,"id":"E-69329c12008541949cba062559a3e2","rev":"2-2e7fa50583c3dbd4eca8eaf103567da7"}
W/System.err: org.json.JSONException: No value for invites
Volley.newRequestQueue(getContext()).getCache().clear();