مثال Spring RestTemplate

توفر Spring RestTemplate طريقة ملائمة لاختبار خدمات الويب RESTful.

Spring RestTemplate

  • فئة Spring RestTemplate هي جزء من spring-web، المُقدمة في Spring 3.
  • يمكننا استخدام RestTemplate لاختبار خدمات الويب القائمة على بروتوكول HTTP، ولا يدعم بروتوكول HTTPS.
  • توفر فئة RestTemplate طرقًا متعددة الحمولة لطرق HTTP المختلفة، مثل GET و POST و PUT و DELETE وما إلى ذلك.

مثال Spring RestTemplate

دعونا نلقي نظرة على مثال Spring RestTemplate حيث سنختبر خدمات الويب REST التي تم إنشاؤها في المقالة Spring Data JPA. الجدول أدناه يوضح عناوين URI المدعومة بواسطة خدمة الويب الراحة هذه. .tg {border-collapse:collapse;border-spacing:0;border-color:#999;} .tg td{font-family:Arial, sans-serif;font-size:14px;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:#999;color:#444;background-color:#F7FDFA;} .tg th{font-family:Arial, sans-serif;font-size:14px;font-weight:normal;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:#999;color:#fff;background-color:#26ADE4;} .tg .tg-baqh{text-align:center;vertical-align:top} .tg .tg-yw4l{vertical-align:top}

URI HTTP Method Description
/springData/person GET Get all persons from database
/springData/person/{id} GET Get person by id
/springData/person POST Add person to database
/springData/person PUT Update person
/springData/person/{id} DELETE Delete person by id

لنبدأ في إنشاء مشروع عميل Rest لاختبار هذه الخدمات الويب. الصورة أدناه تظهر مشروعنا النهائي لمثال Spring RestTemplate.

تبعيات Maven لـ Spring RestTemplate

نحن بحاجة إلى تبعيات spring-core و spring-context لـ إطار الربيع. ثم نحتاج إلى فناجين spring-web التي تحتوي على فئة RestTemplate. نحن أيضًا بحاجة إلى jackson-mapper-asl لدعم JSON في الربيع من خلال API جاكسون.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="https://maven.apache.org/POM/4.0.0" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.journaldev.spring</groupId>
	<artifactId>SpringRestTemplate</artifactId>
	<version>1.0-SNAPSHOT</version>
	<properties>
		<spring.framework>4.3.0.RELEASE</spring.framework>
		<spring.web>3.0.2.RELEASE</spring.web>
		<serializer.version>2.8.1</serializer.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>${spring.framework}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${spring.framework}</version>
		</dependency>
		<dependency>
			<groupId>org.codehaus.jackson</groupId>
			<artifactId>jackson-mapper-asl</artifactId>
			<version>1.9.4</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>${spring.web}</version>
		</dependency>
	</dependencies>
</project>

فئة تكوين الربيع

علينا تعريف فاصل الربيع لفئة RestTemplate ، وهذا يتم في فئة AppConfig.

package com.journaldev.spring.config;

import org.codehaus.jackson.map.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.MappingJacksonHttpMessageConverter;
import org.springframework.web.client.RestTemplate;

@Configuration
@ComponentScan("com.journaldev.spring")
public class AppConfig {

	@Bean
	RestTemplate restTemplate() {
		RestTemplate restTemplate = new RestTemplate();
		MappingJacksonHttpMessageConverter converter = new MappingJacksonHttpMessageConverter();
		converter.setObjectMapper(new ObjectMapper());
		restTemplate.getMessageConverters().add(converter);
		return restTemplate;
	}
}

يرجى ملاحظة أن RestTamplate يستخدم MessageConverter ونحن بحاجة إلى تعيين هذا الخاصية في فاصل RestTemplate. في مثالنا ، نستخدم MappingJacksonHttpMessageConverter لاسترجاع البيانات من تنسيق JSON.

فئة النموذج

منذ أن نحاول تحويل JSON العائدة من خدمة الويب الخاصة بنا إلى كائن Java باستخدام محرر jackson، يتعين علينا إنشاء فئة النموذج لهذا. لاحظ أن فئة النموذج هذه ستكون مشابهة للغاية لفئة النموذج المستخدمة في خدمة الويب، باستثناء أننا لا نحتاج هنا إلى تسميات JPA.

package com.journaldev.spring.model;

public class Person {

	private Long id;

	private Integer age;

	private String firstName;

	private String lastName;

	public Person() {
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

	public String getFirstName() {
		return firstName;
	}

	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}

	public String getLastName() {
		return lastName;
	}

	public void setLastName(String lastName) {
		this.lastName = lastName;
	}

	@Override
	public String toString() {
		return "Person{" + "id=" + id + ", age=" + age + ", firstName='" + firstName + '\'' + ", lastName='" + lastName
				+ '\'' + '}';
	}
}

فئة عميل Spring RestTemplate

الخطوة النهائية هي إنشاء فئات العميل التي ستستخدم الحبوب RestTemplate المحددة أعلاه.

package com.journaldev.spring.config;

import java.util.List;

import org.springframework.http.HttpStatus;

import com.journaldev.spring.model.Person;

public interface PersonClient {
	List<Person> getAllPerson();

	Person getById(Long id);

	HttpStatus addPerson(Person person);

	void updatePerson(Person person);

	void deletePerson(Long id);
}
package com.journaldev.spring.config;

import java.util.Arrays;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import com.journaldev.spring.model.Person;

@Service
public class PersonClientImpl implements PersonClient {

	@Autowired
	RestTemplate restTemplate;

	final String ROOT_URI = "https://localhost:8080/springData/person";

	public List<Person> getAllPerson() {
		ResponseEntity<Person[]> response = restTemplate.getForEntity(ROOT_URI, Person[].class);
		return Arrays.asList(response.getBody());

	}

	public Person getById(Long id) {
		ResponseEntity<Person> response = restTemplate.getForEntity(ROOT_URI + "/"+id, Person.class);
		return response.getBody();
	}

	public HttpStatus addPerson(Person person) {
		ResponseEntity<HttpStatus> response = restTemplate.postForEntity(ROOT_URI, person, HttpStatus.class);
		return response.getBody();
	}

	public void updatePerson(Person person) {
		restTemplate.put(ROOT_URI, person);
	}

	public void deletePerson(Long id) {
		restTemplate.delete(ROOT_URI + id);

	}
}

الكود مفهوم بذاته، نقوم بالاتصال بأساليب RestTemplate استنادًا إلى URI وطريقة HTTP ومرورًا بكائن طلب مناسب إذا لزم الأمر.

فئة اختبار Spring RestTemplate

حان الوقت لاختبار مشروع مثالنا Spring RestTemplate، تُظهر الفئة أدناه كيفية استخدام أساليب RestTemplate بطريقة Spring.

package com.journaldev.spring;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.http.HttpStatus;

import com.journaldev.spring.config.AppConfig;
import com.journaldev.spring.config.PersonClient;
import com.journaldev.spring.model.Person;

public class Main {

	public static void main(String[] args) {
		AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);

		PersonClient client = applicationContext.getBean(PersonClient.class);

		System.out.println("Getting list of all people:");

		for (Person p : client.getAllPerson()) {
			System.out.println(p);
		}

		System.out.println("\nGetting person with ID 2");

		Person personById = client.getById(2L);

		System.out.println(personById);

		System.out.println("Adding a Person");
		Person p = new Person();
		p.setAge(50);
		p.setFirstName("David");
		p.setLastName("Blain");
		HttpStatus status = client.addPerson(p);
		System.out.println("Add Person Response = " + status);

		applicationContext.close();
	}
}

عند تشغيل البرنامج أعلاه ضد إعدادي المحلي، أحصل على الإخراج التالي.

Getting list of all people:
Person{id=2, age=30, firstName='Oksi', lastName=' Bahatskaya'}
Person{id=1, age=30, firstName='Vlad', lastName='Mateo'}

Getting person with ID 2
Person{id=2, age=30, firstName='Oksi', lastName=' Bahatskaya'}
Adding a Person
Add Person Response = 201

تُظهر الصورة أدناه بيانات جدول قاعدة البيانات لخدمة الويب قبل وبعد تنفيذ البرنامج أعلاه. كما يمكنك رؤية أن إخراج البرنامج يتطابق مع بيانات الجدول المثالية. هذا كل شيء بالنسبة لمثال Spring RestTemplate، يمكنك تنزيل المشروع من الرابط أدناه.

قم بتنزيل مشروع مثال Spring RestTemplate

المرجع: وثائق الواجهة البرمجية

Source:
https://www.digitalocean.com/community/tutorials/spring-resttemplate-example