سؤال

مع JSR 311 و تطبيقات لدينا قوية معيار تعريض كائنات جافا via بقية.لكن على جانب العميل يبدو أن هناك شيء مفقود التي هي مماثلة أباتشي محور الصابون - شيء أن يخفي خدمة ويب وحراس البيانات بشفافية العودة إلى كائنات جافا.

كيف يمكنك إنشاء جافا راحة العملاء ؟ باستخدام HTTPConnection ودليل تحليل النتيجة ؟ أو المتخصصة العملاء مثلاجيرسي أو أباتشي CXR?

هل كانت مفيدة؟

المحلول

هذا هو السؤال القديم (2008) لذلك هناك العديد من الخيارات أكثر مما كان ثم:

التحديث حوالي عام 2014:

طفل جديد على الكتلة التي توفر NIO الدعم (على الرغم بصدق أنا لا أعتقد أن هذا يحسن الأداء للعملاء كما يفعل الخوادم).

تحديث 2016:

  • OkHttp - يدعم أحدث بروتوكولات HTTP (SPDY و HTTP2).يعمل على الروبوت.لسوء الحظ أنها لا نقدم صحيح المفاعل حلقة على أساس المتزامن الخيار (انظر نينغ HTTP المكونات أعلاه).ومع ذلك إذا كنت تستخدم أحدث HTTP2 البروتوكول هذا هو أقل من مشكلة (على افتراض اتصال العد هو المشكلة).
  • التحديثية - لصناعة السيارات إنشاء العملاء على أساس واجهة بذرة مماثلة لبعض جيرسي CXF امتداد.يستخدم OkHttp.
  • أباتشي HttpComponents 5 المفترض يكون HTTP2 الدعم

التحذير على التقاط HTTP/بقية العملاء.تأكد من تحقق ما الإطار المكدس باستخدام عميل HTTP, كيف خيوط, والأفضل استخدام نفس العميل إذا كان يقدم واحدة.هذا إذا كان استخدام شيء من هذا القبيل Vert.x أو اللعب قد تحتاج إلى محاولة استخدام دعمه العميل للمشاركة في أي حافلة أو مفاعل حلقة يوفر الإطار...وإلا تكون مستعدة ربما للاهتمام خيوط القضايا.

نصائح أخرى

وكما ذكرت في هذا الموضوع أنا أميل إلى استخدام <أ href ل = "http://jersey.java.net/" يختلط = "نوفولو noreferrer"> جيرسي الذي ينفذ JAX-RS، وتأتي مع العميل REST لطيفة. الشيء الجميل هو إذا قمت بتطبيق الموارد مريحة باستخدام JAX-RS ثم العميل جيرسي يمكن إعادة استخدام مقدمي كيان مثل لJAXB / XML / JSON / اتوم وهكذا دواليك - حتى تتمكن من إعادة استخدام نفس الكائنات على جانب الخادم كما كنت استخدامها في اختبار وحدة جانب العميل.

وعلى سبيل المثال <لأ href = "http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-rest/src/test/java/org/apache/camel/rest/resources/ EndpointsTest.java؟revision=700513&view=markup "يختلط =" نوفولو noreferrer "> هنا هو حالة وحدة اختبار من في اباتشي الجمل مشروع الذي تتطلع حمولات XML من مورد مريحة (باستخدام نقاط النهاية كائن JAXB). يتم تعريف (أوري) طريقة الموارد في <لأ href = "http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-rest/src/test/java/org/apache/camel/ بقية / موارد / TestSupport.java؟ المراجعة = 700513 وجهة نظر = العلامات "يختلط =" نوفولو noreferrer "> هذه الفئة الأساسية الذي يستخدم فقط API العميل جيرسي.

ومنها مثلا.

    clientConfig = new DefaultClientConfig();
    client = Client.create(clientConfig);

    resource = client.resource("http://localhost:8080");
    // lets get the XML as a String
    String text = resource("foo").accept("application/xml").get(String.class);        

وبالمناسبة أتمنى أن النسخة المقبلة من JAX-RS إضافة API جانب العميل لطيف على غرار واحد في جيرسي

يمكنك استخدام واجهات برمجة التطبيقات جافا SE:

