繁体   English   中英

用Java调用REST

[英]REST call in Java

关于我在JAVA中进行的特定REST调用,我有几个问题。 我是新手,所以我从几个来源拼凑了这个。 调用本身看起来像这样:

String src = AaRestCall.subTrackingNum(trackingNum);

Rest调用类如下所示:

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)如果这个休息调用返回一个JSON对象,是否会因为转到String而搞砸了?

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

3)我真的不确定如何格式化查询字段。 我假设应该在REST API中记录?

提前致谢。

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

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

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

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

  1. 服务URL中的查询字符串
  2. HTTP请求的表单编码主体
  3. HTTP请求的多部分主体(类似于前者,但不同的MIME类型足以令人头疼) - 这通常用于也有网站的HTTP + JSON服务,并且可以使用相同的URL进行上传包含file输入的表单
  4. 您的HTTP正文的服务定义(例如application/jsonapplication/xml )编码(同样,它与前两个点完全相同,但不同的MIME编码意味着您必须使用不同的API )

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

1)如果这个休息调用返回一个JSON对象,是否会因为转到String而搞砸了?

不,但将json打成一个对象就是你的工作。 google gson这样的图书馆可以提供帮助。

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

我喜欢像上面提到的那样使用gson,但你可以使用另一个marshal / unmarhal库。

3)我真的不确定如何格式化查询字段。 我假设应该在REST API中记录?

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

gson.fromJson(json, MyStructure.class);

Http客户端

请看一下使用像apache HTTP客户端这样的库来编写HTTP客户 ,这将使您的工作变得更加容易。

测试

由于您似乎对此不熟悉,我还建议您查看Postman等工具,如果您怀疑您编写的代码有问题,可以帮助您测试API调用。

我认为您应该使用REST客户端库而不是编写自己的 ,除非它是出于教育目的 - 然后一定要疯了!

REST服务将使用HTTP响应响应您的调用,有效负载可能也可能不会格式化为JSON字符串 如果是,我建议您使用JSON解析库将该String转换为Java表示。

是的,您将不得不求助于特定的REST API:s文档以获取详细信息。

PS java URL类已损坏,请改用URI。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM