2016-04-05 3 views
6

私はVolleyと一緒に作業しています。私はJSONを私に返します(ウェブブラウザで見ることができます)。私の問題は、サーバーが私のアプリケーションで取得する必要があるヘッダー情報にも私を返しますが、私はリクエストからヘッダーを取得できません。ボレーのレスポンスからヘッダーを取得する

私は長い時間を検索しましたが、私は便利なもの

誰もがそれを実装する方法を知っている(Onlyeがリクエストヘッダにデータを追加することが、header's応答からデータを取得していない)を見つけたhavent?

答えて

12

を処理要求の例でありますリクエストでparseNetworkResponseをオーバーライドするために必要なヘッダーを取得します。

例えばJsonObjectRequest:

public class MetaRequest extends JsonObjectRequest { 

    public MetaRequest(int method, String url, JSONObject jsonRequest, Response.Listener 
      <JSONObject> listener, Response.ErrorListener errorListener) { 
     super(method, url, jsonRequest, listener, errorListener); 
    } 

    public MetaRequest(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, PROTOCOL_CHARSET)); 
      JSONObject jsonResponse = new JSONObject(jsonString); 
      jsonResponse.put("headers", new JSONObject(response.headers)); 
      return Response.success(jsonResponse, 
        HttpHeaderParser.parseCacheHeaders(response)); 
     } catch (UnsupportedEncodingException e) { 
      return Response.error(new ParseError(e)); 
     } catch (JSONException je) { 
      return Response.error(new ParseError(je)); 
     } 
    } 
} 
+0

ありがとう!!できます!!返されるJSONObjectにヘッダを追加するのではなく、parseNetworkResponseのヘッダで作業しています。 – Chopi

1

リクエストはJSONを返すされている場合ではない問題ではないAndroidアプリここ

からJSONからのものである場合、通常はそれを読むことができるはずはへ

RequestQueue queue = Volley.newRequestQueue(MainActivity.this); 
    JsonArrayRequest getRequest = new JsonArrayRequest(Request.Method.GET, "http://yourlink+parameters", new Response.Listener<JSONArray>() { 
     @Override 
     public void onResponse(JSONArray response) { 
      List<YourObject> reservations = null; 
      try { 

       YourObject= new ArrayList<YourObject>(); 
       for (int i = 0; i < response.length(); i++) { 
        JSONObject obj = response.getJSONObject(i); 
        YourObjectr = new YourObject(obj.getInt("id"), obj.getInt("user_id"),format.parse(obj.getString("date")), obj.getString("address"), obj.getString("description")); 
         } 

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

       } 

      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
     } 
    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError volleyError) { 
      if (volleyError.networkResponse != null && volleyError.networkResponse.data != null) { 
       VolleyError error = new VolleyError(new String(volleyError.networkResponse.data)); 
       volleyError = error; 
       Log.i("error", "error :" + volleyError.getMessage()); 
       try { 
        JSONObject obj = new JSONObject(volleyError.getMessage()); 
        if (obj.getString("error").equals("token_expired")) { 
         Intent i = new Intent(MainActivity.this, LoginActivity.class); 
         startActivity(i); 
        } 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 

      } else { 
       new AlertDialog.Builder(MainActivity.this) 
         .setTitle("connection problem") 
         .setMessage("check your connection") 
         .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int which) { 
          } 
         }) 
         .setIcon(android.R.drawable.ic_dialog_alert) 
         .show(); 
      } 
     } 
    }); 

    queue.add(getRequest); 
+2

JsonArrayRequestを使用すると、http要求のヘッダー情報(Cookieなど)を取得できません。 – Chopi

0

これはJSONArrayデータとヘッダで動作する例です。

まず、独自のカスタム要求タイプの実装を作成します。

public class JsonRequest extends JsonObjectRequest { 

    public JsonRequest(int method, String url, JSONObject jsonRequest, Response.Listener 
      <JSONObject> listener, Response.ErrorListener errorListener) { 
     super(method, url, jsonRequest, listener, errorListener); 
    } 

    @Override 
    protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) { 
     try { 
      String jsonString = new String(response.data, 
        HttpHeaderParser.parseCharset(response.headers, PROTOCOL_CHARSET)); 

      JSONObject jsonResponse = new JSONObject(); 
      jsonResponse.put("data", new JSONArray(jsonString)); 
      jsonResponse.put("headers", new JSONObject(response.headers)); 

      return Response.success(jsonResponse, 
        HttpHeaderParser.parseCacheHeaders(response)); 
     } catch (UnsupportedEncodingException e) { 
      return Response.error(new ParseError(e)); 
     } catch (JSONException je) { 
      return Response.error(new ParseError(je)); 
     } 
    } 
} 

とあなたの要求コードで:

JsonRequest request = new JsonRequest 
     (Request.Method.POST, URL_API, payload, new Response.Listener<JSONObject>() { 

      @Override 
      public void onResponse(JSONObject response) { 
       try { 
        JSONArray data = response.getJSONArray("data"); 
        JSONObject headers = response.getJSONObject("headers"); 
       } catch (JSONException e) { 
        Log.e(LOG_TAG, Log.getStackTraceString(e)); 
       } 
      } 
     }, new Response.ErrorListener() { 

      @Override 
      public void onErrorResponse(VolleyError error) { 
       Log.e(LOG_TAG, Log.getStackTraceString(error)); 
      } 
     }); 

はバレーボールのドキュメントImplementing a Custom Requestで独自のカスタム要求の実装の詳細情報を参照してください。

関連する問題