سؤال
مع JSR 311 و تطبيقات لدينا قوية معيار تعريض كائنات جافا via بقية.لكن على جانب العميل يبدو أن هناك شيء مفقود التي هي مماثلة أباتشي محور الصابون - شيء أن يخفي خدمة ويب وحراس البيانات بشفافية العودة إلى كائنات جافا.
كيف يمكنك إنشاء جافا راحة العملاء ؟ باستخدام HTTPConnection ودليل تحليل النتيجة ؟ أو المتخصصة العملاء مثلاجيرسي أو أباتشي CXR?
المحلول
هذا هو السؤال القديم (2008) لذلك هناك العديد من الخيارات أكثر مما كان ثم:
- أباتشي CXF ثلاثة مختلفة بقية العميل خيارات
- جيرسي (المذكورة أعلاه).
- الربيع كما دعا RestTemplate
- المشاع HTTP العميل بناء الخاصة بك لكبار السن جافا مشاريع.
التحديث حوالي عام 2014:
Http المتزامن العميل قبل Sonatype. نينغ http المتزامن العميل.
طفل جديد على الكتلة التي توفر NIO الدعم (على الرغم بصدق أنا لا أعتقد أن هذا يحسن الأداء للعملاء كما يفعل الخوادم).
- Apache HTTP مكونات (4.2) بطلاقة محول - أفضل من القديم العموم HTTP العميل 3 وأسهل في الاستخدام من أجل بناء الخاصة بك راحة العميل.سيكون لديك إلى استخدام شيء من هذا القبيل جاكسون عن سلمان تحليل دعم ويمكنك استخدام HTTP مكونات URIBuilder لبناء الموارد محددات على غرار جيرسي/جاكس-RS بقية العميل.HTTP مكونات يدعم أيضا 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);
لمزيد من المعلومات انظر:
إذا كنت ترغب فقط لاستدعاء خدمة REST وتحليل استجابة يمكنك تجربة الاطمئنان أ >
// Make a GET request to "/lotto"
String json = get("/lotto").asString()
// Parse the JSON response
List<String> winnderIds = with(json).get("lotto.winners.winnerId");
// Make a POST request to "/shopping"
String xml = post("/shopping").andReturn().body().asString()
// Parse the XML
Node category = with(xml).get("shopping.category[0]");
ويمكنك أيضا التحقق من Restlet التي لديها قدرات العميل كامل، أكثر REST المنحى أن المكتبات على مستوى منخفض مثل كما HttpURLConnection أو عميل أباتشي HTTP (التي يمكننا الاستفادة كما الموصلات).
مع أطيب التحيات، جيروم Louvel
هل يمكن أن تحاول رابا . واسمحوا لنا أن نعرف ملاحظاتك عن نفسه. وتتردد في تسجيل القضايا أو الميزات المتوقعة.
ولقد حاولت في الآونة الأخيرة التحديثية مكتبة من ساحة، لها عظيم ويمكنك الاتصال API الراحة الخاصة بك سهل جدا. تكوين أساس الشرح يسمح لنا أن نتخلص من الكثير من لوحة المراجل الترميز.
أود أن أشير إلى 2 المزيد من الخيارات:
- Restfulie, استنادا إلى VRaptor إطار الشبكة ، كل من الخادم و العميل تطبيقات جيدة جدا الفائقة الدعم.
- RESTEasy لديه جاكس-RS الوكيل على أساس العميل التنفيذ.
ويمكنني استخدام أباتشي 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"> الربيع سحابة .
وعلى الرغم من دورته بسيطة لإنشاء عميل 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 "));
}