2013-11-19 9 views
6

Как сделать запрос JSON в залпе, где мне нужно отправить заголовок подлинности и объект JSON в теле, и я ожидаю только код состояния 200 ответовандроида залп JsonObjectRequest, который не возвращает тела только 200

JsonObjectRequest request = new JsonObjectRequest(
       method, 
       url, 
       myJsonObject, 
       responseListener, 
       errorListener) { 

      @Override 
      public Map<String, String> getHeaders() throws AuthFailureError { 
       HashMap<String, String> headers = new HashMap<String, String>(); 
       String creds = String.format("%s:%s", login, password); 
       String auth = "Basic " + Base64.encodeToString(creds.getBytes(), Base64.DEFAULT); 
       headers.put("Authorization", auth); 
       return headers; 
      } 
     }; 


new Response.Listener<String>(){ 

           @Override 
           public void onResponse(String response) { 
            Toast.makeText(getActivity(), response, 1000).show(); 

           } 

I попробовал разные виды прослушивателей ответов со строкой или объектом JSON, объект, но всегда есть ошибка: android volley org.json.JSONException: Конец ввода символа 0 из

Или существует какой-либо другой запрос в volley, который поддерживает и json-объект, и заголовок аутентификации в теле и ответе - это только HTTP-статистика нас код?

ответ

2

JsonObjectRequest Используется, когда вы ожидаете, что ответ сети будет объектом JSON. Поскольку вы этого не ожидаете, вы не должны его использовать.

Волейбол поставляется с несколькими предопределенными популярными типами запросов для удобства использования, но вы всегда можете создавать свои собственные. Я предлагаю сделать пользовательский запрос на основе JsonObjectRequest, но с другой реализацией метода parseNetworkResponse(), который не ожидает, что ответ будет объектом JSON, поскольку вы его не получаете. Вы можете добавить любые другие изменения, которые вам нужны.

6

Я знаю его старый вопрос, но я думал, что я все-таки ответить на этот вопрос, как мой ответ может помочь людям в будущем -

Вам нужно создать пользовательский класс, который расширяет запрос класса и в этом классе переопределить эти методы

@Override 
    protected Response parseNetworkResponse(NetworkResponse response) { 
     return Response.success(response.statusCode, HttpHeaderParser.parseCacheHeaders(response)); 
    } 

    @Override 
    protected void deliverResponse(Integer statusCode) { 
     mListener.onResponse(statusCode); 
    } 

Это сердце и душа этого класса.

Для полного кода и объяснения проверить мой блог на тему -

Получения статуса 200 ответа сервера из библиотеки Android Volley

link 1

Надеется, что это помогает, Благодаря

+1

Ответы на старые вопросы ftw! – scrrr

4

Благодаря Варундроиду и Итаю Хански. Это правильно, вам просто нужно подклассифицировать JsonObjectRequest.

Для удобства здесь мой переопределение:

public class MyJsonObjectRequest extends JsonObjectRequest { 
    @Override 
    protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) { 
     try { 
      String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); 
      // here's the new code, if jsonString.length() == 0 don't parse 
      if (jsonString.length() == 0) { 
       return Response.success(null, HttpHeaderParser.parseCacheHeaders(response)); 
      } 
      // end of patch 
      return Response.success(new JSONObject(jsonString), HttpHeaderParser.parseCacheHeaders(response)); 
     } catch (UnsupportedEncodingException e) { 
      return Response.error(new ParseError(e)); 
     } catch (JSONException je) { 
      return Response.error(new ParseError(je)); 
     } 
    } 
} 

Так что я просто использовать, что вместо JsonObjectRequest. Не слишком красиво, не слишком уродливо.

+0

Это работало как прелесть для меня. Благодаря! – maveroid

1

Не нужно создавать пользовательский класс, который расширяет Request as @varundroid. Вы можете просто переопределить метод parseNetworkResponse вместо метода onResponse и вернуть ответ успеха с пустым JSONObject().

Ниже приведен код, который я использую для решения той же проблемы, с которой вы сталкиваетесь. Надеюсь, это вам тоже поможет

@Override 
protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) { 
if (response != null && response.data.length == 0) 
    return Response.success(new JSONObject(), null); 
else 
    return super.parseNetworkResponse(response); 
} 
Смежные вопросы