使用 CodenameOne 客户端的 REST Web 服务总是返回 html

REST web service returning always html using CodenameOne client

我已经通过 jerseytomcat 创建了一个网络服务,这里是:

@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");