如何在Java中使用REST接口

52

使用Java工具,

wscompile for RPC
wsimport for Document
etc..

我可以使用WSDL生成桩代码和类来连接SOAP Web服务。

但是我不知道如何在REST中做同样的事情。 如何获取用于连接REST Web服务所需的Java类。 以及无论如何访问该服务的方法是什么?

有人可以向我展示一下吗?


请参见 https://dev59.com/NnA75IYBdhLWcg3w49YR。 - user647772
1
这个链接会对你有所帮助:https://dev59.com/b3VC5IYBdhLWcg3wpjB8 - zaffargachal
各位...我不想使用URL来访问Web服务。我想使用我的Java类来访问。有什么办法吗? - Mawia
检查这两行代码 https://dev59.com/CWcs5IYBdhLWcg3wXSyU#48030636 - Vishrant
11个回答

43

工作示例,请尝试以下内容:

package restclient;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class NetClientGet {
    public static void main(String[] args) {
        try {

            URL url = new URL("http://localhost:3002/RestWebserviceDemo/rest/json/product/dynamicData?size=5");//your url i.e fetch data from .
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            conn.setRequestProperty("Accept", "application/json");
            if (conn.getResponseCode() != 200) {
                throw new RuntimeException("Failed : HTTP Error code : "
                        + conn.getResponseCode());
            }
            InputStreamReader in = new InputStreamReader(conn.getInputStream());
            BufferedReader br = new BufferedReader(in);
            String output;
            while ((output = br.readLine()) != null) {
                System.out.println(output);
            }
            conn.disconnect();

        } catch (Exception e) {
            System.out.println("Exception in NetClientGet:- " + e);
        }
    }
}

1
@OwenIvory,你说的“Apache地狱”是什么意思? - Cyclonecode
我最初被告知使用Apache的.jar文件来完成一个简单的Restful查询。所以我下载了一些.jar文件,但它们是错误版本的Java(不是我正在使用的版本)。然后我找到了一些正确版本的Java,但它们与Apache版本不匹配,因此这些类中没有我所给出的示例中的对象。无论如何,这个示例是纯粹使用java.net...只需要安装JDK就能工作。不需要处理Apache版本或获取jar文件或编译问题,只需安装JDK并开始使用。 - Owen Ivory
你好,如果我的方法是Post并且需要发送一个Json对象,这种方法是否可行?谢谢。 - Ramiro Arizpe Giacomelli
我有些困惑。到底是哪个方法将请求发送到网络?是 .openConnection() 吗?如果是,那么为什么之后还要设置请求方法和头信息呢?请原谅,我还是 Java 的初学者。 - Peter Schorn

19

就像其他人所说的那样,您可以使用较低级别的HTTP API来完成,或者您可以使用更高级别的JAXRS API以JSON格式消费服务。例如:

Client client = ClientBuilder.newClient();
WebTarget target = client.target("http://host:8080/context/rest/method");
JsonArray response = target.request(MediaType.APPLICATION_JSON).get(JsonArray.class);

3
正如Holly建议的那样,JAX RS Client API(在2.0版本中引入)比低级别的URL + 手动反序列化更好的方式来消费REST API。我建议使用经过正确映射的Java bean获取数据,而不是“原始json”。这是我之前写过的一篇关于此主题的教程:https://vaadin.com/blog/-/blogs/consuming-rest-services-from-java-applications - mstahv
我可以使用这个进行POST请求吗?如何设置请求的主体? - Cesar Leonardo Ochoa Contreras

9

这只是两行代码而已。

import org.springframework.web.client.RestTemplate;

RestTemplate restTemplate = new RestTemplate();
YourBean obj = restTemplate.getForObject("http://gturnquist-quoters.cfapps.io/api/random", YourBean.class);

参考:Spring.io消费REST


1
请勿解释文本内容。 - Vishrant
你需要使用 Spring Web,因为它正在使用 RestTemplate。 - Danyal Sandeelo
我可以在JEE中使用Spring REST Template吗?或者有什么理由不使用它吗? - powder366
@powder366,您可以添加所需的依赖项并使用它。 - Vishrant

4
以下代码将帮助使用Java消费rest api。 URL - 终端rest 如果您不需要任何身份验证,您不需要编写authStringEnd变量。
该方法将返回一个包含响应内容的JsonObject。
public JSONObject getAllTypes() throws JSONException, IOException {
        String url = "/api/atlas/types";
        String authString = name + ":" + password;
        String authStringEnc = new BASE64Encoder().encode(authString.getBytes());
        javax.ws.rs.client.Client client = ClientBuilder.newClient();
        WebTarget webTarget = client.target(host + url);
        Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON).header("Authorization", "Basic " + authStringEnc);

        Response response = invocationBuilder.get();
        String output = response.readEntity(String.class
        );

        System.out.println(response.toString());
        JSONObject obj = new JSONObject(output);

        return obj;
    }

