用Java调用REST

时间:2014-08-27 19:22:58

标签: java json rest

关于我在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中记录?

提前致谢。

3 个答案:

答案 0 :(得分:2)

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

你可以使用那里的任何Json库来解析HTTP响应主体(前提是它已经200,你需要检查,并注意HTTP重定向!),但它是而不是通常如何建造。

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

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

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

答案 1 :(得分:1)

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

  

1)如果这个休息调用正在返回一个JSON对象,那是否会得到   通过去一个字符串搞砸了?

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

  

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

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

  

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

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

gson.fromJson(json, MyStructure.class);

Http客户端

请使用像apache HTTP client这样的库来编写HTTP客户端,这将使您的工作变得更加轻松。

测试

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

答案 2 :(得分:1)

我认为你应该使用REST client library而不是自己编写,除非是出于教育目的 - 然后一定要疯了!

REST服务将使用HTTP response响应您的呼叫,有效负载可能也可能不会格式化为JSON string。如果是,我建议您使用JSON parsing library将该String转换为Java表示。

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

P.S。 java URL类已损坏,请改用URI。