如何在 Volley 中从 JSONObject 获取字符串响应
How to get String response from JSONObject in Volley
我用volley创建了JSONRequest,成功命中服务,我检查了服务端,它接收到数据,并在return中发送"Success"。
问题在于,Service returns String
在输出中,而 Volley 在输出中排除了一些 JSON Data
。所以它执行 onError
方法,而不是 onResponse
。
请指导我如何让它接受字符串响应,或者当您使用 JSONObject
as 请求时是不可能的。
Request<JSONObject> jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, "http://192.168.0.101:8888/api/services/mytest",
jsonParent, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.d("Success", response.toString());
deleteFile();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.d("Error", error.toString());
deleteFile();
}
RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
requestQueue.add(jsonObjectRequest);
您可以使用 StringRequest 代替 JSONRequest。
StringRequest stringRequest = new StringRequest(methodType, url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}){
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
return headers == null ? super.getHeaders() : headers;
}
@Override
public byte[] getBody() throws AuthFailureError {
return "Your JSON body".toString().getBytes();
}
};
getheaders
方法是根据需要添加自定义 headers 和 getBody
以提供 request body
.
对于仍然需要发送原始 Json 并接收字符串作为响应的用户:
默认情况下,主体由 application/x-www-form-urlencoded; charset=UTF-8
格式的请求参数组成 StringRequest
。当覆盖 getBody()
时,正如 Nayan 正确建议的那样,考虑覆盖 getBodyContentType()
以匹配新的正文格式。对于 Json 应该是
application/json
.
String url = "www.google.com";
HashMap<String, Object> params = new HashMap<>();
params.put("key1", "Android");
params.put("isCool", true);
StringRequest request = new StringRequest(Request.Method.POST, url,
new Response.Listener<String>() {
public void onResponse(String response) {
}
},
new Response.ErrorListener() {
public void onErrorResponse(VolleyError error) {
}
}
) {
public byte[] getBody() {
return new JSONObject(params).toString().getBytes();
}
public String getBodyContentType() {
return "application/json";
}
};
Volley.newRequestQueue(this).add(request);
我用volley创建了JSONRequest,成功命中服务,我检查了服务端,它接收到数据,并在return中发送"Success"。
问题在于,Service returns String
在输出中,而 Volley 在输出中排除了一些 JSON Data
。所以它执行 onError
方法,而不是 onResponse
。
请指导我如何让它接受字符串响应,或者当您使用 JSONObject
as 请求时是不可能的。
Request<JSONObject> jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, "http://192.168.0.101:8888/api/services/mytest",
jsonParent, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.d("Success", response.toString());
deleteFile();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.d("Error", error.toString());
deleteFile();
}
RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
requestQueue.add(jsonObjectRequest);
您可以使用 StringRequest 代替 JSONRequest。
StringRequest stringRequest = new StringRequest(methodType, url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}){
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
return headers == null ? super.getHeaders() : headers;
}
@Override
public byte[] getBody() throws AuthFailureError {
return "Your JSON body".toString().getBytes();
}
};
getheaders
方法是根据需要添加自定义 headers 和 getBody
以提供 request body
.
对于仍然需要发送原始 Json 并接收字符串作为响应的用户:
默认情况下,主体由 application/x-www-form-urlencoded; charset=UTF-8
格式的请求参数组成 StringRequest
。当覆盖 getBody()
时,正如 Nayan 正确建议的那样,考虑覆盖 getBodyContentType()
以匹配新的正文格式。对于 Json 应该是
application/json
.
String url = "www.google.com";
HashMap<String, Object> params = new HashMap<>();
params.put("key1", "Android");
params.put("isCool", true);
StringRequest request = new StringRequest(Request.Method.POST, url,
new Response.Listener<String>() {
public void onResponse(String response) {
}
},
new Response.ErrorListener() {
public void onErrorResponse(VolleyError error) {
}
}
) {
public byte[] getBody() {
return new JSONObject(params).toString().getBytes();
}
public String getBodyContentType() {
return "application/json";
}
};
Volley.newRequestQueue(this).add(request);