ในการออกแบบส่วนต่อประสาน REST การใช้ RestTemplate สำหรับการทดสอบอินเตอร์เฟสเป็นวิธีทั่วไป แต่ในระหว่างการใช้งานเนื่องจากวิธีการและพารามิเตอร์มากมายนักเรียนหลายคนสับสนความแตกต่างระหว่างวิธีการส่งแบบฟอร์มและวิธีการส่งน้ำหนักบรรทุก ยิ่งไปกว่านั้นการออกแบบอินเตอร์เฟสนั้นแตกต่างจากวิธีการส่งที่ใช้โดยเบราว์เซอร์แบบดั้งเดิม ข้อผิดพลาดต่าง ๆ มักเกิดขึ้นเช่นข้อผิดพลาด 405 หรือข้อมูลที่ส่งไม่สามารถรับได้ทั้งหมด ตัวอย่างข้อผิดพลาดมีดังนี้:
ข้อยกเว้นในเธรด "Main" org.springframework.web.client.httpClienterRorexception: 405 วิธีไม่อนุญาต
ที่ org.springframework.web.client.defaultresponseerrorhandler.handleerror (defaultresponseerrorhandler.java:63)
ที่ org.springframework.web.client.resttemplate.handleresponse (resttemplate.java:700)
ที่ org.springframework.web.client.resttemplate.doexecute (resttemplate.java:653)
ที่ org.springframework.web.client.resttemplate.execute (resttemplate.java:613)
ที่ org.springframework.web.client.resttemplate.exchange (resttemplate.java:531)
1. ส่งโดยใช้วิธีการแลกเปลี่ยน
Exchange สามารถดำเนินการทั้งวิธีการโพสต์และได้รับดังนั้นจึงเป็นวิธีที่ใช้กันอย่างแพร่หลายและการใช้งานมีดังนี้:
string url = "http: // localhost/mirana-ee/app/login"; resttemplate client = new resttemplate (); httpheaders ส่วนหัว = httpheaders ใหม่ (); // โปรดอย่าเปลี่ยนวิธีการส่งนี้ได้อย่างง่ายดาย ในกรณีส่วนใหญ่วิธีการส่งเป็นส่วนหัวการส่งแบบฟอร์ม SetContentType (MediaType.Application_Form_urlencoded); // พารามิเตอร์ห่อหุ้มไม่ได้แทนที่ด้วยแผนที่และแฮชแมปมิฉะนั้นพารามิเตอร์ไม่สามารถส่งผ่าน multivaluemap <string, string> พารามิเตอร์ "ชื่อผู้ใช้"); params.add ("รหัสผ่าน", "123456"); httpentity <multivaluemap <สตริง, สตริง >> requestentity = new httpentity <multivaluemap <สตริง, สตริง >> (พารามิเตอร์, ส่วนหัว); String.class); // ผลลัพธ์ผลลัพธ์ System.out.println (response.getBody ());2. ส่งด้วย postforentity
Postforentity เป็นการทำให้การแลกเปลี่ยนง่ายขึ้นและต้องการการลดพารามิเตอร์ httpmethod.post เท่านั้นดังนี้:
// รหัสข้างต้นนั้นเหมือนกัน // คุณจะต้องแทนที่วิธีการแลกเปลี่ยนวิธีการแลกเปลี่ยน <string> response = client.postforentity (url, requestentity, string.class);
3. เกี่ยวกับความแตกต่างระหว่างการส่งแบบฟอร์มและการส่งน้ำหนักบรรทุก
ในพารามิเตอร์เมธอดคอนโทรลเลอร์ถ้าคุณเปลี่ยน "@modelattribute" เป็นคำอธิบายประกอบ "@requestbody" วิธีการส่งในเวลานี้คือวิธีการบรรทุก ตัวอย่างรหัสมีดังนี้:
// โปรดทราบว่า @requestbody คำอธิบายประกอบ @requestmapping (value = "/login", method = requestmethod.post, การบริโภค = "แอปพลิเคชัน/json") // อย่าเพิ่ม @modelattribute มิฉะนั้นมันจะถูกเขียนทับดังต่อไปนี้ // บัญชีสาธารณะ วันที่()); บัญชีส่งคืน;}
อีกครั้งอย่าเพิ่ม“ @modelattribute” อีกครั้งเนื่องจากลำดับความสำคัญค่อนข้างสูงระบบจะใช้แบบฟอร์มเพื่อแยกเนื้อหาที่ส่ง
สำหรับวิธีการบรรทุกเนื้อหาที่ส่งจะต้องเป็นสตริงและจะต้องตั้งส่วนหัวเป็น "Application/JSON" ตัวอย่างมีดังนี้:
// คำขอสตริงที่อยู่ url = "http: // localhost/mirana-ee/app/login"; rettemplate client = new resttemplate (); // ให้แน่ใจว่าได้ตั้งค่าส่วนหัวส่วนหัวของส่วนหัว ObjectMapperObjectMapper Mapper ผ่านการฉีดถั่ว = New ObjectMapper (); แผนที่ <สตริง, สตริง> params = maps.newhashMap (); params.put ("ชื่อผู้ใช้", "inter"); params.put ("รหัสผ่าน", "123456"); httpentity <string> (ค่าส่วนหัว); // ดำเนินการตอบสนองการร้องขอ http <string> response = client.postforentity (url, requestentity, string.class); system.out.println (response.getbody ());หากเนื้อหาไม่ได้ส่งในโหมดสตริงข้อผิดพลาดต่อไปนี้จะปรากฏขึ้นอย่างแน่นอน:
ข้อยกเว้นในเธรด "Main" org.springframework.web.client.httpClienterRorexception: 400 คำขอไม่ดี
ที่ org.springframework.web.client.defaultresponseerrorhandler.handleerror (defaultresponseerrorhandler.java:63)
ที่ org.springframework.web.client.resttemplate.handleresponse (resttemplate.java:700)
ที่ org.springframework.web.client.resttemplate.doexecute (resttemplate.java:653)
ที่ org.springframework.web.client.resttemplate.execute (resttemplate.java:613)
ที่ org.springframework.web.client.resttemplate.postforentity (resttemplate.java:407)
ในที่สุดก็ควรเน้นว่าพารามิเตอร์คำขอไม่สามารถรับได้ผ่าน @requestbody หากรหัสบนเซิร์ฟเวอร์ด้านบนถูกเปลี่ยนเป็นรูปแบบต่อไปนี้คุณจะไม่ได้รับข้อมูล แต่ตรงกันข้ามเป็นจริงสำหรับการส่งแบบฟอร์ม
@RequestMapping (value = "/login", ผู้บริโภค = "แอปพลิเคชัน/json", method = requestMethod.post) บัญชีสาธารณะ getAccount (@requestbody บัญชีบัญชี, คำขอ httpservletrequest) {// คุณต้องไม่ได้รับระบบค่าพารามิเตอร์ account.setVersion (วันที่ใหม่ ()); บัญชีส่งคืน;}4. โครงสร้างของ httpentity
HTTPENTITY เป็น encapsulation ของคำขอ HTTP ซึ่งมีสองส่วนส่วนหัวและร่างกาย ส่วนหัวจะใช้ในการตั้งค่าส่วนหัวคำขอและร่างกายใช้เพื่อตั้งค่าตัวถังดังนั้นตัวสร้างของมันมีดังนี้:
// ค่าคือการร้องขอร่างกาย // ส่วนหัวคือส่วนหัวคำขอ httpentity <string> requestentity = new httpentity <string> (ค่าส่วนหัว);
5. httpentity และ urivariables
ในการใช้ RestTemplate HTTPENTITY จะใช้เพื่อส่งค่าพารามิเตอร์เฉพาะในขณะที่ urivariables ใช้ในการจัดรูปแบบที่อยู่ HTTP แทนพารามิเตอร์ที่อยู่ การใช้งานที่ถูกต้องมีดังนี้:
// เพิ่มพารามิเตอร์การจัดรูปแบบ pathString url = "http: // localhost/mirana-ee/and/{path}"; // เตรียมพารามิเตอร์การจัดรูปแบบแผนที่ <สตริงสตริง> varparams = maps.newhashmap () varparams.put ("เส้นทาง" client.postforentity (url, requestentity, string.class, varparams);6. หมายเหตุเกี่ยวกับ httpmessageconverter
ในหลาย ๆ ตัวอย่างออนไลน์ฉันพบว่าหลายคนได้เพิ่ม httpmessageconverter ที่กำหนดเองเพื่อจัดการการส่งน้ำหนักบรรทุกดังนี้:
// ไม่จำเป็นต้องใช้ client.getMessageConverters (). เพิ่ม (MappingJackson2httpmessageConverter () ใหม่ (); client.getMessageConverters (). เพิ่ม (ใหม่ stringhttpmessageConverter ());
จากนั้นหลังจากที่ฉันตรวจสอบซอร์สโค้ดและการดีบักฉันพบว่า RestTemplate มี httpmessageConverters 7 ประเภทในตัวดังนี้:
1. org.springframework.http.converter.bytearrayhttpmessageConverter
2. org.springframework.http.converter.stringhttpmessageConverter
3. org.springframework.http.converter.resourcehttpmessageConverter
4. org.springframework.http.converter.xml.sourcehttpmessageConverter
5. org.springframework.http.converter.support.allencompassingformhttpmessageConverter
6. org.springframework.http.converter.xml.jaxb2rootelementhttpmessageConverter
7. org.springframework.http.converter.json.mappingjackson2httpmessageconverter
-
สรุปแล้ว
RestTemplate สามารถทำให้ความยากลำบากในการส่งข้อมูลแบบฟอร์มง่ายขึ้นอย่างมากและมาพร้อมกับฟังก์ชั่นของการแปลงข้อมูล JSON โดยอัตโนมัติ อย่างไรก็ตามโดยการทำความเข้าใจโครงสร้างองค์ประกอบของ Httpentity (ส่วนหัวและร่างกาย) และทำความเข้าใจความแตกต่างกับ urivariables เราสามารถเข้าใจการใช้งานได้อย่างแท้จริง
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น