Ich habe gesehen, dass andere auf dieses Problem gestoßen sind, aber keiner der Posts konnte mir helfen. Ich versuche, Volley für meine REST - Aufrufbibliothek zu verwenden, und wenn ich versuche, einen Put-Aufruf mit einem JSON-Objekt als Parameter zu verwenden, erhalte ich error with: org.json.JSONException: End of input at character 0 of
.
Hier ist der Code:
protected void updateClientDeviceStatus(Activity activity, final int status) {
JSONObject jsonParams = new JSONObject();
try {
jsonParams.put("statusId", String.valueOf(status));
} catch (JSONException e1) {
e1.printStackTrace();
}
Log.i(LOG_TAG, "json: " + jsonParams.toString());
String url = Constants.API_URL + "client/device/" + getDeviceId();
// Request a response from the provided URL.
JsonObjectRequest request = new JsonObjectRequest
(Request.Method.PUT, url, jsonParams, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.i(LOG_TAG, "updated client status");
Log.i(LOG_TAG, "response: " + response.toString());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.i(LOG_TAG, "error with: " + error.getMessage());
if (error.networkResponse != null)
Log.i(LOG_TAG, "status code: " + error.networkResponse.statusCode);
}
}) {
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String, String> params = new HashMap<String, String>();
params.put("User-Agent", getUserAgent());
params.put("X-BC-API", getKey());
return params;
}
@Override
public String getBodyContentType() {
return "application/json";
}
};
request.setRetryPolicy(new DefaultRetryPolicy(20000, 3, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
MySingleton.getInstance(activity).addToRequestQueue(request);
}
}
Das jsonParams-Protokoll zeigt Folgendes an:
json: {"statusId":"1"}
Gibt es eine andere Einstellung, die ich vermisse? Es scheint, dass die Anforderung das JSON-Objekt nicht analysieren kann. Ich habe sogar versucht, eine HashMap zu erstellen und diese dann zum Erstellen eines JSON-Objekts zu verwenden, aber ich bekomme immer noch dasselbe Ergebnis.
Auch ich bin diesem Problem begegnet.
Es ist nicht notwendigerweise wahr, dass dies auf ein Problem auf Ihrer Serverseite zurückzuführen ist. Dies bedeutet lediglich, dass die Antwort von JsonObjectRequest
leer ist.
Es kann durchaus sein, dass der Server Ihnen Inhalte sendet, und die Tatsache, dass die Antwort leer ist, ist ein Fehler. Wenn sich der Server jedoch so verhalten soll, müssen Sie, um dieses Problem zu lösen, ändern, wie JsonObjectRequest seine Antwort parst, das heißt, eine Unterklasse von JsonObjectRequest
erstellen und die parseNetworkResponse
-Instanz überschreiben.
@Override
protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
try {
String jsonString = new String(response.data,
HttpHeaderParser.parseCharset(response.headers, PROTOCOL_CHARSET));
JSONObject result = null;
if (jsonString != null && jsonString.length() > 0)
result = new JSONObject(jsonString);
return Response.success(result,
HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
} catch (JSONException je) {
return Response.error(new ParseError(je));
}
}
Beachten Sie, dass mit diesem Fix und im Falle einer leeren Antwort des Servers der Anforderungsrückruf anstelle von JSONObject
eine Nullreferenz zurückgibt.
Es macht vielleicht keinen Sinn, aber für mich hat sich nichts anderes ergeben, als einen inhaltlichen Header hinzuzufügen
mHeaders.put("Content-Type", "application/json");
Ich hatte das gleiche Problem. Ich habe es behoben, indem ich ein benutzerdefiniertes JsonObjectRequest erstellt habe, das eine leere oder leere Antwort abfangen kann:
public class CustomJsonObjectRequest extends JsonObjectRequest {
public CustomJsonObjectRequest(int method, String url, JSONObject jsonRequest, Response.Listener<JSONObject> listener, Response.ErrorListener errorListener) {
super(method, url, jsonRequest, listener, errorListener);
}
public CustomJsonObjectRequest(String url, JSONObject jsonRequest, Response.Listener<JSONObject> listener, Response.ErrorListener errorListener) {
super(url, jsonRequest, listener, errorListener);
}
@Override
protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
try {
String jsonString = new String(response.data,
HttpHeaderParser.parseCharset(response.headers));
JSONObject result = null;
if (jsonString != null && jsonString.length() > 0)
result = new JSONObject(jsonString);
return Response.success(result,
HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
} catch (JSONException je) {
return Response.error(new ParseError(je));
}
}
Dann ersetzen Sie einfach das Standard-JsonObjectRequest durch dieses!
In meinem Fall war die Anforderung, die ich (POST) schickte, nicht korrekt. Ich überprüfte meine Felder und stellte fest, dass es eine Nichtübereinstimmung gab, die der Server erwartete, also den Fehler-> Ende der Eingabe bei Zeichen 0 von ...