private void updateCustomer(Customer customer) { 
    try { 
        URL url = new URL("http://www.example.com/customers"); 
        HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
        connection.setDoOutput(true); 
        connection.setInstanceFollowRedirects(false); 
        connection.setRequestMethod("PUT"); 
        connection.setRequestProperty("Content-Type", "application/xml"); 

        OutputStream os = connection.getOutputStream(); 
        jaxbContext.createMarshaller().marshal(customer, os); 
        os.flush(); 

        connection.getResponseCode(); 
        connection.disconnect(); 
    } catch(Exception e) { 
        throw new RuntimeException(e); 
    } 
} 

أو يمكنك استخدام بقية العميل واجهات برمجة التطبيقات التي توفرها جاكس-RS تطبيقات مثل جيرسي.واجهات برمجة التطبيقات هذه هي أسهل للاستخدام ، ولكن تتطلب إضافية الجرار على مسار الفئة.

WebResource resource = client.resource("http://www.example.com/customers"); 
ClientResponse response = resource.type("application/xml");).put(ClientResponse.class, "<customer>...</customer."); 
System.out.println(response); 

لمزيد من المعلومات انظر:

ويمكنك أيضا التحقق من Restlet التي لديها قدرات العميل كامل، أكثر REST المنحى أن المكتبات على مستوى منخفض مثل كما HttpURLConnection أو عميل أباتشي HTTP (التي يمكننا الاستفادة كما الموصلات).

مع أطيب التحيات، جيروم Louvel

هل يمكن أن تحاول رابا . واسمحوا لنا أن نعرف ملاحظاتك عن نفسه. وتتردد في تسجيل القضايا أو الميزات المتوقعة.

ولقد حاولت في الآونة الأخيرة التحديثية مكتبة من ساحة، لها عظيم ويمكنك الاتصال API الراحة الخاصة بك سهل جدا. تكوين أساس الشرح يسمح لنا أن نتخلص من الكثير من لوحة المراجل الترميز.

أود أن أشير إلى 2 المزيد من الخيارات:

ويمكنني استخدام أباتشي HttpClient وإصلاحه للتعامل مع جميع الجانب HTTP من الأشياء.

وأنا أكتب موزعي SAX XML عن محتوى XML الذي يوزع XML إلى نموذج الكائن. وأعتقد أن Axis2 أيضا الكشف XML -> طرق النموذجي (المحور 1 اختبأ هذا الجزء، مزعج). مولدات XML بسيطة مسلي.

وأنها لا تستغرق وقتا طويلا إلى رمز، وغير فعالة جدا، في رأيي.

OkHttp خفيفة الوزن وقوية عندما جنبا إلى جنب مع التحديثية أيضا.هذا يعمل بشكل جيد العامة جافا استخدام وكذلك على الروبوت.

OkHttp: http://square.github.io/okhttp/

public static final MediaType JSON
    = MediaType.parse("application/json; charset=utf-8");

OkHttpClient client = new OkHttpClient();

String post(String url, String json) throws IOException {
  RequestBody body = RequestBody.create(JSON, json);
  Request request = new Request.Builder()
      .url(url)
      .post(body)
      .build();
  Response response = client.newCall(request).execute();
  return response.body().string();
}

التحديثية: http://square.github.io/retrofit/

public interface GitHubService {
  @GET("/users/{user}/repos")
  Call<List<Repo>> listRepos(@Path("user") String user);
}

وحاول JdkRequest من jcabi-HTTP (وأنا المطور). هذه هي الطريقة التي يعمل:

String body = new JdkRequest("http://www.google.com")
  .header("User-Agent", "it's me")
  .fetch()
  .body()

وتحقق هذا بلوق وظيفة لمزيد من التفاصيل: HTTP: // www.yegor256.com/2014/04/11/jcabi-http-intro.html

وبما أن لا أحد المذكورة، وهنا هو آخر واحد: اختلق ، الذي يستخدم من قبل <أ href ل = "https://cloud.spring.io/spring-cloud-openfeign/" يختلط = "نوفولو noreferrer"> الربيع سحابة .

لبعض الوقت الآن، لقد تم استخدام Resty :

وJSONResource jsonResource = new Resty().json(uri);

ويمكن للمرء أن يجد بعض الأمثلة هنا .

