জাভাতে বিশ্রামের কল


150

আমি জাভাতে একটি রেস্টস্টুল কল করতে যাচ্ছি। তবে কীভাবে কল করতে হয় তা আমি জানি না। আমার কি ইউআরএল সংযোগ বা অন্যদের ব্যবহার করা দরকার? আমাকে কি কেউ সাহায্য করতে পারবেন. ধন্যবাদ.


এটি নির্ভর করে আপনি কীভাবে আপনার অ্যাপ্লিকেশনে বিশ্রাম কল করবেন। আপনি কি একটি JaxRS বাস্তবায়ন ব্যবহার করেন? একটি বিশেষ এক? আপনি কি ম্যানুয়ালি অনুরোধ করছেন?
কলিন হবার্ট

@ কলিন হবার্ট, আপনার উত্তরের জন্য আপনাকে ধন্যবাদ তবে আমার কাছে বিশ্রামের কল সম্পর্কে কোনও ধারণা নেই। আপনি কি আমাকে বিশ্রামের কলের বিভিন্ন অংশ সম্পর্কে আরও তথ্য দিতে পারেন?
প্রশ্নগুলি

চেকআউট এইচটিপি এইচএসএফ ক্লায়েন্ট এখানে ক্লিক করুন
গৌরব জে

উত্তর:


91

যদি আপনি কোনও পরিষেবা সরবরাহকারীর (যেমন ফেসবুক, টুইটার) কোনও রেস্টস্টুল সার্ভিস কল করে থাকেন তবে আপনি এটি আপনার পছন্দের যেকোন স্বাদে করতে পারেন :

আপনি যদি বাহ্যিক লাইব্রেরি ব্যবহার করতে না চান তবে আপনি 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


5
চাকাটি পুনরায় উদ্ভাবন করবেন না, বিদ্যমান RESTful বাস্তবায়নগুলির মধ্যে একটি ব্যবহার করুন।
কিওয়ারকি

13
এটি চাকাটি পুনর্নবীকরণ করছে না, আমি বলছি আপনি যা flavourচান তা ব্যবহার করতে পারেন। কেউ URLConnectionচায় ডিফল্ট , কেউ চায় HttpClient। যেভাবেই হোক, এটি আপনার ব্যবহারের জন্য রয়েছে।
বুহাকে সিন্ধি

@ এলিট জেন্টলম্যান, আপনার জবাবের জন্য আপনাকে ধন্যবাদ। লাইব্রেরির সমস্তটি যাচাই করার পরে, আমি অ্যাপাচি এইচটিপিপিলেট ব্যবহার করতে চাই, আপনি কি এই সম্পর্কে আরও রেফারেন্স দিতে আপত্তি করবেন?
প্রশ্নগুলি

@ প্রশ্নগুলি, এইচটিপিপিলেট 4 টি উদাহরণের লিঙ্কটি নষ্ট হয়ে গেছে বলে মনে হচ্ছে, সুতরাং আপনার যদি কোনও প্রশ্ন থাকে (শঙ্কিত উদ্দেশ্য ... লোল), আমাকে জানাবেন .... আমি প্রায় প্রতিদিনই এটি মোকাবিলা করি।
বুহাকে সিন্ধি

এই ক্লাসগুলি কীভাবে তাদের অস্তিত্বের দিকে লক্ষ্য রাখার চেয়ে ব্যবহার করা যায় তার উদাহরণ কোডটি দেখান
জোনাথন

150

আপডেট: আমি নীচে উত্তরটি লেখার প্রায় 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 রয়েছে। আমি বিশ্বাস করি যে তারা একই সময়ে গড়ে উঠেছে এবং তাই একে অপরকে প্রভাবিত করেছিল।

আমি রেস্টলেট এপিআইটিকে আরও কিছুটা অর্থপূর্ণ বলে মনে করি এবং তাই আরও পরিষ্কার, তবে ওয়াইএমএমভি।

যেমনটি আমি বলেছিলাম, আমি রিসলেটটির সাথে সর্বাধিক পরিচিত, আমি এটি বহু অ্যাপে বহু বছর ধরে ব্যবহার করেছি এবং আমি এতে খুব খুশি। এটি একটি খুব পরিপক্ক, শক্তিশালী, সহজ, কার্যকর, সক্রিয় এবং ভাল সমর্থিত কাঠামো। আমি জার্সি বা রেস্টস্টাইয়ের সাথে কথা বলতে পারি না, তবে আমার ধারণাটি হ'ল তারা উভয়ই কঠোর পছন্দ।


