I'm currently researching ServiceStack
as a replacement to my own services for handling REST between Android and Windows.
I've got the client (Android) working using loopj's AsyncHttpClient
. But I was looking for a more native library. Initially I was using Jsonserviceclient
but decided on the AndroidServiceClient
. The problem I had was setting up basic authentication on the connection. After a few hours of reading JsonServiceClient.java
(which AndroidServiceClient
extends), it transpired I have to implement my own request ConnectionFilter
and set up the request headers in the void exec(HttpURLConnection urlConnection)
method.
After creating code, I got the error "cannot set request property after connection is made". Seems I needed to tweak the code to suppress this error.
CustomRequestFilter
...
package com.jjoplc.pod.Views;
import android.util.Base64;
import net.servicestack.client.ConnectionFilter;
import java.net.HttpURLConnection;
public class CustomRequestFilter implements ConnectionFilter {
private String password = "";
private String username = "";
static boolean done = false;
public void exec(HttpURLConnection urlConnection) {
if (done) {
done = false;
return;
};
done = true;
String credentials = username + ":" + password;
final String basicAuth = "Basic " +
Base64.encodeToString(credentials.getBytes(), Base64.NO_WRAP);
urlConnection.setRequestProperty("Authorization", basicAuth);
}
public void setUsername(String userName) {
this.username = userName;
}
public void setPassword(String passWord) {
this.password = passWord;
}
}
Set up.
_androidClient = new AndroidServiceClient("http://myservice:8088");
_requestFilter = new CustomRequestFilter();
_requestFilter.setUsername("User");
_requestFilter.setPassword("Password");
_androidClient.RequestFilter = _requestFilter;
And test.
androidClient.getAsync(new dto.Hello().setName("Normski"),
new AsyncResult<dto.HelloResponse>() {
@Override
public void success(dto.HelloResponse r) {
view.setText(r.getResult());
}
@Override
public void error(Exception ex) {
view.setText(ex.toString());
}
});