Skip to content

Instantly share code, notes, and snippets.

@itsalif
Forked from ficusk/GsonRequest.java
Last active February 25, 2019 16:03
Show Gist options
  • Save itsalif/6149365 to your computer and use it in GitHub Desktop.
Save itsalif/6149365 to your computer and use it in GitHub Desktop.
Volley adapter for making XML Requests. It uses Simple-XML for serializing XML to Objects (http://simple.sourceforge.net/). Code is based of GsonRequest. Hope someone finds it useful.
import java.io.UnsupportedEncodingException;
import java.util.Map;
import org.simpleframework.xml.Serializer;
import org.simpleframework.xml.core.Persister;
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.Response.ErrorListener;
import com.android.volley.Response.Listener;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.HttpHeaderParser;
/**
* Simple Volley Class for doing XML HTTP Requests which are parsed
* into Java objects by Simple @see {{@link http://simple.sourceforge.net/}
*/
public class SimpleXmlRequest<T> extends Request<T> {
private static final Serializer serializer = new Persister();
private final Class<T> clazz;
private final Map<String, String> headers;
private final Listener<T> listener;
/**
* Make HTTP request and return a parsed object from Response
* Invokes the other constructor.
*
* @see SimpleXmlRequest#SimpleXmlRequest(int, String, Class, Map, Listener, ErrorListener)
*/
public SimpleXmlRequest(int method, String url, Class<T> clazz,
Listener<T> listener, ErrorListener errorListener) {
this(method, url, clazz, null, listener, errorListener);
}
/**
* Make HTTP request and return a parsed object from XML Response
*
* @param url URL of the request to make
* @param clazz Relevant class object
* @param headers Map of request headers
* @param listener
* @param errorListener
*
*/
public SimpleXmlRequest(int method, String url, Class<T> clazz, Map<String, String> headers,
Listener<T> listener, ErrorListener errorListener) {
super(method, url, errorListener);
this.clazz = clazz;
this.headers = headers;
this.listener = listener;
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
return headers != null ? headers : super.getHeaders();
}
@Override
protected void deliverResponse(T response) {
listener.onResponse(response);
}
@Override
protected Response<T> parseNetworkResponse(NetworkResponse response)
{
try {
String data = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
return Response.success(serializer.read(clazz, data),
HttpHeaderParser.parseCacheHeaders(response));
}
catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
}
catch (Exception e) {
return Response.error(new VolleyError(e.getMessage()));
}
}
}
@brunocasteleiro
Copy link

For the ones having the same problem as @ArcturusArc (just above me), you don't really need to worry about those messages.. if you want to know why, here you have a good reading https://robertmassaioli.wordpress.com/2011/04/21/simple-xml-in-android-1-5-and-up/ .

The first time I used this SimpleXMLRequest class I was getting those messages too, and I though that they were the reason why I wasn't getting the serialized object I wanted from the request. Anyway, I was wrong, I just forgot to define some attributes in my POJO's, so please make sure your POJO's are well defined too.

A quick note to itsalif.. This class works very well, thanks for sharing!

@LadyWendy
Copy link

Hi,
how can I send xml data using volley?

@kapoorgautam90
Copy link

untitled

How to send xml request in volley as mentioned in above picture ?

@PrachiKarapurkar
Copy link

PrachiKarapurkar commented Sep 13, 2016

Hello ,
I have following response

<APIGetCitiesResponse xmlns="http://tempuri.org/">
    <APIGetCitiesResult xmlns:a="http://schemas.datacontract.org/2004/07/CRS2011AgentApi" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
        <a:CityPair>
            <a:FromCityID>1</a:FromCityID>
            <a:FromCityName>Ahmedabad</a:FromCityName>
            <a:ToCityID>10</a:ToCityID>
            <a:ToCityName>Amreli</a:ToCityName>
        </a:CityPair>
        <a:CityPair>
            <a:FromCityID>1</a:FromCityID>
            <a:FromCityName>Ahmedabad</a:FromCityName>
            <a:ToCityID>57</a:ToCityID>
            <a:ToCityName>Ankleshwar</a:ToCityName>
        </a:CityPair>
</APIGetCitiesResult>
</APIGetCitiesResponse>

How to handle it ??

@PrachiKarapurkar
Copy link

Can anybody help me out??.. its urgent : (

@milon87
Copy link

milon87 commented Feb 16, 2017

how to send POST request with XML parameter? TIA

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment