안녕하세요, Android CouchDB 프로젝트에 몇 가지 문제가 있습니다.CouchDB가 잘못된 JSONObject를 반환합니다. Android Volley를 통해 응답 받기
Android에서 내 네트워크 요청에 Volley를 사용합니다.
문제는 전체 JSON 데이터를 다시 가져 오지 못한다는 것입니다. 요청의 URL은 다음과 같습니다
myserveradress : databaseport/databaseName을/DocumentName를/
앱을 통해 응답은 다음과 같습니다
는{"ok":true,"id":"E-c5b6d7c16ecb41cd8dadaf3514c968","rev":"1-41f6abc7851b1ad60d169149c557e7fc"}
나는 같은 URL thorugh 정확한 시도하는 경우 내 브라우저가 맞습니다. {"_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}}
이상한 일은 th입니다. 나는이 응용 프로그램에서 하나 이상의 요청에 사용하고 일부에서는 꽤 잘 작동합니다. 여기
MY CODE : 주먹 나는 발리 요청에 대한 도우미 클래스가 다음 로그 캣
@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));
}
여기 :
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: {"_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}}
,210
모든 I 전체 데이터를 받아 봐하지 않는 이유
I/Game Obj: onResponse: {"ok":true,"id":"E-69329c12008541949cba062559a3e2","rev":"2-2e7fa50583c3dbd4eca8eaf103567da7"}
W/System.err: org.json.JSONException: No value for invites
두 번째 출력 내가 이해할 수 없다 ...이 시점에 잘 작동합니다.
당신이 몇 가지 코드를 보여줄 수 얻을 않는
내가 전에이를 추가 할 경우 ... 문제인가? 첫 번째 경우에 문서를 만드는 것처럼 보입니다. –데이터베이스에 문제가 있다고 생각하지만 일부 코드가 표시됩니다. 다른 활동에서 문서를 만듭니다. 그런 다음 문서를 가져와 잘못된 데이터를 받기 전에 URL 끝에 백 슬래시가있는 지금이 문서를 읽습니다. 그런 다음 문서를 변경하고 목록보기에서 개체를 클릭 한 다음 저장합니다. 지금까지는 모든 것이 작동하지만 데이터베이스에서 데이터를 다시 가져와야하는데 작동하지 않습니다. 두 번째로 동일한 URL로 호출하는 것과 정확히 같은 방법이지만 전체 데이터는 수신하지 않습니다. –
정확한 HTTP 요청을 추적 할 수 있습니까? 앱을 통한 응답은 GET이 아닌 문서이지만 PUT 또는 POST 후에 새 문서를받는 응답의 유형입니다. (ID도 다릅니다.) – pwagner