Java中的REST调用

Java中的REST调用,java,json,rest,Java,Json,Rest,关于我正在用JAVA进行的一个特定REST调用,我有几个问题。我是个新手,所以我从几个来源拼凑了这个。调用本身如下所示: String src = AaRestCall.subTrackingNum(trackingNum); public class AaRestCall { public static String subTrackingNum (Sting trackingNum) throws IOException { URL url = new URL("https://.

关于我正在用JAVA进行的一个特定REST调用,我有几个问题。我是个新手,所以我从几个来源拼凑了这个。调用本身如下所示:

String src = AaRestCall.subTrackingNum(trackingNum);
public class AaRestCall {
public static String subTrackingNum (Sting trackingNum) throws IOException {
    URL url = new URL("https://.../rest/" + trackingNum);
    String query = "{'TRACKINGNUM': trackingNum}";

    //make connection
    URLConnection urlc = url.openConnection();

    //use post mode
    urlc.setDoOutput(true);
    urlc.setAllowUserInteraction(false);

    //send query
    PrintStream ps = new PrintStream(urlc.getOutputStream());
    ps.print(query);
    ps.close();

    //get result
    BufferedReader br = new BufferedReader(new InputStreamReader(urlc
        .getInputStream()));
    StringBuilder sb = new StringBuilder();
    String line = null;
    while ((line=br.readLine())!=null) {
        sb.append(line);
    }
    br.close();

    return sb.toString();
}
}
Rest调用类如下所示:

String src = AaRestCall.subTrackingNum(trackingNum);
public class AaRestCall {
public static String subTrackingNum (Sting trackingNum) throws IOException {
    URL url = new URL("https://.../rest/" + trackingNum);
    String query = "{'TRACKINGNUM': trackingNum}";

    //make connection
    URLConnection urlc = url.openConnection();

    //use post mode
    urlc.setDoOutput(true);
    urlc.setAllowUserInteraction(false);

    //send query
    PrintStream ps = new PrintStream(urlc.getOutputStream());
    ps.print(query);
    ps.close();

    //get result
    BufferedReader br = new BufferedReader(new InputStreamReader(urlc
        .getInputStream()));
    StringBuilder sb = new StringBuilder();
    String line = null;
    while ((line=br.readLine())!=null) {
        sb.append(line);
    }
    br.close();

    return sb.toString();
}
}
现在,除此之外,我还有几个问题要问,一般来说这有什么问题

1) 如果这个rest调用返回一个JSON对象,那么它会因为返回一个字符串而出错吗

2) 解析返回的JSON的最佳方法是什么

3) 我不确定如何格式化查询字段。我想应该在RESTAPI中记录这一点


提前谢谢。

哦,天哪。您可以在以下几个方面对此代码进行改进。我甚至不打算指出错误,因为我希望您用HTTP客户端库替换HTTP调用。我也不知道API所需的规范,因此要让您在这个抽象级别上正确使用POST或GET方法需要做更多的工作

1) 如果这个rest调用返回一个JSON对象,那么它会得到什么 把事情搞砸了

不,但是将json整理成obect是您的工作。像这样的图书馆会有所帮助

2) 解析返回的JSON的最佳方法是什么

我喜欢像上面提到的那样使用gson,但您可以使用另一个封送/取消封送库

3) 我不确定如何格式化查询字段。我想 这应该记录在RESTAPI中吗

对。看一下文档,并提出反映json结构的java对象。然后,您可以使用以下代码解析它们

gson.fromJson(json,MyStructure.class)

Http客户端 请看一下使用这样的库编写HTTP客户机,这将使您的工作更加轻松

测试
由于您似乎对这方面还不熟悉,我还建议您看看这样的工具,如果您怀疑编写的代码有错误,它可以帮助您测试API调用。

REST是应用于HTTP之上的一种模式。从您的问题来看,我认为您首先需要了解HTTP(以及一般的聊天套接字协议)是如何工作的,以及JavaAPI提供了什么来处理它

您可以使用任何Json库来解析HTTP响应体(只要它是200 OK,您需要检查它,并且还要注意HTTP重定向!),但这不是通常构建的方式

如果服务公开了一个真正的RESTful接口(与更简单的HTTP+JSON相反),则需要使用四个HTTP动词,而URLConnection不允许这样做。另外,您可能希望添加用于身份验证的头,或者可能添加cookie(实际上,它们只是HTTP头,但仍然值得单独考虑)。因此,我的建议是使用ApacheCommons中的HttpClient构建服务的客户端部分,或者使用一些具有客户端支持的JAX-RS库(例如ApacheCxf)。这样,您就可以完全控制通信,同时还可以使用更好的抽象,而不是使用URLConnection提供的InputStream并手动序列化/反序列化参数/响应

关于如何格式化查询字段,同样,您首先需要掌握HTTP的基础知识。无论如何,确切的答案取决于远程服务实现,但您将面临四个选项:

  • 服务URL中的查询字符串
  • HTTP请求的表单编码正文
  • HTTP请求的多部分主体(与前者类似,但不同的MIME类型足以让人头疼)-这通常用于也有网站的HTTP+JSON服务中,相同的URL可用于上载包含
    文件的表单
  • 为您的HTTP主体定义的服务编码(例如
    application/json
    ,或
    application/xml
    )(同样,它实际上与前两点相同,但不同的MIME编码意味着您必须使用不同的API)

  • 我认为你应该用a,而不是自己写,除非是为了教育目的——那就一定要发疯

    REST服务将以a响应您的呼叫,有效负载可能被格式化为,也可能不被格式化为。如果是的话,我建议您使用a将该字符串转换为Java表示

    是的,您将不得不求助于特定的restapi:s文档来获取详细信息

    另外,java URL类已损坏,请改用URI