使用 CodenameOne 客户端的 REST Web 服务总是返回 html
REST web service returning always html using CodenameOne client
我已经通过 jersey 和 tomcat 创建了一个网络服务,这里是:
@Path("/hello")
public class Hello {
// This method is called if TEXT_PLAIN is request
@GET
@Produces(MediaType.TEXT_PLAIN)
public String sayPlainTextHello() {
boolean flag=true;
return "Hello Jersey";
}
// This method is called if XML is request
@GET
@Produces(MediaType.TEXT_XML)
public String sayXMLHello() {
boolean flag=true;
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() {
boolean flag=true;
return "<html> " + "<title>" + "Hello Jersey" + "</title>"
+ "<body><h1>" + "Hello Jersey" + "</body></h1>" + "</html> ";
}
在 Codenameone 我这样设置客户端:
public static void getRest(){
String service="http://localhost:8080/com.vogella.jersey.first/rest/hello";
ConnectionRequest req = new ConnectionRequest(){
@Override
protected void postResponse() {
}
@Override
protected void readResponse(InputStream input) throws IOException {
// JSONParser p = new JSONParser();
// System.out.println(Util.readToString(input));
Dialog dd=new Dialog(Util.readToString(input));
hi.addComponent(dd);
}
};
req.setUrl(service);
req.setPost(false);
req.setContentType(MediaType.TEXT_PLAIN);
InfiniteProgress prog = new InfiniteProgress();
Dialog dlg = prog.showInifiniteBlocking();
req.setDisposeOnCompletion(dlg);
NetworkManager.getInstance().addToQueue(req);
}
codenameone 中的默认示例设置了 req.setContentType("text/plain");但是在客户端和 ws 中更改此选项结果是相同的,我总是得到 html 而不是 xml 或文本...这不是那么重要,因为很快我应该得到 json 但我想我必须在继续之前了解这件事...谢谢
案例一:
如果要基于 Accept Type headers 调用,
为 text/html 等更改接受 headers 以调用适当的方法。
Accept Headers
: text/plain
调用 sayPlainTextHello()
案例二:
如果你只想处理基于 URI 的调用:
请注意您来自客户端的 URI :
http://localhost:8080/com.vogella.jersey.first/rest/hello
是根 URI 而不是方法级别 URI。如果你有这样的方法:
@Path("/hello")
public class Hello {
// This method is called if TEXT_PLAIN is request
@GET
@Produces(MediaType.TEXT_PLAIN)
@Path("/text")
public String sayPlainTextHello() {
//do something
}
// This method is called if XML is request
@GET
@Produces(MediaType.TEXT_XML)
@Path("/xml")
public String sayXMLHello() {
//do something
}
// This method is called if HTML is request
@GET
@Produces(MediaType.TEXT_HTML)
@Path("/html")
public String sayHtmlHello() {
//do something
}
如您所见,您现在拥有方法级别 @Path
,然后您可以调用,
http://localhost:8080/com.vogella.jersey.first/rest/hello/xml
我只是举了一个例子,典型的实现可以基于 QueryParams 采取响应类型,被调用为,
http://localhost:8080/com.vogella.jersey.first/rest/hello?response=xml
我从未使用过 CodeNameOne,但我很确定 setContentType
设置了 Content-Type
header。在请求中,就是说客户端发送的数据类型就是该内容类型。但是 GET 通常没有数据,所以 Content-Type
没用。
对于请求,当您想告诉服务器您想要返回什么内容类型时,您可以设置 Accept
header。当你不设置它时,它通常默认为 */*
,这让 Jersey 只能选择一个。在你的情况下,它似乎总是选择 text/html
.
看起来像 ConnectionRequest
, I don't see any setAccept
method, but it looks like you can use addRequestHeader
。所以tre
req.addRequestHeader("Accept", "text/plain");
我已经通过 jersey 和 tomcat 创建了一个网络服务,这里是:
@Path("/hello")
public class Hello {
// This method is called if TEXT_PLAIN is request
@GET
@Produces(MediaType.TEXT_PLAIN)
public String sayPlainTextHello() {
boolean flag=true;
return "Hello Jersey";
}
// This method is called if XML is request
@GET
@Produces(MediaType.TEXT_XML)
public String sayXMLHello() {
boolean flag=true;
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() {
boolean flag=true;
return "<html> " + "<title>" + "Hello Jersey" + "</title>"
+ "<body><h1>" + "Hello Jersey" + "</body></h1>" + "</html> ";
}
在 Codenameone 我这样设置客户端:
public static void getRest(){
String service="http://localhost:8080/com.vogella.jersey.first/rest/hello";
ConnectionRequest req = new ConnectionRequest(){
@Override
protected void postResponse() {
}
@Override
protected void readResponse(InputStream input) throws IOException {
// JSONParser p = new JSONParser();
// System.out.println(Util.readToString(input));
Dialog dd=new Dialog(Util.readToString(input));
hi.addComponent(dd);
}
};
req.setUrl(service);
req.setPost(false);
req.setContentType(MediaType.TEXT_PLAIN);
InfiniteProgress prog = new InfiniteProgress();
Dialog dlg = prog.showInifiniteBlocking();
req.setDisposeOnCompletion(dlg);
NetworkManager.getInstance().addToQueue(req);
}
codenameone 中的默认示例设置了 req.setContentType("text/plain");但是在客户端和 ws 中更改此选项结果是相同的,我总是得到 html 而不是 xml 或文本...这不是那么重要,因为很快我应该得到 json 但我想我必须在继续之前了解这件事...谢谢
案例一: 如果要基于 Accept Type headers 调用, 为 text/html 等更改接受 headers 以调用适当的方法。
Accept Headers
: text/plain
调用 sayPlainTextHello()
案例二: 如果你只想处理基于 URI 的调用:
请注意您来自客户端的 URI :
http://localhost:8080/com.vogella.jersey.first/rest/hello
是根 URI 而不是方法级别 URI。如果你有这样的方法:
@Path("/hello")
public class Hello {
// This method is called if TEXT_PLAIN is request
@GET
@Produces(MediaType.TEXT_PLAIN)
@Path("/text")
public String sayPlainTextHello() {
//do something
}
// This method is called if XML is request
@GET
@Produces(MediaType.TEXT_XML)
@Path("/xml")
public String sayXMLHello() {
//do something
}
// This method is called if HTML is request
@GET
@Produces(MediaType.TEXT_HTML)
@Path("/html")
public String sayHtmlHello() {
//do something
}
如您所见,您现在拥有方法级别 @Path
,然后您可以调用,
http://localhost:8080/com.vogella.jersey.first/rest/hello/xml
我只是举了一个例子,典型的实现可以基于 QueryParams 采取响应类型,被调用为,
http://localhost:8080/com.vogella.jersey.first/rest/hello?response=xml
我从未使用过 CodeNameOne,但我很确定 setContentType
设置了 Content-Type
header。在请求中,就是说客户端发送的数据类型就是该内容类型。但是 GET 通常没有数据,所以 Content-Type
没用。
对于请求,当您想告诉服务器您想要返回什么内容类型时,您可以设置 Accept
header。当你不设置它时,它通常默认为 */*
,这让 Jersey 只能选择一个。在你的情况下,它似乎总是选择 text/html
.
看起来像 ConnectionRequest
, I don't see any setAccept
method, but it looks like you can use addRequestHeader
。所以tre
req.addRequestHeader("Accept", "text/plain");