আমি জাভাতে একটি রেস্টস্টুল কল করতে যাচ্ছি। তবে কীভাবে কল করতে হয় তা আমি জানি না। আমার কি ইউআরএল সংযোগ বা অন্যদের ব্যবহার করা দরকার? আমাকে কি কেউ সাহায্য করতে পারবেন. ধন্যবাদ.
আমি জাভাতে একটি রেস্টস্টুল কল করতে যাচ্ছি। তবে কীভাবে কল করতে হয় তা আমি জানি না। আমার কি ইউআরএল সংযোগ বা অন্যদের ব্যবহার করা দরকার? আমাকে কি কেউ সাহায্য করতে পারবেন. ধন্যবাদ.
উত্তর:
যদি আপনি কোনও পরিষেবা সরবরাহকারীর (যেমন ফেসবুক, টুইটার) কোনও রেস্টস্টুল সার্ভিস কল করে থাকেন তবে আপনি এটি আপনার পছন্দের যেকোন স্বাদে করতে পারেন :
আপনি যদি বাহ্যিক লাইব্রেরি ব্যবহার করতে না চান তবে আপনি java.net.HttpURLConnection
বা ব্যবহার করতে পারেনjavax.net.ssl.HttpsURLConnection
(এসএসএলের জন্য), তবে এটি কলটি একটি ফ্যাক্টরি টাইপ প্যাটার্নে এনক্যাপসুলেটেড java.net.URLConnection
। ফলাফলের পেতে, আপনাকে করতে হবে connection.getInputStream()
যা আপনি একটি ফেরৎ InputStream
। তারপরে আপনাকে আপনার ইনপুট স্ট্রিমটিকে স্ট্রিংয়ে রূপান্তর করতে হবে এবং স্ট্রিংটিকে এর প্রতিনিধিত্বমূলক বস্তুতে (যেমন, এক্সএমএল, জেএসএন, ইত্যাদি) পার্স করতে হবে।
বিকল্পভাবে, অ্যাপাচি এইচটিপিপিলেট (সংস্করণ 4 সর্বশেষতম)। এটি জাভা-র ডিফল্টের চেয়ে আরও স্থিতিশীল এবং মজবুত URLConnection
এবং এটি বেশিরভাগ (সমস্ত না থাকলে) এইচটিটিপি প্রোটোকলকে সমর্থন করে (পাশাপাশি এটি স্ট্রাইক মোডে সেট করা যেতে পারে)। আপনার প্রতিক্রিয়া এখনও থাকবে InputStream
এবং আপনি উপরে বর্ণিত হিসাবে এটি ব্যবহার করতে পারেন।
এইচটিপিপি্লায়েন্টে ডকুমেন্টেশন: http://hc.apache.org/httpcomp घা- client-ga/tutorial/html/index.html
flavour
চান তা ব্যবহার করতে পারেন। কেউ URLConnection
চায় ডিফল্ট , কেউ চায় HttpClient
। যেভাবেই হোক, এটি আপনার ব্যবহারের জন্য রয়েছে।
আপডেট: আমি নীচে উত্তরটি লেখার প্রায় 5 বছর হয়ে গেছে; আজ আমি একটি ভিন্ন দৃষ্টিকোণ আছে।
মানুষ যখন REST শব্দটি ব্যবহার করে তখন 99% এর সত্যিকার অর্থে HTTP বোঝায়; তারা ফিল্ডিং দ্বারা চিহ্নিত "রিসোর্স", "উপস্থাপনা", "রাজ্য স্থানান্তর", "ইউনিফর্ম ইন্টারফেস", "হাইপারমিডিয়া" বা অন্য কোনও বাধা বা REST আর্কিটেকচার শৈলীর দিকগুলি সম্পর্কে কম যত্ন নিতে পারে । বিভিন্ন REST ফ্রেমওয়ার্ক দ্বারা সরবরাহিত বিমূর্ততা তাই বিভ্রান্তিকর এবং সাহায্যহীন।
সুতরাং: আপনি ২০১৫ সালে জাভা ব্যবহার করে এইচটিটিপি অনুরোধগুলি প্রেরণ করতে চান You আপনি এমন একটি API চান যা স্পষ্ট, অভিব্যক্তিপূর্ণ, স্বজ্ঞাগত, আইডোমেটিক, সরল। কী ব্যবহার করবেন? আমি আর জাভা ব্যবহার করি না, তবে গত কয়েক বছর ধরে জাভা এইচটিটিপি ক্লায়েন্ট লাইব্রেরি যা সবচেয়ে আশাব্যঞ্জক এবং আকর্ষণীয় বলে মনে হচ্ছে সেটি হ'ল OkHttp । এটা দেখ.
আপনি স্পষ্টভাবে ব্যবহার করে ইন্টারঅ্যাক্ট RESTful ওয়েব পরিষেবাগুলি সঙ্গে করতে পারেন URLConnection
বা HTTPClient কোড HTTP অনুরোধ করতে।
যাইহোক, সাধারণত এটির জন্য ডিজাইন করা একটি সহজ এবং আরও শব্দার্থক এপিআই সরবরাহ করে এমন একটি গ্রন্থাগার বা কাঠামো ব্যবহার করা সাধারণত সাধারণত আরও আকাঙ্ক্ষিত। এটি কোডটি লিখতে, পড়তে এবং ডিবাগ করতে সহজ করে তোলে এবং প্রচেষ্টাটির নকলকে হ্রাস করে। এই ফ্রেমওয়ার্কগুলি সাধারণত কিছু দুর্দান্ত বৈশিষ্ট্য প্রয়োগ করে যা প্রয়োজনীয় স্তরের লাইব্রেরিতে যেমন কন্টেন্ট আলোচনা, ক্যাশিং এবং প্রমাণীকরণের মতো প্রয়োজনীয় বা উপস্থিত হয় না or
সর্বাধিক পরিপক্ক বিকল্পগুলির মধ্যে কয়েকটি হ'ল জার্সি , RESTEasy এবং রেস্টলেট ।
আমি রিসলেট এবং জার্সির সাথে সর্বাধিক পরিচিত, আসুন আমরা কীভাবে POST
উভয় এপিআইয়ের সাথে অনুরোধ করব তা দেখুন ।
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());
}
অবশ্যই, জিইটি অনুরোধগুলি আরও সহজ, এবং আপনি সত্তা ট্যাগ এবং Accept
শিরোনামের মতো জিনিসগুলিও নির্দিষ্ট করতে পারেন তবে আশা করি এই উদাহরণগুলি কার্যকরভাবে অ-তুচ্ছ তবে খুব জটিল নয়।
আপনি দেখতে পাচ্ছেন, রিসলেট এবং জার্সির একই ক্লায়েন্ট API রয়েছে। আমি বিশ্বাস করি যে তারা একই সময়ে গড়ে উঠেছে এবং তাই একে অপরকে প্রভাবিত করেছিল।
আমি রেস্টলেট এপিআইটিকে আরও কিছুটা অর্থপূর্ণ বলে মনে করি এবং তাই আরও পরিষ্কার, তবে ওয়াইএমএমভি।
যেমনটি আমি বলেছিলাম, আমি রিসলেটটির সাথে সর্বাধিক পরিচিত, আমি এটি বহু অ্যাপে বহু বছর ধরে ব্যবহার করেছি এবং আমি এতে খুব খুশি। এটি একটি খুব পরিপক্ক, শক্তিশালী, সহজ, কার্যকর, সক্রিয় এবং ভাল সমর্থিত কাঠামো। আমি জার্সি বা রেস্টস্টাইয়ের সাথে কথা বলতে পারি না, তবে আমার ধারণাটি হ'ল তারা উভয়ই কঠোর পছন্দ।
এটি জাভাতে খুব জটিল, তাই আমি স্প্রিংয়ের RestTemplate
বিমূর্ততাটি ব্যবহার করার পরামর্শ দেব :
String result =
restTemplate.getForObject(
"http://example.com/hotels/{hotel}/bookings/{booking}",
String.class,"42", "21"
);
রেফারেন্স:
RestTemplate
আপনার যদি জাভা থেকে কোনও আরইএসটি পরিষেবাতে কেবল একটি সাধারণ কল করার প্রয়োজন হয় তবে আপনি এই লাইনের সাথে কিছু ব্যবহার করেন
/*
* 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();
}
}
চারপাশে কয়েকটি RESTful API রয়েছে। আমি জার্সিকে সুপারিশ করব;
ক্লায়েন্ট এপিআই ডকুমেন্টেশন এখানে রয়েছে;
https://jersey.java.net/documentation/latest/index.html
নীচের মন্তব্যে ওআউথ ডক্সের জন্য আপডেটের অবস্থানটি একটি মৃত লিঙ্ক এবং https://jersey.java.net/nonav/docamentation/latest/security.html#d0e12334 এ চলে গেছে
পোস্ট জেএসওএন কল দিয়ে একটি রেস্ট ডাব্লুএস কল করে আমি আমার ব্যক্তিগত অভিজ্ঞতাটি ভাগ করতে চাই:
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);
}
}
আপনি সিএক্সএফ চেক আউট করতে পারেন । আপনি জ্যাকস-আরএস নিবন্ধটি দেখতে পারেন এখানে
কলিং এটির মতো সহজ (উদ্ধৃতি):
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();
আসলে এটি "জাভাতে খুব জটিল":
থেকে: https://jersey.java.net/docamentation/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();
সর্বাধিক ইজি সলিউশন অ্যাপাচি HTTP ক্লায়েন্ট লাইব্রেরি ব্যবহার করবে। নিম্নলিখিত নমুনা কোড উল্লেখ করুন .. এই কোডটি প্রমাণীকরণের জন্য প্রাথমিক সুরক্ষা ব্যবহার করে।
নিম্নলিখিত নির্ভরতা যুক্ত করুন।
<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);
আমি অনেক উত্তর দেখতে পাচ্ছি, আমরা ২০২০ ওয়েবক্লিয়েন্টে যা ব্যবহার করছি তা এখানে রয়েছে , এবং বিটিডাব্লিউ রেস্টটেম্পলেট অবমূল্যায়ন করতে চলেছে। (এটি পরীক্ষা করে দেখতে পারেন) রেস্টস্টেম্পলেটটি হ্রাস করা হবে
আপনি Async এইচটিপি ক্লায়েন্ট (লাইব্রেরিটি ওয়েবস্কট প্রোটোকলকে সমর্থন করে ) এর মতো ব্যবহার করতে পারেন :
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();
}