referencia combinado Cipian Spring Framework Notas del estudio (9) - Interfaz de conocimientos de diseño específico de la API y Codificación
Cuando se utiliza la primavera de arranque recibir parámetros, encontramos muchos problemas antes había sido ocupado recientemente pocas investigaciones disponibles sobre este tema.
La mayoría de los artículos en línea, hablan de la forma en la primavera de arranque lograr parámetros aceptables, pero no acerca de cómo llamar al cliente, Benpian uso Jsoup, okhttp3 y herramientas de prueba postwoman disparos, explicar cómo implementar la interfaz en el servidor, mientras que el cliente la forma de lanzamiento solicitudes y paso de parámetros
Hay cuatro tipos de presentación de solicitudes de
desarrollo web sólo puede ser empezar tienes dudas? No sólo conseguir y publicar estos dos?
En los últimos años parece popular interfaz de estilo de descanso, hay una variedad de maneras, de acuerdo a la función de distinguir
Sin embargo, en la actualidad sólo se utilizaron los siguientes cuatro formas GET, POST, palabras, borrado
En esencia, además de conseguir, otros que son la forma posterior deriva versiones llaman cuando sólo se tenga que modificar el nombre del método a (los ejemplos de código específico se pueden ver en el camino post)
obtener camino
introducción
A continuación, escribí una interfaz
Debido a que es una implementación local, la propiedad intelectual es localhost
, contextPath llama requestdemo
, el puerto por defecto 8080
, por lo que es accesible urlhttp://localhost:8080/requestdemo/api/user/users
Puesto que estamos utilizando @RequestMapping
anotaciones, que sí, pero qué manera tener acceso a los datos, como se muestra a continuación, cambiar a acceso posterior
Si desea obtener una forma especificada, puede utilizar @GetMapping
anotaciones, Getmapping anotación es equivalente a dicha redacción, de hecho @RequestMapping("users",method = [(RequestMethod.GET)])
, recibió atributo del método de anotación es un parámetro indexado
Obtener la manera especificada usando otra manera post, PUT, etc., no son el retorno de datos de modo, el código de error de paquete 405, como en la figura.
recibir datos
@GetMapping("select")
fun selectByPk(@RequestParam("id") ids:Int):User {
println(ids)
return User("zhangsan",19)
}
@GetMapping("select1")
fun selectByPk1(ids:Int) {
println(ids)
}
La primera manera deben esta llamadas del cliente, puede introducir la dirección URL
http://localhost:8080/requestdemo/api/user/select?id=1
El segundo parámetro no se anota, por lo que por defecto de arranque de primavera al nombre de variable como parámetro, por lo que debe ser llamada con
http://localhost:8080/requestdemo/api/user/select1?ids=1
La siguiente captura de pantalla de error también ilustra completamente este punto
Consigue una petición iniciada por el código de cliente
El cliente envía una solicitud por escrito para obtener el código es relativamente simple, siempre y cuando podemos poner un empalme buena url
Jsoup:
Jsoup conseguir método es devolver un documento (objeto web, después de css se puede cribar para encontrar el nodo especificado, obteniendo de este modo el contenido)
//需要ignoreContentType,忽略content-type,否则会报错,拿不到服务器返回的数据
val doc= Jsoup.connect("http://localhost:8080/requestdemo/api/user/select?id=1")
.ignoreContentType(true)
.get()
//输出服务器返回json数据
println(doc.body().text())
Okhttp3:
val client = OkHttpClient()
val request = Request.Builder()
.url("http://localhost:8080/requestdemo/api/user/select?id=1")
.get()
.build()
val call = client.newCall(request)
call.enqueue(object :Callback{
override fun onFailure(call: Call, e: IOException) {
}
override fun onResponse(call: Call, response: Response) {
println(response.body()?.string())
}
})
manera del poste
comentario @RequestParam
@RequestParam para el procesamiento de Content-Type: application del GET presentación codificada urlencoded-x-www-form contenido /, POST.
Tiene las siguientes interfaces:
@PostMapping("update")
fun update(@RequestParam map: HashMap<String,String>) {
//输出传入的key和value
for (mutableEntry in map) {
println(mutableEntry.key + "=" + mutableEntry.value)
}
}
PD: no pueden notas RequestParam omitido, de lo contrario el servidor back-end no recibe datos
Usar interfaz de comprobación postwoman:
Tenga en cuenta que el formato de datos de los datos del formulario de esta manera es application / x-www-form- urlencoded
Jsoup:
val dataMap = hashMapOf("name" to "zhangsag","age" to 11.toString())
val doc= Jsoup.connect("http://localhost:8080/requestdemo/api/user/update")
.ignoreContentType(true)
.data(dataMap)
.post()
//输出结果
println(doc.body().text())
El método de los datos puede ser aceptable Jsoup Map <String, String>, o par clave-valor en el ejemplo anterior el código siguiente se puede cambiar
val doc= Jsoup.connect("http://localhost:8080/requestdemo/api/user/update")
.ignoreContentType(true)
.data("name","zhangsan")
.data("age",12.toString())
.post()
//输出结果
println(doc.body().text())
Okhttp3:
fun sendPostRequest(){
val url ="http://localhost:8080/requestdemo/api/user/update"
val client = OkHttpClient()
val formBodyBuilder = FormBody.Builder()
formBodyBuilder.add("names", "zhangsxx")
formBodyBuilder.add("ages", "19")
val request = Request.Builder()
.url(url)
.post(formBodyBuilder.build())
.build()
val call = client.newCall(request)
call.enqueue(object : Callback{
override fun onFailure(call: Call, e: IOException) {
}
override fun onResponse(call: Call, response: Response) {
}
} )
}
Hay un pequeño problema no entiende, si la interfaz es similar a la siguiente, el cliente debe ser cómo pasar datos? Probé se dan varios métodos, dice que es incapaz de escribir en Cadena Tipo de usuario , no es que no se pasa este enfoque?
Dios quiere tener un gran paso puede ayudar a responder
@PostMapping("update2")
fun update2(@RequestParam user: User) {
println(user.toString())
}
comentario @RequestBody
A veces, tenemos que pasar una cadena JSON, tenemos que utilizar este comentario
Se @RequestBody aceptar un objeto de cadena JSON, no es el objeto JSON
Tenemos una de las siguientes interfaces:
@PostMapping("update1")
fun update1(@RequestBody user:User) {
println(user.toString())
}
Pasamos los datos JSON en el cliente, después del arranque de la primavera llamará automáticamente a Jackson marco, los datos de cadena JSON en las clases de entidad
Jsoup:
val json = "{\"name\":\"zhangs\",\"age\":18}"
val doc= Jsoup.connect("http://localhost:8080/requestdemo/api/user/update1")
.requestBody(json)
.header("content-type","application/json")
.post()
jsoup necesidad de sumar el comunicado solicitud se transmite datos de cadena JSON, por analogía, otras formas de transferencia sólo es necesario cambiar el valor del tipo de contenido a otras formas de
OkHttp3:
val json = "{\"name\":\"zhangs\",\"age\":18}"
val client = OkHttpClient()
val request = Request.Builder()
.url("http://localhost:8080/requestdemo/api/user/update1")
.post(RequestBody.create(MediaType.parse("application/json"),json))
.build()
val call = client.newCall(request)
call.enqueue(object :Callback{
override fun onFailure(call: Call, e: IOException) {
}
override fun onResponse(call: Call, response: Response) {
println(response.body()?.string())
}
})
Aquí algo similar a la okhttp anteriormente, los datos de parámetros no es la misma en el interior del método post
@RequestParam -> application / x-www-form-urlencoded -> FormBody
@RequestBody -> application / json -> RequestBody
Por analogía, si se trata de formato XML o en formato binario deben ser utilizados para construir los datos RequestBody, puede operar en su propio aspecto específico, ya no hay demuestra
¿Cómo poner, a modo de borrado de escritura
Jsoup:
val json = "{\"name\":\"zhangs\",\"age\":18}"
val doc= Jsoup.connect("http://localhost:8080/requestdemo/api/user/update1")
.requestBody(json)
.header("content-type","application/json")
.method(xx)
.post()
Se añadió a la método en el método, la cifra es de valores opcionales:
Okhttp3, sólo toma el procedimiento de después de cambiar o método delete se pueden poner
val json = "{\"name\":\"zhangs\",\"age\":18}"
val client = OkHttpClient()
val request = Request.Builder()
.url("http://localhost:8080/requestdemo/api/user/update1")
//put或delete
.put(RequestBody.create(MediaType.parse("application/json"),json))
.build()
val call = client.newCall(request)
call.enqueue(object :Callback{
override fun onFailure(call: Call, e: IOException) {
}
override fun onResponse(call: Call, response: Response) {
println(response.body()?.string())
}
})
código de petición ajax se transfiere (añadido)
Si ajax siguientes códigos:
var sg = 'UDZRb1loVWQFDAI9BTVcYFc6ADRTNQo8UWBQY1I5ASYBdVU_aXTEAYQdpBGEGagI2Vj4HO1Q7VmI_c';
$.ajax({
type : 'post',
url : '/ajaxm.php',
data : { 'action':'downprocess','sign':sg,'ves':1 },
dataType : 'json',
success:function(msg){
var date = msg;
...
Dichas solicitudes deben estar en postwoman:
Código Jsoup:
//我这里不加头部,也可以获取到数据
val postUrl = "https://www.lanzous.com/ajaxm.php"
val params = LinkedHashMap<String, String>()
params["action"] = "downprocess"
params["sign"] = sign
params["ves"] = "1"
val result = Jsoup.connect(postUrl)
.data(params)
.post()
.html()
referencia
frombody la POST
tipo SpringBoot aparece el contenido 'archivo application / x-www-form-urlencoded;. charset = UTF-8' no compatible
OKHTTP3 simple de usar (c) el método POST