Reputation: 6190
In Android, I am making an HTTP file upload request to a server as follows
MultipartRequest multipartRequest = new MultipartRequest(uploadUrl, null, mimeType, multipartBody, new Response.Listener<NetworkResponse>() {
@Override
public void onResponse(NetworkResponse response) {
// Need to read Json response here
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.d(GlobalClass.TAG, "File not uploaded");
}
});
GlobalClass.getInstance().addToRequestQueue(multipartRequest);
}
The response is of the following structure:
{
'response': 'some_data_to_be_used'
}
And this is my MultipartRequest
class:
package com.xxxxxx.xxxxxx;
import android.util.Log;
import com.android.volley.AuthFailureError;
import com.android.volley.NetworkResponse;
import com.android.volley.ParseError;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.HttpHeaderParser;
import java.util.Map;
class MultipartRequest extends Request<NetworkResponse> {
private final Response.Listener<NetworkResponse> mListener;
private final Response.ErrorListener mErrorListener;
private final Map<String, String> mHeaders;
private final String mMimeType;
private final byte[] mMultipartBody;
public MultipartRequest(String url, Map<String, String> headers, String mimeType, byte[] multipartBody, Response.Listener<NetworkResponse> listener, Response.ErrorListener errorListener) {
super(Method.POST, url, errorListener);
this.mListener = listener;
this.mErrorListener = errorListener;
this.mHeaders = headers;
this.mMimeType = mimeType;
this.mMultipartBody = multipartBody;
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
return (mHeaders != null) ? mHeaders : super.getHeaders();
}
@Override
public String getBodyContentType() {
return mMimeType;
}
@Override
public byte[] getBody() throws AuthFailureError {
return mMultipartBody;
}
@Override
protected Response<NetworkResponse> parseNetworkResponse(NetworkResponse response) {
try {
return Response.success(
response,
HttpHeaderParser.parseCacheHeaders(response));
} catch (Exception e) {
return Response.error(new ParseError(e));
}
}
@Override
protected void deliverResponse(NetworkResponse response) {
Log.d(GlobalClass.TAG, response.toString());
mListener.onResponse(response);
}
@Override
public void deliverError(VolleyError error) {
mErrorListener.onErrorResponse(error);
}
}
In my parseNetworkResponse
method, I've tried the following:
protected Response<NetworkResponse> parseNetworkResponse(NetworkResponse response) {
try {
Log.d(GlobalClass.TAG, response.toString());
String json = new String(response.data, HttpHeaderParser.parseCacheHeaders(response));
return Response.success(
response,
HttpHeaderParser.parseCacheHeaders(response));
} catch (Exception e) {
return Response.error(new ParseError(e));
}
}
Which I got from here.
But this gives me the error Cannot resolve constructor String(byte[],com.android.volley.Cache.Entry)
.
How do I read the JSON response object and use the value of the response
key as a string?
Upvotes: 1
Views: 7172
Reputation: 1855
For anybody fighting with Volley in Kotlin nowadays - here is method to read data returned from Volley NetworkResponse:
override fun parseNetworkResponse(response: NetworkResponse?): Response<String?>? {
val resp = response?.let { String(it.data) }
Log.d("RESPONSE data", resp.toString())
return Response.success(resp, HttpHeaderParser.parseCacheHeaders(response))
}
Upvotes: 0
Reputation: 3243
Update
As mentioned in the link you provided, you should change this line :
String json = new String(response.data, HttpHeaderParser.parseCacheHeaders(response));
to
String json = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
This is because String
class doesn't have any contructor
that matches the one you used in your code,
Upvotes: 10