แนวคิดพื้นฐาน
Spring RestTemplate เป็นไคลเอนต์ที่ให้บริการโดย Spring สำหรับการเข้าถึงบริการ REST RestTemplate มีวิธีที่สะดวกสบายในการเข้าถึงบริการ HTTP ระยะไกลซึ่งสามารถปรับปรุงประสิทธิภาพการเขียนของลูกค้าได้อย่างมาก ดังนั้นลูกค้าจำนวนมากเช่น Android หรือผู้ให้บริการบุคคลที่สามจึงใช้ RestTemplate เพื่อขอบริการ RESTFUL
Resttemplata ของ Spring-Web เป็น HTTP พื้นฐานของ Java ผู้ใช้ที่ใช้ RestTemplata ไม่สามารถให้ความสนใจกับการเชื่อมต่อพื้นฐานได้อีกต่อไป RestTemplata ไม่เพียง แต่รองรับข้อมูลจำเพาะ REST เท่านั้น แต่ยังกำหนดประเภทวัตถุค่าส่งคืน
ในการใช้งานคุณสามารถใหม่วัตถุ RestTemplate ใหม่ได้โดยตรง จะมีตัวแปลงข้อความบางตัวที่ส่งคืนข้อความในวัตถุ RestTemplate ที่เราสร้างขึ้น คุณสามารถค้นหาตัวแปลงที่สอดคล้องกันตามสื่อกลางของข้อมูลที่ส่งคืนและทำการแปลง MediaType นอกจากนี้คุณยังสามารถสร้างตัวแปลงข้อความด้วยตัวเองสร้างคลาสที่สืบทอด AbstractGenerichttpMessageConverter <T> คลาสหรือใช้อินเตอร์เฟส HTTPMessAgEconverter <T> ควรสังเกตว่าวิธีการ CanRead และวิธีการ CanWrite ควรได้รับการตัดสินด้วยตัวเองเขียนพารามิเตอร์ไปยังสตรีมในวิธีการเขียนหรือการเขียนและรับผลลัพธ์ที่ส่งคืนจากร่างกายของสตรีมในวิธีการอ่านหรือการอ่านและแผนที่
วัตถุ RestTemplate สร้างคำขอ HTTP ที่ด้านล่างโดยใช้การใช้งานภายใต้แพ็คเกจ Java.net คุณสามารถระบุวิธีการร้องขอ HTTP ที่แตกต่างกันโดยใช้ clienthttprequestFactory
อินเทอร์เฟซ clienthttprequestfactory ส่วนใหญ่ให้สองวิธีการใช้งาน:
RestTemplate ใช้ SimpleClienthttprequestFactory โดยค่าเริ่มต้นและการโทรภายใน httpConnection เพื่อโทรหา JDK การหมดเวลาเริ่มต้นคือ -1 เราสามารถกำหนดหมดเวลาด้วยตนเอง
SimpleClienthttpRequestFactory โรงงาน = ใหม่ SimpleClienthttpRequestFactory (); // ตั้งค่าการหมดเวลาการเชื่อมต่อหน่วยมิลลิวินาทีโรงงาน SetConnectTimeOut (5000); // ตั้งค่าการหมดเวลาอ่าน RestTemplate restTemplate = ใหม่ RESTTEMPLATE (โรงงาน);
ใช้คำขอรับ:
string url = "http: // localhost: 80/mandy/login.json? บัญชี = 123456 & รหัสผ่าน = 123456"; rese res = resttemplate.getForObject (url, result.class);
ซอร์สโค้ด RestTemplate:
@Override สาธารณะ <t> t getForObject (string url, คลาส <t> responseType, วัตถุ ... urlvariables) พ่น RestClientException {requestCallback requestCallback = accepTheAderRequestCallback (responseType); httpmessageConverterterextractor <t> responseextractor = ใหม่ httpmessageConverterterextractor <t> (Responsetype, getMessageConverters (), logger); return execute (URL, httpmethod.get, requestcallback, respondextractor, urlvariables); -เป็นการดีที่สุดที่จะใช้ Get Request เพื่อแยกพารามิเตอร์โดยตรงไปยังที่อยู่ ฉันไม่รู้ว่าทำไม หากคุณใช้พารามิเตอร์ที่สามแม้แต่ประเภท MultivalUEMAP ก็จะไม่ทำงาน (บางคนบนอินเทอร์เน็ตบอกว่าการใช้ประเภท MultivalUEMAP ก็โอเค แต่ฉันลอง แต่มันจะไม่ทำงาน)
ใช้คำขอโพสต์:
hashmap <string, object> map = new hashmap <string, object> (); map.put ("ชื่อ", "ทดสอบ"); map.put ("บัญชี", "qwer"); map.put ("รหัสผ่าน", "qwer"); ObjectMapper mapper = new ObjectMapper (); สตริง jsonstr = null; ลอง {jsonstr = mapper.writevalueasstring (แผนที่); } catch (exception e) {e.printstacktrace (); } // สร้างเอนทิตีส่วนหัว HTTP และกรอกข้อมูลส่วนหัวเช่นรูปแบบข้อมูล httpheaders httpheaders = httpheaders ใหม่ (); httpheaders.setContentType (mediaType.application_json_utf8); // สร้างเอนทิตี HTTP คุณสามารถใช้ตัวสร้างโดยตรงเพื่อวางร่างกายคำขอและส่วนหัวคำขอใน HTTPENTITY <String> HTTTENTITY = ใหม่ "http: // localhost: 80/mandy/user_enable.json"; // การเรียกใช้วิธีการขอผลลัพธ์ res2 = resttemplate.postforobject (url, httpentity, result.class);ซอร์สโค้ด RestTemplate:
@Override สาธารณะ <t> t postforObject (url string, คำขอวัตถุ, คลาส <t> responsetype, วัตถุ ... urivariables) พ่น RestClientException {requestCallback requestCallback = httpentityCallback (คำขอ, responseType); httpmessageConverterterextractor <t> responseextractor = ใหม่ httpmessageConverterterextractor <t> (Responsetype, getMessageConverters (), logger); return execute (URL, httpmethod.post, requestcallback, responsextractor, urivariables); -ใช้การร้องขอ Put:
hashmap <string, object> map = new hashmap <string, object> (); map.put ("user_id", "1"); map.put ("enable", 0); mapper objectMapper = new ObjectMapper (); string jsonstr = null; ther E.printStackTrace ();} // สร้างเอนทิตีส่วนหัว HTTP และกรอกข้อมูลส่วนหัวเช่นรูปแบบข้อมูล httpheaders httpheaders = httpheaders ใหม่ (); httpheaders.setContentType (MediaType.Application_json_utf8) httPentity <String> httpentity = new httPentity <String> (JSONSTR, HTTPHEADERS); string url = "http: // localhost: 80/mandy/user_enable.json"; resttemplate.put (url, httpentity);ซอร์สโค้ด RestTemplate:
@Override โมฆะสาธารณะใส่ (url string, คำขอวัตถุ, วัตถุ ... urlvariables) พ่น RestClientException {RequestCallback RequestCallback = httPentityCallback (คำขอ); ดำเนินการ (url, httpmethod.put, requestcallback, null, urlvariables); -ข้อเสียเล็กน้อยของวิธีนี้คือไม่มีค่าส่งคืนของผลการร้องขอ หากคุณต้องการใช้ค่าส่งคืนคุณไม่สามารถใช้วิธีนี้ได้
หากคุณต้องการใช้คำขอประเภทการลบมีเพียงพารามิเตอร์ต่อไปนี้ในคอลัมน์พารามิเตอร์ของวิธีการวางของ RestTemplate
@OverridePublic Void DELETE (String url, Object ... urlvariables) พ่น RestClientException {ดำเนินการ (url, httpmethod.delete, null, null, urlvariables);}@overridepublic void delete httpmethod.delete, null, null, urlvariables);}@overridepublic void delete (uri url) โยน restclientexception {ดำเนินการ (url, httpmethod.delete, null, null);วิธีการเหล่านี้ไม่ได้ให้พารามิเตอร์แก่เราและให้เราใส่เนื้อหาของร่างกายคำขอดังนั้นหากคุณต้องการใช้วิธีการลบที่จัดทำโดย RestTemplate โดยตรงอินเตอร์เฟสจะต้องใช้สไตล์ที่น่าประทับใจให้ใส่พารามิเตอร์ในที่อยู่และรับพารามิเตอร์ผ่าน @PathVariable (value = "") คำอธิบายประกอบ
จุดสำคัญ: อันที่จริงเราสามารถใช้วิธีการแลกเปลี่ยนของ RestTemplate โดยตรงดังนี้
@OverridePublic <t> ResponseEntity <t> Exchange (String url, วิธี httpmethod, httpentity <?> requestentity, คลาส <t> responsetype, วัตถุ ... urivariables) โยน RestClientException ResponsEextractor <ResponseEntity <t>> ResponsExtractor = ResponseEntityExtractor (Responsetype); return execute (URL, Method, RequestCallback, Responsextractor, urivariables);}
ที่นี่เราแสดงรายการวิธีเดียวเท่านั้น คนอื่น ๆ สามารถพบได้ในซอร์สโค้ด วิธีนี้สามารถสร้างคำขอได้ทุกประเภท
ในวิธีนี้พารามิเตอร์วิธีการสามารถรับได้ผ่านการแจงนับ httpmethod พารามิเตอร์การร้องขอคือเอนทิตี HTTPENTITY ที่ห่อหุ้มด้วยตัวเองรวมถึงตัวตนคำขอและส่วนหัวคำขอ พารามิเตอร์ ResponsEtype เป็นคลาสการแมปที่ส่งคืนผลลัพธ์ พารามิเตอร์ urivariables ทำให้ฉันรู้สึกว่ามันไร้ประโยชน์ (ความคิดเห็นส่วนตัว) การเข้าถึงอินเตอร์เฟสการร้องขอส่งคืนคำขอผ่านวิธีการ getBody () ของค่าการส่งคืนวิธีการ
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น