เนื่องจากข้อกำหนดของโครงการจำเป็นต้องมีการสื่อสารระหว่างทั้งสองระบบ หลังจากการวิจัยบางอย่างก็ตัดสินใจใช้คำขอ HTTP
ไม่มีอะไรจะพูดเกี่ยวกับเซิร์ฟเวอร์ เดิมใช้เพื่อเข้าถึงโดยใช้เว็บเพจ ดังนั้นหลังจากเริ่มต้นสปริงบูทอินเทอร์เฟซเลเยอร์คอนโทรลเลอร์จะถูกเปิดเผยโดยอัตโนมัติ ไคลเอนต์สามารถเรียก URL ที่เกี่ยวข้องได้ดังนั้นนี่คือไคลเอนต์เป็นหลัก
ก่อนอื่นฉันปรับแต่งเครื่องมือคลาสเครื่องมือ FACTORYHTTP สำหรับการประมวลผลคำขอ HTTP เนื่องจากเป็นการเข้าถึง URL จึงมีปัญหาสองประการที่ต้องจัดการหนึ่งคือ URL ที่ร้องขอบริการและพารามิเตอร์ของเซิร์ฟเวอร์คำขอ ส่วนหัวข้อความของไคลเอนต์ขอ URL บริการ: ขอ URL เซิร์ฟเวอร์ที่ฉันกำหนดเป็นพารามิเตอร์ URL เดียวกับไคลเอนต์: มีพารามิเตอร์สองประเภทบนเซิร์ฟเวอร์ที่ถูกห่อหุ้มคล้ายกับต่อไปนี้:
http: // localhost: 8080/switch/getAllstatus? ข้อมูล {"ชื่ออินเตอร์เฟส": "getAllStudentStaus"}
หนึ่งไม่ถูกห่อหุ้มคล้ายกับต่อไปนี้:
http: // localhost: 8080/switch/getstudentinfobyname? name = zhangsan
ก่อนอื่นมันถูกห่อหุ้ม:
1: เริ่มต้น httpclient
ไคลเอนต์ httpClient ส่วนตัวคงที่ = null; Static {PoolinghttpClientConnectionManager CM = ใหม่ poolinghttpClientConnectionManager (); CM.SetMaxtotal (128); CM.SetDefaultMaxperRoute (128); client = httpClients.custom (). setConnectionManager (CM) .build (); -สอง: รับ URL ที่ร้องขอเนื่องจาก URL ที่กำหนดโดยเซิร์ฟเวอร์ของฉันนั้นเหมือนกับไคลเอนต์ดังนั้นฉันจึงใช้ URL ของไคลเอนต์ที่ร้องขอโดยตรง
// รับ urlpublic stringbuffer geturltorequest (คำขอ httpservletrequest) {stringbuffer url = request.getRequesturl (); // รับ URL ที่ร้องขอ (http: // localhost: 8080/switch/getstudentinfobyname) String appname = splitarr [3]; // ชื่อโครงการสตริง iPreport = splitarr [2]; // โครงการ IP: รายงานสตริงผลลัพธ์ tr = url.toString (). replaceall (appname, devfacconstans.facname) ส่งคืน StringBuffer ใหม่ (ResultsTR); -รับ URL ที่จะแยกตาม /เนื่องจากฉันกำลังทดสอบสภาพแวดล้อมสภาพแวดล้อมการผลิต IP หมายเลขพอร์ต (ชื่อโดเมน) ไม่แน่นอนในท้องถิ่นบางคนจะเพิ่มชื่อโครงการก่อนหน้านี้ดังนั้นฉันจะแทนที่ค่าที่สอดคล้องกัน
สาม: รวบรวมพารามิเตอร์คำขอและโทรไปที่คำขอ HTTP
/*** ส่งคำขอ HTTP พร้อมคำขอ* เรียกเลเยอร์คอนโทรลเลอร์* @param Request* @return*/สตริงสาธารณะ Sendhttttodevfac (คำขอ httpservletRequest) โยนข้อยกเว้น {httpClient client = null; สตริง returnResult = ""; // http: // localhost: 8080/leo/1.0/h5/login Stringbuffer urlbuffer = geturltoreQuest (คำขอ); // โทรขั้นตอนที่สองรับ URL // รับพารามิเตอร์ String encoderData = urlencoder.encode (DataAsjson, "UTF-8"); httpget get = new httpget (urlbuffer.append ("? data ="). ผนวก (encoderdata) .tostring ()); // ตั้งค่า headersenumeration <String> headerNames = request.getheaderNames (); ในขณะที่ (headernames.hasmoreElements ()) {string headername = headernames.nextElement (); string headervalue = request.getheader (ชื่อ headername); get.setheader (ชื่อส่วนหัว, headervalue); } client = deviceFactoryhttp.client; logger.info ("เริ่มการร้องขอ http, คำขอ URL:"+urlbuffer.toString ()); httpresponse rep = client.execute (รับ); returnResult = entityUtils.toString (rep.getEntity (), "UTF-8"); logger.info ("การร้องขอการร้องขอ http สิ้นสุด !!"); returnresult; -ก่อนอื่นรับพารามิเตอร์ที่ร้องขอจากนั้นรวบรวมพารามิเตอร์ที่อยู่ด้านหลัง URL อย่าลืมเกี่ยวกับ urlencoder.encode นี่เป็นเพราะพารามิเตอร์จะมีสัญลักษณ์บางอย่าง คุณต้องเข้ารหัสพารามิเตอร์ก่อนที่จะเพิ่ม URL มิฉะนั้นจะมีการโยนข้อยกเว้น ชุดส่วนหัว: เนื่องจากเซิร์ฟเวอร์ข้อมูลบางอย่างจะนำพวกเขาออกจากส่วนหัวคำขอฉันจึงตั้งส่วนหัวคำขอของลูกค้าตามคำขอของเซิร์ฟเวอร์ URL ที่ร้องขอและพารามิเตอร์ที่ร้องขอสามารถเชื่อมต่อและ client.exceute (รับ) เพื่อดำเนินการตามคำขอ
ข้างต้นคือเบราว์เซอร์ของฉันส่งคำขอคำขอเป็นพารามิเตอร์ไปยังไคลเอนต์ของฉันโดยตรงดังนั้นฉันจึงสามารถรับ URL ได้โดยตรงจากคำขอ บางคนไม่มีคำขอดังนั้นฉันต้องได้รับจากบริบทของคำขอ
unpackaged:
ก่อนอื่นรับคำขอ
/*** รับคำขอ*@return*/สาธารณะ httpservletRequest getRequest () {servletRequestattributes ra = (servletrequestattributes) requestcontextholder.getRequestattributes (); httpservletRequest request = ra.getRequest (); คำขอส่งคืน; -2: หลังจากมีการร้องขอมี URL มาวิเคราะห์พารามิเตอร์การร้องขอเพราะพารามิเตอร์นี้ไม่ถูกห่อหุ้มดังนั้นพารามิเตอร์คำขอทั้งหมดจึงได้รับ
/** * ไม่มีการร้องขอให้เรียกเลเยอร์คอนโทรลเลอร์ * @param คีย์ * @param interfacename * @param strings * @return * @throws Exception */สตริงสาธารณะ centertodefacnorequest (คีย์สตริง Reuquest Request Parameter การแจงนับ <String> ชื่อ = request.getParameterNames (); แผนที่ <สตริงสตริง> parammap = ใหม่ hashmap <> (); // แผนที่คำขอทรานสตาร์ทในขณะที่ (names.hasmoreElements ()) {string name = names.nextElement (); string value = (string) request.getParameter (ชื่อ); parammap.put (ชื่อ, ค่า); } // โทรไปที่วิธีการส่งคำขอ HTTP Return Sendhttttodevfacnodata (parammap, คำขอ); } catch (exception e) {e.printstacktrace (); } // end return null; - สาม: ส่งคำขอ HTTP
/ ** * ส่งคำขอ http, [ไม่มีข้อมูล] * @return */ สตริงสาธารณะ sendhtttptodevfacnodata (แผนที่ <สตริง, สตริง> parammap, httpservletrequest คำขอ) โยนข้อยกเว้น {httpClient client = null; สตริงผลลัพธ์ = ""; StringBuffer Databuffer = getUrlToreQuest (คำขอ); // รับ URL Databuffer.Append ("?"); client = deviceFactoryhttp.client; Iterator <entry <string, string >> paamit = parammap.entryset (). iterator (); ในขณะที่ (paamit.hasnext ()) {entry <string, string> entry = paamit.next (); databuffer.append (entry.getKey ()). ผนวก ("=") ผนวก (entry.getValue ()). ผนวก ("&"); } string resulturl = databuffer.toString (). substring (0, databuffer.toString (). lastIndexof ("&")); // ส่งคำขอ httpget get = new httpget (ผลลัพธ์); // ตั้งค่าส่วนหัวการแจงนับ <String> headerNames = request.getheaderNames (); ในขณะที่ (headernames.hasmoreElements ()) {string headername = headernames.nextElement (); string headervalue = request.getheader (ชื่อ headername); get.setheader (ชื่อส่วนหัว, headervalue); } httpresponse rep = client.execute (รับ); logger.info ("เริ่มการโทร http, ขอ URL:"+resulturl); // return result = entityutils.toString (rep.getEntity (), "UTF-8"); logger.info ("การร้องขอ http ขอสิ้นสุด !!"); ผลการกลับมา; -ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น