2
তবে এখনও একটি দুর্দান্ত পোস্ট। এবং আমাকে "99% সময়ের সাথে লোকেরা যখন REST শব্দটি ব্যবহার করে, তাদের সত্যই HTTP বোঝায়;
আলেকসডি

2
আপনার জার্সির উদাহরণে, ফর্ম অবজেক্টটি কোথায় / কীভাবে ব্যবহার হয়? এটি তৈরি করা হয়েছে, তবে উদাহরণে এটি কিছু যুক্ত করার মত দেখাচ্ছে না।
splungebob

29

এটি জাভাতে খুব জটিল, তাই আমি স্প্রিংয়ের RestTemplateবিমূর্ততাটি ব্যবহার করার পরামর্শ দেব :

String result = 
restTemplate.getForObject(
    "http://example.com/hotels/{hotel}/bookings/{booking}",
    String.class,"42", "21"
);

রেফারেন্স:


24

আপনার যদি জাভা থেকে কোনও আরইএসটি পরিষেবাতে কেবল একটি সাধারণ কল করার প্রয়োজন হয় তবে আপনি এই লাইনের সাথে কিছু ব্যবহার করেন

/*
 * 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();
    }
}

1
আশেপাশে কিছু সত্যিই ভাল REST এপিআই রয়েছে, আমি চাকাটি পুনরায় উদ্ভাবনের পরিবর্তে একটি ব্যবহার করার পরামর্শ দেব।
কিওয়ারকি

যেমনটি আমি বলেছি: জাহান্নামের মতো জটিল। (না, আমি এটিকে কম করে দেখিনি, এটি একটি সম্পূর্ণ বৈধ সমাধান)
সান প্যাট্রিক ফ্লয়েড

4
@ কিওয়ারকি ক্লায়েন্ট সাইডের এপিআই লাইব্রেরিগুলি সাধারণত REST সীমাবদ্ধতার লঙ্ঘন। তারা অনেক বেশি মিলনের পরিচয় দেয়। দীর্ঘমেয়াদে একটি ভাল এইচটিটিপি লাইব্রেরি ব্যবহার করা আরও ভাল বিকল্প।
ড্যারেল মিলার

10

চারপাশে কয়েকটি RESTful API রয়েছে। আমি জার্সিকে সুপারিশ করব;

https://jersey.java.net/

ক্লায়েন্ট এপিআই ডকুমেন্টেশন এখানে রয়েছে;

https://jersey.java.net/documentation/latest/index.html


নীচের মন্তব্যে ওআউথ ডক্সের জন্য আপডেটের অবস্থানটি একটি মৃত লিঙ্ক এবং https://jersey.java.net/nonav/docamentation/latest/security.html#d0e12334 এ চলে গেছে


6
ওপি একটি আরএসএফুল অ্যাপ্লিকেশন তৈরি করছে না, তিনি আরএসটিফুল কল করছে, যেমন টুইটারের এপিআই পদ্ধতির সংস্থান আহ্বানের মতো।
বুহাকে সিন্ধি

@ কিওয়ারকি - আমি মনে করি আপনি জার্সিকে আপনার উত্তরে কেন সুপারিশ করবেন তা অন্তর্ভুক্ত করা সহায়ক হবে।
ড্যানি বুলিস

7

পোস্ট জেএসওএন কল দিয়ে একটি রেস্ট ডাব্লুএস কল করে আমি আমার ব্যক্তিগত অভিজ্ঞতাটি ভাগ করতে চাই:

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);
    }
}

5

আপনি সিএক্সএফ চেক আউট করতে পারেন । আপনি জ্যাকস-আরএস নিবন্ধটি দেখতে পারেন এখানে

কলিং এটির মতো সহজ (উদ্ধৃতি):

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();

5

আসলে এটি "জাভাতে খুব জটিল":

থেকে: 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();

4

সর্বাধিক ইজি সলিউশন অ্যাপাচি 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);

1

আমি অনেক উত্তর দেখতে পাচ্ছি, আমরা ২০২০ ওয়েবক্লিয়েন্টে যা ব্যবহার করছি তা এখানে রয়েছে , এবং বিটিডাব্লিউ রেস্টটেম্পলেট অবমূল্যায়ন করতে চলেছে। (এটি পরীক্ষা করে দেখতে পারেন) রেস্টস্টেম্পলেটটি হ্রাস করা হবে


লিঙ্ক সরবরাহ করার পরিবর্তে আপনি এখানে ব্যাখ্যা যুক্ত করতে পারেন?
কিশান ভরদা

-1

আপনি 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();
    }

এটি কাজ করে না (ASyncHttpClient ইনস্ট্যান্স করতে পারে না)।
জাভা মেইন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.