我一直在关注一个关于宁静服务的教程,它运行正常。然而,有一些我还不太了解的东西。这是它的外观:
@Path("/hello")
public class Hello {
// This method is called if TEXT_PLAIN is request
@GET
@Produces( MediaType.TEXT_PLAIN )
public String sayPlainTextHello()
{
return "Plain hello!";
}
@GET
@Produces( MediaType.APPLICATION_JSON )
public String sayJsonTextHello()
{
return "Json hello!";
}
// This method is called if XML is request
@GET
@Produces(MediaType.TEXT_XML)
public String sayXMLHello() {
return "<?xml version=\"1.0\"?>" + "<hello> Hello Jersey" + "</hello>";
}
// This method is called if HTML is request
@GET
@Produces(MediaType.TEXT_HTML)
public String sayHtmlHello()
{
return "<html> " + "<title>" + "Hello fittemil" + "</title>"
+ "<body><h1>" + "Hello!" + "</body></h1>" + "</html> ";
}
}
困扰我的是我无法利用正确的操作。当我从浏览器请求服务时,会调用相应的sayHtmlHello()方法。但是现在我正在开发一个Android应用程序,我希望在Json中得到结果。但是当我从应用程序调用该服务时,将调用MediaType.TEXT_PLAIN方法。我的android代码看起来与此类似:
Make an HTTP request with android
如何从我的Android应用程序中调用使用MediaType.APPLICATION_JSON的方法? 此外,我想让这个特定的方法返回一个对象,如果我在那里得到一些指导也会很棒。
答案 0 :(得分:4)
我个人有使用Jersey在Java(JAX-RS)中实现REST的经验。然后我通过Android应用程序连接到这个RESTful Web服务。
在Android应用程序中,您可以使用HTTP客户端库。它支持HTTP命令,如POST,PUT,DELETE,GET。例如,使用GET命令并以JSON格式或TextPlain:
传输数据public class Client {
private String server;
public Client(String server) {
this.server = server;
}
private String getBase() {
return server;
}
public String getBaseURI(String str) {
String result = "";
try {
HttpParams httpParameters = new BasicHttpParams();
int timeoutConnection = 3000;
HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
int timeoutSocket = 5000;
HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
HttpGet getRequest = new HttpGet(getBase() + str);
getRequest.addHeader("accept", "application/json");
HttpResponse response = httpClient.execute(getRequest);
result = getResult(response).toString();
httpClient.getConnectionManager().shutdown();
} catch (Exception e) {
System.out.println(e.getMessage());
}
return result;
}
public String getBaseURIText(String str) {
String result = "";
try {
HttpParams httpParameters = new BasicHttpParams();
int timeoutConnection = 3000;
HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
int timeoutSocket = 5000;
HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
HttpGet getRequest = new HttpGet(getBase() + str);
getRequest.addHeader("accept", "text/plain");
HttpResponse response = httpClient.execute(getRequest);
result = getResult(response).toString();
httpClient.getConnectionManager().shutdown();
} catch (Exception e) {
System.out.println(e.getMessage());
}
return result;
}
private StringBuilder getResult(HttpResponse response) throws IllegalStateException, IOException {
StringBuilder result = new StringBuilder();
BufferedReader br = new BufferedReader(new InputStreamReader((response.getEntity().getContent())), 1024);
String output;
while ((output = br.readLine()) != null)
result.append(output);
return result;
}
}
然后在Android类中你可以:
Client client = new Client("http://localhost:6577/Example/rest/");
String str = client.getBaseURI("Example"); // Json format
解析JSON字符串(或者xml)并在ListView,GridView和...中使用它
我简要介绍了您提供的链接。那里有一个好点。您需要在API级别11或更高级别的单独线程上实现网络连接。请查看以下链接:HTTP Client API level 11 or greater in Android。
这是我在Client类中使用HTTP发布对象的方式:
public String postBaseURI(String str, String strUrl) {
String result = "";
try {
HttpParams httpParameters = new BasicHttpParams();
int timeoutConnection = 3000;
HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
int timeoutSocket = 5000;
HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
HttpPost postRequest = new HttpPost(getBase() + strUrl);
StringEntity input = new StringEntity(str);
input.setContentType("application/json");
postRequest.setEntity(input);
HttpResponse response = httpClient.execute(postRequest);
result = getResult(response).toString();
httpClient.getConnectionManager().shutdown();
} catch (Exception e) {
System.out.println(e.getMessage());
}
return result;
}
在REST WS中,我将对象发布到数据库:
@POST
@Path("/post")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.TEXT_PLAIN)
public Response addTask(Task task) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
session.save(task);
session.getTransaction().commit();
return Response.status(Response.Status.CREATED).build();
}
答案 1 :(得分:1)
在上面的代码中你评论了
// This method is called if TEXT_PLAIN is request
@GET
@Produces( MediaType.TEXT_PLAIN )...
请注意,注释@Produces
指定OUTPUT mimetype。
要指定INPUT mimetype,请使用@Consumes
注释。
检查blog post以了解有关泽西注释的更多信息:
@Consumes - 此批注指定资源类的方法可以接受的媒体类型。它是可选的,默认情况下,容器假定任何媒体类型都是可接受的。此批注可用于过滤客户端发送的请求。在接收具有错误媒体类型的请求时,服务器向客户端抛出错误。
@Produces - 此批注定义资源类的方法可以生成的媒体类型。与@Consumes注释一样,这也是可选的,默认情况下,容器假定任何媒体类型都可以发送回客户端。