Android 학습기록의 Volley 프레임워크 JSON Object Request
15000 단어 학습 기록
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을 주목할 필요가 있습니다.자바 같은 종류.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Vue.js Transition 개요Vue.js의 Transition 기능을 요약합니다. (초기초 학습 기록) 1. transition 태그로 둘러싸기 트랜지션을 적용하고 싶은 범위를 transition 태그로 둘러싸, 컴퍼넌트를 작성. 이 컴퍼넌트내...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.