3

只需使用正确的查询字符串或请求正文,向所需的URL发出http请求。

例如,您可以使用java.net.HttpURLConnection,然后通过connection.getInputStream()进行消耗,然后转换为您的对象。

在Spring中,有一个restTemplate使所有这些变得更加容易。


3
如果您还需要将作为服务调用响应的xml字符串进行转换,您可以使用以下方式执行x对象:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.JAXB;
import javax.xml.bind.JAXBException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.CharacterData;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

public class RestServiceClient {

// http://localhost:8080/RESTfulExample/json/product/get
public static void main(String[] args) throws ParserConfigurationException,
SAXException {

try {

URL url = new URL(
    "http://localhost:8080/CustomerDB/webresources/co.com.mazf.ciudad");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Accept", "application/xml");

if (conn.getResponseCode() != 200) {
throw new RuntimeException("Failed : HTTP error code : "
    + conn.getResponseCode());
}

BufferedReader br = new BufferedReader(new InputStreamReader(
    (conn.getInputStream())));

String output;

Ciudades ciudades = new Ciudades();
System.out.println("Output from Server .... \n");
while ((output = br.readLine()) != null) {
System.out.println("12132312");
System.err.println(output);

DocumentBuilder db = DocumentBuilderFactory.newInstance()
    .newDocumentBuilder();
InputSource is = new InputSource();
is.setCharacterStream(new StringReader(output));

Document doc = db.parse(is);
NodeList nodes = ((org.w3c.dom.Document) doc)
    .getElementsByTagName("ciudad");

for (int i = 0; i < nodes.getLength(); i++) {
    Ciudad ciudad = new Ciudad();
    Element element = (Element) nodes.item(i);

    NodeList name = element.getElementsByTagName("idCiudad");
    Element element2 = (Element) name.item(0);

    ciudad.setIdCiudad(Integer
        .valueOf(getCharacterDataFromElement(element2)));

    NodeList title = element.getElementsByTagName("nomCiudad");
    element2 = (Element) title.item(0);

    ciudad.setNombre(getCharacterDataFromElement(element2));

    ciudades.getPartnerAccount().add(ciudad);
}
}

for (Ciudad ciudad1 : ciudades.getPartnerAccount()) {
System.out.println(ciudad1.getIdCiudad());
System.out.println(ciudad1.getNombre());
}

conn.disconnect();

} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

public static String getCharacterDataFromElement(Element e) {
Node child = e.getFirstChild();
if (child instanceof CharacterData) {
CharacterData cd = (CharacterData) child;
return cd.getData();
}
return "";
}
}

请注意,在示例中我期望的xml结构如下:
<ciudad><idCiudad>1</idCiudad><nomCiudad>BOGOTA</nomCiudad></ciudad>

2

看看Jersey。再次强调,REST关注的是数据。这里有一个教程


1
生产RESTful服务的方法 - NimChimpsky
2
不仅如此,使用Jersey你不仅可以生成RESTful Web服务,还可以消费它们。 - Tudor Zgureanu

1
你可以使用RestTemplate.class在Spring中消费Restful Web服务。
示例:
public class Application {

    public static void main(String args[]) {
        RestTemplate restTemplate = new RestTemplate();
        ResponseEntity<String> call= restTemplate.getForEntity("http://localhost:8080/SpringExample/hello",String.class);
        System.out.println(call.getBody())
    }

}

参考资料


你的 getForEntity 中缺少 String.class。 - Java Main
你的响应实体中没有添加bean类。ResponseEntity<String> call= restTemplate.getForEntity("http://localhost:8080/SpringExample/hello, String.class");由于它是一个字符串响应实体,你应该在.getForEntity的第二个参数中添加bean类String.class。 - Thomas Okonkwo
更新了代码。 - Joby Wilson Mathews
我能在JEE中使用Spring REST Template吗?或者有什么理由不使用它吗? - powder366
1
@powder366 是的,你可以在任何Java项目中使用它,你只需要将依赖项(spring-web)添加到你的项目中即可。 - Joby Wilson Mathews

1

JAX-RS 但您也可以使用标准Java附带的常规DOM


1
从你的问题中并不清楚你是否使用任何框架。对于REST,你将会得到一个WADL文件,而Apache CXF最近增加了对基于WADL的REST服务开发的支持。请查看http://cxf.apache.org/docs/index.html

你的意思是我可以从WADL中获取Java类吗? - Mawia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接