1

Hey Ich habe ein paar Probleme mit meinem Android CouchDB Projekt.CouchDB gibt falsch zurück JSONObject GET Antwort durch Android Volley

Ich benutze Volley für meine Netzwerkanforderungen in Android.

Das Problem ist, dass ich nicht die vollständigen JSON-Daten zurückbekomme. Die URL für die Anfrage ist:

myserveradress: databaseport/database/Document/

die Antwort über den App ist:

{"ok":true,"id":"E-c5b6d7c16ecb41cd8dadaf3514c968","rev":"1-41f6abc7851b1ad60d169149c557e7fc"} 

wenn ich versuche, genau die gleiche URL Thorugh Mein Browser meine Antwort ist richtig: {"_id":"E-c5b6d7c16ecb41cd8dadaf3514c968","_rev":"1-41f6abc7851b1ad60d169149c557e7fc","player":{"solvedPuzzels":[false,false,false,false,false],"triesPerPuzzel":[0,0,0,0,0]},"invites":[],"settings":{"gameTime":4,"numberOfPlayers":2,"puzzels":7}}

Das komische Ding ist th Ich benutze dies in mehr als einer Anfrage in meiner App und in einigen funktioniert es ziemlich gut.

HIER MEIN CODE: Faust Ich habe eine Hilfsklasse für die Volley Anfragen:

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; 
} 

}

Und hier ist mein Fragment:

@Override 
public View onCreateView(final LayoutInflater inflater, final ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    rootView = inflater.inflate(R.layout.fragment_invite, container, false); 
    listView = (ListView) rootView.findViewById(R.id.listView); 
    TV_numberOfPlayers = (TextView) rootView.findViewById(R.id.playerInfo); 


    final InviteActivity activity = (InviteActivity) getActivity(); 
    numberOfPlayers = activity.getNumberOfPlayers(); 
    gameId = activity.getGameId(); 

    gameUrl = "myserveradress:databaseport/databasename/" + gameId + "/"; 

    userId = "userA"; 


    getFriendList(); 

    getGameObject(); 

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      JSONArray invites = new JSONArray(); 
      try { 
       invites = object.getJSONArray("invites"); 
       for (int i=0;i<=invites.length();i++){ 
        if (!(invites.length()==0) ||(!(invites.get(i).equals(parent.getItemAtPosition(position))))){ 
         invites.put(parent.getItemAtPosition(position)); 
         object.remove("invites"); 
         object.put("invites", invites); 
         setInvite(); 

        }else { 
         Log.i("Invite","Same invited Person"); 
         break; 
        } 
       } 

      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 

    return rootView; 
} 

private void setInvite() { 
    Response.Listener<JSONObject> POSTinvite = new Response.Listener<JSONObject>() { 
     @Override 
     public void onResponse(JSONObject response) { 
      getGameObject(); 
     } 
    }; 
    Volley.newRequestQueue(getContext()).add(NetworkVolley.POST(gameUrl,object,POSTinvite)); 
} 

private void getGameObject() { 
    object = new JSONObject(); 
    Response.Listener<JSONObject> gameObjListener = new Response.Listener<JSONObject>() { 
     @Override 
     public void onResponse(JSONObject response) { 
      if (response!=null){ 
       object = response; 
       Log.i("Game Obj", "onResponse: "+object); 
       try { 
        TV_numberOfPlayers.setText(getString(R.string.inv_tv_invitetPlayers) + " " + object.getJSONArray("invites").length() + "/" + numberOfPlayers); 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    }; 
    Volley.newRequestQueue(getContext()).add(NetworkVolley.GET(gameUrl,gameObjListener)); 
} 

private void getFriendList() { 
    friendsearchUrl = "myserveradress:databaseport/databasename/_design/friendsearch/_view/friendsearch?key="+"\""+userId+"\""; 

    friends = new ArrayList(); 

    Response.Listener<JSONObject> friendsListener = new Response.Listener<JSONObject>() { 
     @Override 
     public void onResponse(JSONObject response) { 
      try { 
       for (int i=0;i<response.getJSONArray("rows").length();i++){ 
        JSONObject object = new JSONObject(String.valueOf(response.getJSONArray("rows").get(i))); 
        friends.add(object.getString("value")); 
       } 
       adapter = new FriendsListAdapter(getActivity(),friends); 
       listView.setAdapter(adapter); 

      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
     } 
    }; 
    Volley.newRequestQueue(getContext()).add(NetworkVolley.GET(friendsearchUrl,friendsListener)); 
} 

HIER DIE Logcat:

I/Game Obj: onResponse: {"_id":"E-69329c12008541949cba062559a3e2","_rev":"1-b0b6eb597bfe6905b06723953fbf6870","player":{"solvedPuzzels":[false,false,false,false,false],"triesPerPuzzel":[0,0,0,0,0]},"invites":[],"settings":{"gameTime":4,"numberOfPlayers":2}} 

Alles funktioniert bis zu diesem Punkt in Ordnung ...

I/Game Obj: onResponse: {"ok":true,"id":"E-69329c12008541949cba062559a3e2","rev":"2-2e7fa50583c3dbd4eca8eaf103567da7"} 
W/System.err: org.json.JSONException: No value for invites 

Der zweite Ausgang kann ich nicht nachvollziehen, warum ich nicht die vollen Daten erhalten speichert.

+0

Könnten Sie etwas Code zeigen, tun? Es scheint, als ob Sie im ersten Fall ein Dokument erstellen. –

+0

Ich denke, es gibt ein Problem mit der Datenbank, aber ich werde etwas Code zeigen. Ich erstelle das Dokument in einer anderen Aktivität. Dann bekomme ich das Dokument und lese es das funktioniert jetzt nachdem ich aber einen Backslash am Ende der URL habe bevor ich die falschen Daten erhalten habe. Dann ändere ich das Dokument und speichere es, nachdem ich auf ein Objekt in einer Listenansicht geklickt habe. Soweit funktioniert jetzt alles aber dann muss ich die Daten nochmal aus der Datenbank holen und es funktioniert nicht aber es ist genau die selbe Methode ich rufe mit der selben URL das zweite mal aber ich erhalte nicht die vollen Daten. –

+0

Können Sie die genauen HTTP-Anfragen verfolgen? Die Antwort über die App ist kein Dokument (nicht GET), sondern die Art der Antwort, die Sie nach einem PUT oder POST eines neuen Dokuments erhalten. (Die IDs sind ebenfalls unterschiedlich.) – pwagner

Antwort

2

Ich löste es !!!

Der Cache ist das Problem ...

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

Wenn ich das hinzufügen, bevor ich die Volley-GET-Anfrage

Verwandte Themen