Android 학습기록의 Volley 프레임워크 JSON Object Request

15000 단어 학습 기록
최근 JSON Object Request는 getParams를 통해 String Request처럼 서버의 데이터를 얻을 수 없으며 피드백의 결과는 서버에 전달되지 않은 것으로 밝혀졌다.그럼 파라미터가 최종적으로 어디에 서버에 제출되었는지 봅시다.HurlStack을 튜닝하여 발견합니다.java의 addBody IfExists() 방법, request 발견.getBody () = null, 즉 매개변수가 수신되지 않았습니다.StringRequest가 getParams를 다시 써서 전참할 수 있는 이유는 Request의 이 방법: Request입니다.java
public byte[] getBody() throws AuthFailureError {  
    Map params = getParams();  
    if (params != null && params.size() > 0) {  
        return encodeParameters(params, getParamsEncoding());  
    }  
    return null;  
}  

다시 쓴 get Params의 결과가 여기까지 전해질 겁니다.
Json Object Request가 getParams를 다시 쓰지 못하는 이유는 Json Request의 이 방법: Json Request입니다.java
@Override  
public byte[] getBody() {  
    try {  
        return mRequestBody == null ? null : mRequestBody.getBytes(PROTOCOL_CHARSET);  
    } catch (UnsupportedEncodingException uee) {  
        VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s",  
                mRequestBody, PROTOCOL_CHARSET);  
        return null;  
    }  
} 

Request를 다시 썼습니다.getBody(), 이 코드는 mRequestBody라는 변수가 매개 변수라는 것을 설명합니다.이 변수는 JsonRequest와 구조 함수에 있습니다.설명, Json Object Request의 전참은 구조를 통해 전달해야 하며, getParams()를 다시 쓰면 전달할 수 없습니다.
다음은 정상적인 사고방식에 따라 두 번째 구덩이를 밟아라.JsonObjectRequest의 구조에 매개변수를 전달합니다.또 무슨 문제가 생길까요?
/** 
 * JsonOnjectRequest Post   
 * 
 *  JsonObjectRequest , ? 
 *  。 
 *  JsonObjectRequest   http://....?key1=value1&key2=value2, 
 *  json {key1 : value1,key2 : value2...}, 。 
 *   HurlStack.java  addBodyIfExists 。 
 */  
private void jsonObjectRequestError2(){  

    String url = "http://route.showapi.com/213-3";  
    Map map = DummyData.getDummyData();  
    JSONObject params = new JSONObject(map);  

    JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST,url,params, new Response.Listener() {  
        @Override  
        public void onResponse(JSONObject response) {  
            responseText.setText(response.toString());  
        }  
    }, new Response.ErrorListener() {  
        @Override  
        public void onErrorResponse(VolleyError error) {  
            responseText.setText(error.getMessage());  
        }  
    });  
    mQueue.add(jsonObjectRequest);  
}  

위의 주석을 보십시오.피드백의 결과는 서버에 전달되지 않았다.그럼 파라미터가 최종적으로 어디에 서버에 제출되었는지 봅시다.Debug HurlStack.java의 addBodyIfExists() 메서드입니다.
매개 변수 전달은 정확하지만 전달된 매개 변수 형식은 json 문자열입니다.이 때 서버가 이러한 인삼을 받아들이지 않는지 고려하면 형식 전달 매개 변수를 바꾸십시오.http://apis.baidu.com/apistore/weatherservice/citylist?key1=value1&key2=value2다음은 이런 생각으로 코드를 개조하는 것이다.만약 서버가 json 문자열의 매개 변수를 받아들이지 않고 키=value와 같은 매개 변수를 받아들인다면 우리는 이런 형식의 매개 변수를 Json Object Request에 전달할 것이다.그리고 성공할 수 있을지 시험해 보자.그러나 Json Object Request의 구조에서 매개 변수는 반드시 JSON Object로 정의해야 하기 때문에 하나의 클래스만 JSON Object를 계승하고 매개 변수는 String 형식으로 전송할 수 있습니다.
정상적인 사고방식에 따라 세 번째 구덩이를 밟아라.클래스 상속 JsonObjectRequest를 정의하고 String 매개 변수를 전송합니다. 형식은 "key1=value1 & key2=value2..."입니다.여기에 코드를 붙이지 않습니다. 이 종류는 구조된 매개 변수인 JSON Object를 String으로 바꾸는 것을 제외하고는 완전히 일치합니다.물론 결과는 데이터를 얻지 못했다.
이유는 간단합니다. JsonRequest의 변수 보기 PROTOCOL_CONTENT_TYPE.
/** Content type for request. */  
private static final String PROTOCOL_CONTENT_TYPE =  
String.format("application/json; charset=%s", PROTOCOL_CHARSET);  

요청한 것은 json 문자열이지만, 사용자 정의 Request가 전송하는 매개 변수는 json 문자열이 아닙니다.그래서 사용자 정의 클래스에서 다시 쓰는 방법이 필요합니다.
public String getBodyContentType() {  
    return "application/x-www-form-urlencoded; charset=" + getParamsEncoding();  
}  

