Java ile RESTful arama yapacağım. Ancak, nasıl çağrı yapacağımı bilmiyorum. URLConnection veya diğerlerini kullanmam gerekir mi? Biri bana yardım edebilir mi. teşekkür ederim.
Java ile RESTful arama yapacağım. Ancak, nasıl çağrı yapacağımı bilmiyorum. URLConnection veya diğerlerini kullanmam gerekir mi? Biri bana yardım edebilir mi. teşekkür ederim.
Yanıtlar:
Bir Servis Sağlayıcıdan (örneğin Facebook, Twitter) bir RESTful servisi arıyorsanız, istediğiniz herhangi bir lezzetle yapabilirsiniz:
Harici kütüphaneler kullanmak istemiyorsanız, java.net.HttpURLConnection
veya javax.net.ssl.HttpsURLConnection
(SSL için) kullanabilirsiniz, ancak bu, içinde bir Fabrika türü modelinde kapsüllenmiş çağrıdır java.net.URLConnection
. Sonucu almak için size connection.getInputStream()
hangisini döndürür InputStream
. Daha sonra giriş akışınızı dizeye dönüştürmeniz ve dizeyi temsili nesnesine (ör. XML, JSON, vb.) Ayrıştırmanız gerekir.
Alternatif olarak, Apache HttpClient (sürüm 4 en son sürümdür). Java'nın varsayılanından daha kararlı ve sağlamdır URLConnection
ve çoğu (hepsi değilse de) HTTP protokolünü destekler (ayrıca Sıkı moda ayarlanabilir). Yanıtınız hala burada olacak InputStream
ve yukarıda belirtildiği gibi kullanabilirsiniz.
HttpClient ile ilgili belgeler: http://hc.apache.org/httpcomponents-client-ga/tutorial/html/index.html
flavour
istersen kullanabilirsin . Bazıları varsayılanı URLConnection
, bazıları ister HttpClient
. Her iki durumda da, kullanmanız için orada.
Güncelleme: Aşağıdaki cevabı yazdığımdan bu yana neredeyse 5 yıl geçti; bugün farklı bir bakış açım var.
İnsanların REST terimini kullandıkları zamanın% 99'u gerçekten HTTP anlamına gelir; “kaynaklar”, “temsiller”, “devlet transferleri”, “tekdüze arayüzler”, “hipermedya” ya da Fielding tarafından tanımlanan REST mimari stilinin diğer kısıtlamaları veya yönleri hakkında daha az önem verebilirlerdi . Bu nedenle, çeşitli REST çerçeveleri tarafından sağlanan soyutlamalar kafa karıştırıcı ve yararsızdır.
Yani: 2015 yılında Java kullanarak HTTP istekleri göndermek istiyorsunuz. Açık, etkileyici, sezgisel, deyimsel, basit bir API istiyorsunuz. Ne kullanılır? Artık Java kullanmıyorum, ancak son birkaç yıldır en umut verici ve ilginç görünen Java HTTP istemci kütüphanesi OkHttp . Bunu kontrol et.
HTTP isteklerini kodlamak için RESTful web hizmetleriyle URLConnection
veya HTTPClient kullanarak kesinlikle etkileşimde bulunabilirsiniz .
Bununla birlikte, bu amaç için özel olarak tasarlanmış daha basit ve daha anlamsal bir API sağlayan bir kütüphane veya çerçeve kullanılması genellikle daha arzu edilir. Bu, kodun yazılmasını, okunmasını ve hata ayıklanmasını kolaylaştırır ve eforun tekrarlanmasını azaltır. Bu çerçeveler genellikle içerik anlaşması, önbelleğe alma ve kimlik doğrulama gibi alt düzey kitaplıklarda bulunması veya kullanılması kolay olmayan bazı harika özellikler uygular.
En olgun seçeneklerden bazıları Jersey , RESTEasy ve Restlet'dir .
Restlet ve Jersey hakkında en fazla bilgi sahibi olduğumdan, POST
her iki API ile nasıl istekte bulunacağımıza bakalım .
Form form = new Form();
form.add("x", "foo");
form.add("y", "bar");
Client client = ClientBuilder.newClient();
WebTarget resource = client.target("http://localhost:8080/someresource");
Builder request = resource.request();
request.accept(MediaType.APPLICATION_JSON);
Response response = request.get();
if (response.getStatusInfo().getFamily() == Family.SUCCESSFUL) {
System.out.println("Success! " + response.getStatus());
System.out.println(response.getEntity());
} else {
System.out.println("ERROR! " + response.getStatus());
System.out.println(response.getEntity());
}
Form form = new Form();
form.add("x", "foo");
form.add("y", "bar");
ClientResource resource = new ClientResource("http://localhost:8080/someresource");
Response response = resource.post(form.getWebRepresentation());
if (response.getStatus().isSuccess()) {
System.out.println("Success! " + response.getStatus());
System.out.println(response.getEntity().getText());
} else {
System.out.println("ERROR! " + response.getStatus());
System.out.println(response.getEntity().getText());
}
Elbette, GET istekleri daha da basittir ve ayrıca varlık etiketleri ve Accept
başlıkları gibi şeyleri de belirtebilirsiniz , ancak umarım bu örnekler yararlı değildir, ancak çok karmaşık değildir.
Gördüğünüz gibi Restlet ve Jersey benzer istemci API'larına sahip. Aynı zamanda geliştiklerine ve dolayısıyla birbirlerini etkilediğine inanıyorum.
Restlet API'sini biraz daha semantik ve dolayısıyla biraz daha net, ama YMMV olarak buluyorum.
Dediğim gibi, Restlet'i en iyi biliyorum, yıllarca birçok uygulamada kullandım ve bundan çok memnunum. Çok olgun, sağlam, basit, etkili, aktif ve iyi desteklenen bir çerçevedir. Jersey veya RESTEasy ile konuşamam, ama benim izlenimim ikisi de sağlam seçimler.
Java'da bu çok karmaşık, bu yüzden Spring'in RestTemplate
soyutlamasını kullanmanızı öneririm :
String result =
restTemplate.getForObject(
"http://example.com/hotels/{hotel}/bookings/{booking}",
String.class,"42", "21"
);
Referans:
RestTemplate
Java'dan bir REST servisine basit bir çağrı yapmanız gerekiyorsa, bu hat boyunca bir şey kullanırsınız
/*
* Stolen from http://xml.nig.ac.jp/tutorial/rest/index.html
* and http://www.dr-chuck.com/csev-blog/2007/09/calling-rest-web-services-from-java/
*/
import java.io.*;
import java.net.*;
public class Rest {
public static void main(String[] args) throws IOException {
URL url = new URL(INSERT_HERE_YOUR_URL);
String query = INSERT_HERE_YOUR_URL_PARAMETERS;
//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()));
String l = null;
while ((l=br.readLine())!=null) {
System.out.println(l);
}
br.close();
}
}
Çevresinde birkaç RESTful API var. Jersey tavsiye ederim;
İstemci API dokümanları burada;
https://jersey.java.net/documentation/latest/index.html
Aşağıdaki yorumdaki OAuth dokümanlarının Konumunu Güncelle ölü bir bağlantıdır ve https://jersey.java.net/nonav/documentation/latest/security.html#d0e12334 adresine taşındı
Post JSON çağrısı ile bir REST WS'yi çağırarak kişisel deneyimimi paylaşmak istiyorum:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.URL;
import java.net.URLConnection;
public class HWS {
public static void main(String[] args) throws IOException {
URL url = new URL("INSERT YOUR SERVER REQUEST");
//Insert your JSON query request
String query = "{'PARAM1': 'VALUE','PARAM2': 'VALUE','PARAM3': 'VALUE','PARAM4': 'VALUE'}";
//It change the apostrophe char to double colon char, to form a correct JSON string
query=query.replace("'", "\"");
try{
//make connection
URLConnection urlc = url.openConnection();
//It Content Type is so importan to support JSON call
urlc.setRequestProperty("Content-Type", "application/xml");
Msj("Conectando: " + url.toString());
//use post mode
urlc.setDoOutput(true);
urlc.setAllowUserInteraction(false);
//send query
PrintStream ps = new PrintStream(urlc.getOutputStream());
ps.print(query);
Msj("Consulta: " + query);
ps.close();
//get result
BufferedReader br = new BufferedReader(new InputStreamReader(urlc.getInputStream()));
String l = null;
while ((l=br.readLine())!=null) {
Msj(l);
}
br.close();
} catch (Exception e){
Msj("Error ocurrido");
Msj(e.toString());
}
}
private static void Msj(String texto){
System.out.println(texto);
}
}
CXF'yi kontrol edebilirsiniz . JAX-RS Makalesini buradan ziyaret edebilirsiniz
Aramak bu kadar basit (alıntı):
BookStore store = JAXRSClientFactory.create("http://bookstore.com", BookStore.class);
// (1) remote GET call to http://bookstore.com/bookstore
Books books = store.getAllBooks();
// (2) no remote call
BookResource subresource = store.getBookSubresource(1);
// {3} remote GET call to http://bookstore.com/bookstore/1
Book b = subresource.getDescription();
Aslında, bu "Java'da çok karmaşıktır":
Gönderen: https://jersey.java.net/documentation/latest/client.html
Client client = ClientBuilder.newClient();
WebTarget target = client.target("http://foo").path("bar");
Invocation.Builder invocationBuilder = target.request(MediaType.TEXT_PLAIN_TYPE);
Response response = invocationBuilder.get();
En Kolay Çözüm Apache http istemci kitaplığını kullanacaktır. aşağıdaki örnek kodu inceleyin .. bu kod kimlik doğrulaması için temel güvenliği kullanır.
Aşağıdaki Bağımlılığı ekleyin.
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.4</version> </dependency>
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
Credentials credentials = new UsernamePasswordCredentials("username", "password");
credentialsProvider.setCredentials(AuthScope.ANY, credentials);
HttpClient client = HttpClientBuilder.create().setDefaultCredentialsProvider(credentialsProvider).build();
HttpPost request = new HttpPost("https://api.plivo.com/v1/Account/MAYNJ3OT/Message/");HttpResponse response = client.execute(request);
// Get the response
BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
String line = "";
while ((line = rd.readLine()) != null) {
textView = textView + line;
}
System.out.println(textView);
Birçok cevap görüyorum, 2020 WebClient'te kullandığımız şey ve BTW RestTemplate kullanımdan kaldırılacak. (bunu kontrol edebilir) RestTemplate kullanımdan kaldırılacak
Sen kullanabilirsiniz uyumsuz HTTP Client (kütüphane de destekler WebSocket Protokolü) gibi:
String clientChannel = UriBuilder.fromPath("http://localhost:8080/api/{id}").build(id).toString();
try (AsyncHttpClient asyncHttpClient = new AsyncHttpClient())
{
BoundRequestBuilder postRequest = asyncHttpClient.preparePost(clientChannel);
postRequest.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON);
postRequest.setBody(message.toString()); // returns JSON
postRequest.execute().get();
}