وعلى الرغم من دورته بسيطة لإنشاء عميل HTTP وجعل reuest. ولكن إذا كنت ترغب في الاستفادة من بعض العملاء تم إنشاؤها تلقائيا، يمكنك الاستفادة من WADL لوصف وإنشاء تعليمات برمجية.

ويمكنك استخدام RestDescribe لتوليد وتجميع WSDL، يمكنك توليد عملاء في بي، روبي، بيثون، جافا وC # باستخدام هذا. فهو يولد شفرة نظيفة ويكون هناك تغيير الجيدة التي لديك لقرص عليه قليلا بعد جيل الرمز، يمكنك العثور على وثائق جيدة والأفكار الكامنة وراء أداة <لأ href = "https://docs.google.com/document/ تعديل؟ ID = 1uydmzsDFIiw8OsoMdk5v_s1VW7wrujUmGdUU2zge0fs "يختلط =" نوفولو "> هنا .

وهناك عدد قليل للاهتمام ومفيدة أدوات WADL المذكورة على wintermute.

وكتبت مكتبة خرائط واجهة جافا لخدمة JSON REST بعد:

https://github.com/ggeorgovassilis/spring-rest-invoker

public interface BookService {
   @RequestMapping("/volumes")
   QueryResult findBooksByTitle(@RequestParam("q") String q);

   @RequestMapping("/volumes/{id}")
   Item findBookById(@PathVariable("id") String id);
}

وحاول تبحث في http-بقية العميل

https://github.com/g00dnatur3/http-rest-client

وهنا مثال بسيط:

RestClient client = RestClient.builder().build();
String geocoderUrl = "http://maps.googleapis.com/maps/api/geocode/json"
Map<String, String> params = Maps.newHashMap();
params.put("address", "beverly hills 90210");
params.put("sensor", "false");
JsonNode node = client.get(geocoderUrl, params, JsonNode.class);

والمكتبة تهتم التسلسل سلمان وملزمة بالنسبة لك.

وهنا مثال آخر،

RestClient client = RestClient.builder().build();
String url = ...
Person person = ...
Header header = client.create(url, person);
if (header != null) System.out.println("Location header is:" + header.value());

والمثال الأخير واحد،

RestClient client = RestClient.builder().build();
String url = ...
Person person = client.get(url, null, Person.class); //no queryParams

وهتاف!

وأمثلة جيرسي عميل الراحة:
إضافة التبعية:

         <!-- jersey -->
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-json</artifactId>
        <version>1.8</version>
    </dependency>
   <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-server</artifactId>
        <version>1.8</version>
    </dependency>

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-client</artifactId>
    <version>1.8</version>
</dependency>

    <dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20090211</version>
</dependency>

وForGetMethod وتمرير اثنين المعلمة:

          Client client = Client.create();
           WebResource webResource1 = client
                        .resource("http://localhost:10102/NewsTickerServices/AddGroup/"
                                + userN + "/" + groupName);

                ClientResponse response1 = webResource1.get(ClientResponse.class);
                System.out.println("responser is" + response1);

وGetMethod تمرير معلمة واحدة والحصول على RESPONE من قائمة:

       Client client = Client.create();

        WebResource webResource1 = client
                    .resource("http://localhost:10102/NewsTickerServices/GetAssignedUser/"+grpName);    
    //value changed
    String response1 = webResource1.type(MediaType.APPLICATION_JSON).get(String.class);

    List <String > Assignedlist =new ArrayList<String>();
     JSONArray jsonArr2 =new JSONArray(response1);
    for (int i =0;i<jsonArr2.length();i++){

        Assignedlist.add(jsonArr2.getString(i));    
    }

في فوقه إرجاع قائمة التي نحن نتقبل باعتبارها قائمة ومن ثم تحويله إلى JSON صفيف ثم JSON صفيف إلى القائمة.

إذا طلب المشاركة تمرير كائن JSON كما المعلمة:

   Client client = Client.create();
    WebResource webResource = client
            .resource("http://localhost:10102/NewsTickerServices/CreateJUser");
    // value added

    ClientResponse response = webResource.type(MediaType.APPLICATION_JSON).post(ClientResponse.class,mapper.writeValueAsString(user));

    if (response.getStatus() == 500) {

        context.addMessage(null, new FacesMessage("User already exist "));
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top