他の人がこの問題に遭遇するのを見てきましたが、どの投稿も私を助けることができませんでした。 REST呼び出しライブラリにVolleyを使用しようとしています。JSONオブジェクトをパラメーターとしてPut呼び出しを使用しようとすると、error with: org.json.JSONException: End of input at character 0 of
。
これがコードです:
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);
}
}
JsonParamsログが表示されます。
json: {"statusId":"1"}
私が見逃している別の設定はありますか?リクエストがJSONオブジェクトを解析できないようです。 HashMapを作成し、それを使用してJSONオブジェクトを作成することも試みましたが、同じ結果が得られます。
私もこの問題に遭遇しました。
これは必ずしもサーバー側の問題が原因であるとは限りません。単にJsonObjectRequest
の応答が空であることを意味します。
サーバーがコンテンツを送信しているはずであり、その応答が空であるという事実はバグです。ただし、これがサーバーの動作方法である場合、この問題を解決するには、JsonObjectRequestが応答を解析する方法を変更する必要があります。つまり、JsonObjectRequest
のサブクラスを作成し、parseNetworkResponse
を以下の例に追加します。
@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));
}
}
この修正により、サーバーからの応答が空の場合、リクエストコールバックはJSONObject
の代わりにnull参照を返すことに注意してください。
意味がないかもしれませんが、コンテンツタイプヘッダーを追加する以外は何もうまくいきませんでした
mHeaders.put("Content-Type", "application/json");
同じ問題がありましたが、nullまたは空の応答をキャッチできるカスタムJsonObjectRequestを作成して修正しました。
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));
}
}
次に、デフォルトのJsonObjectRequestをこれに置き換えます。
私の場合、私が送信していたリクエスト(POST)が正しくありませんでした。私は自分のフィールドをクロスチェックし、ミスマッチがあったことを指摘しました。これにより、サーバーはエラー->文字0の入力の終わりを取得すると予期していました...