จะเข้าถึงข้อมูลส่วนหัว HTTP ในคอนโทรลเลอร์ Spring MVC REST ได้อย่างไร


154

ฉันใหม่กับการเขียนโปรแกรมเว็บโดยทั่วไปโดยเฉพาะใน Java ดังนั้นฉันเพิ่งเรียนรู้ว่าส่วนหัวและร่างกายคืออะไร

ฉันกำลังเขียนบริการ RESTful โดยใช้ Spring MVC ฉันสามารถสร้างบริการที่เรียบง่ายด้วย@RequestMappingในตัวควบคุมของฉัน ฉันต้องการความช่วยเหลือในการทำความเข้าใจวิธีรับข้อมูลส่วนหัว HTTP จากคำขอที่มาถึงวิธีการของฉันในส่วนควบคุมบริการ REST ของฉัน ฉันต้องการแยกวิเคราะห์ส่วนหัวและรับคุณลักษณะบางอย่างจากมัน

คุณช่วยอธิบายได้อย่างไรว่าฉันจะไปรับข้อมูลนั้น

คำตอบ:


264

เมื่อคุณใส่หมายเหตุประกอบพารามิเตอร์ด้วย@RequestHeaderพารามิเตอร์จะดึงข้อมูลส่วนหัว ดังนั้นคุณสามารถทำสิ่งนี้:

@RequestHeader("Accept")

เพื่อรับAcceptส่วนหัว

ดังนั้นจากเอกสาร :

@RequestMapping("/displayHeaderInfo.do")
public void displayHeaderInfo(@RequestHeader("Accept-Encoding") String encoding,
                              @RequestHeader("Keep-Alive") long keepAlive)  {

}

ค่าAccept-EncodingและKeep-Aliveส่วนหัวมีให้ในencodingและkeepAliveพารามิเตอร์ตามลำดับ

และไม่ต้องกังวล เราทุกคนไม่มีอะไรกับบางสิ่ง


ขอบคุณ. ในตัวอย่างโค้ดบางส่วนใน บริษัท ที่ฉันทำงานฉันเห็น HttpServletRequest เป็นพารามิเตอร์และมีเมธอด getHeader อยู่ วิธีใดเป็นที่นิยมกว่า
Horse Voice

1
ชอบ abstractions กับรายละเอียดระดับต่ำของ API ฉันอยากจะให้ Spring MVC สรุปรายละเอียดของServletAPI ออกไป ฉันสามารถใช้คำอธิบายประกอบเพื่อดึงสิ่งที่ฉันต้องการออกจากคำขอ
Vidya

6
ควรกล่าวถึงคุณจะได้รับข้อผิดพลาด 400 คำขอที่ไม่ถูกต้องเป็นการตอบกลับในกรณีที่คำขอไม่มีส่วนหัวดังกล่าว วิธีที่ยืดหยุ่นมากขึ้นคือการเข้าถึงส่วนหัวขอโดยตรงตามที่อธิบายไว้ใน: stackoverflow.com/a/28209710/1828296
lospejos

ฉันเดาว่ามันขึ้นอยู่กับสิ่งที่คุณต้องการจะทำ แต่การตอบสนอง 400 ครั้งเป็นพฤติกรรมที่ฉันมักจะต้องการในกรณีนี้
Vidya

@lospejos ที่สามารถหลีกเลี่ยงได้โดยใช้requiredแฟ@RequestHeader(name = "Keep-Alive", required = false) long keepAliveล็กเช่นนั้นจะตั้ง keepAlive เป็น null หากไม่ได้ระบุไว้ นอกจากนี้ยังมีdefaultValueช่องสำหรับคำอธิบายประกอบdocs.spring.io/spring-framework/docs/5.0.7.RELEASE/javadoc-api/...
Niccolò

88

คุณสามารถใช้@RequestHeaderคำอธิบายประกอบกับHttpHeadersพารามิเตอร์ method เพื่อเข้าถึงส่วนหัวคำขอทั้งหมด:

@RequestMapping(value = "/restURL")
public String serveRest(@RequestBody String body, @RequestHeader HttpHeaders headers) {
    // Use headers to get the information about all the request headers
    long contentLength = headers.getContentLength();
    // ...
    StreamSource source = new StreamSource(new StringReader(body));
    YourObject obj = (YourObject) jaxb2Mashaller.unmarshal(source);
    // ...
}

เนื้อหาของคำขอ http นั้นเป็นอย่างไร ฉันจะเข้าถึงส่วนหัวเฉพาะได้อย่างไร คุณสามารถอธิบายให้ฉันได้หรือไม่ถ้า HttpHeaders เป็นแผนที่ที่ฉันต้องการรหัสเพื่อเข้าใช้
Horse Voice

HttpHeaders มี getters เพื่อรับข้อมูลเฉพาะส่วนหัว คุณสามารถสำรวจลิงค์นี้เพื่อรับรายละเอียด: docs.spring.io/spring/docs/3.1.x/javadoc-api/org/…
Debojit Saikia

แก้ไขคำตอบของฉันเพื่อแสดงว่าคุณสามารถเข้าถึงเนื้อหาคำขอได้อย่างไร
Debojit Saikia

1
ทำไมจึงต้องมีสตรีมทรัพยากร ดูเหมือนซับซ้อนเกินไป จะต้องมีวิธีที่ง่ายกว่าการใช้สตรีม ฯลฯ
Horse Voice

ที่นี่StringReaderจะใช้ในการอ่านกระแสตัวละครที่เข้ามา StreamSourceทำงานเป็นเจ้าของสำหรับแหล่งการแปลงในรูปแบบของกระแสของมาร์กอัป XML
Debojit Saikia

14

โซลูชันของฉันในพารามิเตอร์ส่วนหัวพร้อมตัวอย่างคือuser = "test"คือ:

@RequestMapping(value = "/restURL")
  public String serveRest(@RequestBody String body, @RequestHeader HttpHeaders headers){

System.out.println(headers.get("user"));
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.