이 코드는 Request에서 가져옵니다.java에서 Copy.사용자 정의 Request
public class MyJsonObjectRequest extends JsonRequest<JSONObject> {  

    String stringRequest;  

    /** 
     *  method Method.POST, 。 
     *  , JsonObjectRequest, null。GET 。 
     * @param stringRequest   "key1=value1&key2=value2" 
     */  

    public MyJsonObjectRequest(String url, String stringRequest,  
                             Response.Listener listener, Response.ErrorListener errorListener) {  
        super(Method.POST, url,stringRequest , listener, errorListener);  
        this.stringRequest = stringRequest;  
    }  

    @Override  
    public String getBodyContentType() {  
        return "application/x-www-form-urlencoded; charset=" + getParamsEncoding();  
    }  

    @Override  
    protected Response parseNetworkResponse(NetworkResponse response) {  
        try {  
            String jsonString = new String(response.data,  
                    HttpHeaderParser.parseCharset(response.headers, PROTOCOL_CHARSET));  
            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));  
        }  
    }  

요청 방법:
private void jsonObjectRequestPostSuccess1(){  
        String url = "http://route.showapi.com/213-3";  
        Map<String,String> map = DummyData.getDummyData();  
        String params = appendParameter(url,map);  

        MyJsonObjectRequest jsonObjectRequest = new MyJsonObjectRequest(url,params, new Response.Listener<JSONObject>() {  
            @Override  
            public void onResponse(JSONObject response) {  
                responseText.setText(response.toString());  
            }  
        }, new Response.ErrorListener() {  
            @Override  
            public void onErrorResponse(VolleyError error) {  
                responseText.setText(error.getMessage());  
            }  
        });  
        mQueue.add(jsonObjectRequest);  
    }  



    private String appendParameter(String url,Map<String,String> params){  
        Uri uri = Uri.parse(url);  
        Uri.Builder builder = uri.buildUpon();  
        for(Map.Entry<String,String> entry:params.entrySet()){  
            builder.appendQueryParameter(entry.getKey(),entry.getValue());  
        }  
        return builder.build().getQuery();  
    }  

물론 반드시 Json Object Request를 사용자 정의해야 하는 것은 아니다. 만약에 Request의 계승 관계와 파라미터의 전달 절차를 알고 있다면 Json Object Request를 직접 사용해도 된다.
/** 
 *  , JsonObjectRequestPost , 。 
 */  
private void jsonObjectRequestPostSuccess2(){  
    String url = "http://route.showapi.com/213-3";  
    Map params = DummyData.getDummyData();  
    final String mRequestBody = appendParameter(url,params);  

    JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST,url,null, new Response.Listener() {  
        @Override  
        public void onResponse(JSONObject response) {  
            responseText.setText(response.toString());  
        }  
    }, new Response.ErrorListener() {  
        @Override  
        public void onErrorResponse(VolleyError error) {  
            responseText.setText(error.getMessage());  
        }  
    }){  
        @Override  
        public String getBodyContentType() {  
            return "application/x-www-form-urlencoded; charset=" + getParamsEncoding();  
        }  

        @Override  
        public byte[] getBody() {  
            try {  
                return mRequestBody == null ? null : mRequestBody.getBytes(PROTOCOL_CHARSET);  
            } catch (UnsupportedEncodingException uee) {  
                VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s",  
                        mRequestBody, PROTOCOL_CHARSET);  
                return null;  
            }  
        }  
    };  
    mQueue.add(jsonObjectRequest);  
}  

private String appendParameter(String url,Map params){  
    Uri uri = Uri.parse(url);  
    Uri.Builder builder = uri.buildUpon();  
    for(Map.Entry entry:params.entrySet()){  
        builder.appendQueryParameter(entry.getKey(),entry.getValue());  
    }  
    return builder.build().getQuery();  
}  

요약: JsonObjectRequest 요청 서버를 사용합니다. 그 매개 변수는 json열의 형식으로 서버에 전송됩니다. 서버가 이 형식을 지원하는지 여부를 고려하여 JsonRequest의 PROTOCOL_CONTENT_TYPE에서 매개변수가 전달되는 유형을 볼 수 있습니다.만약 서버가 http:...?key1=value1 & key2=value2 형식, 즉 대응 Request.java의 PROTOCOL_CONTENT_TYPE 변수 유형입니다.약간의 변화가 필요하다. 두 가지 방식으로 실현할 수 있다.첫 번째 방법은 하나의 클래스를 정의하여 Json Object Request를 계승하는 것이고, 두 번째는 Json Object Request를 직접 사용하는 것이다.원리는 같지만 익명 내부 클래스인 getBody ContentType을 다시 쓰는 것이 중점이다.getParams라는 방법을 다시 쓸 수 없습니다.
StringRequest를 사용하면 매개 변수나 Http Header 또는 다른 경우 getParams (), getHeader () 등 익명의 내부 클래스를 다시 쓸 수 있습니다.
HurlStack을 주목할 필요가 있습니다.자바 같은 종류.

좋은 웹페이지 즐겨찾기