Java中的REST调用
关于我正在用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://.
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