2017-10-23 4 views
2

Ich arbeite mit Playframework für das endgültige Projekt an der Universität und ich bekomme ein Problem beim Routing einer Lösch-oder Put-Methode. Wenn ich Ihr Interesse an einer DELETE oder PUT-Methoden Ich erhalte:Playframe Scala - Löschen Route Probleme

[info] play.api.Play - Application started (Dev) [debug] a.ErrorHandler - onClientError: statusCode = 404, uri = /Rest/deleteCity, message ="

Meine JQuery Ajax-Aufruf ist:

$("#scalaDelete").click(function(){ 
    $("#result").empty(); 
    $.ajax({ 
     url: "http://localhost:9000/Rest/deleteCity", 
     method: "DELETE", 
     data: {city: "Alvorada"}, 
     dataType: "json", 
     success: function(result){ 
      $("#result").append("Result: "+result.Result); 
     }, 
     error: function (request, status, error) { 
      alert(status); 
     } 
    }); 
}); 

Meine Strecke Spielen Route:

DELETE  /Rest/deleteCity  controllers.RestController.deleteCity() 

My-Controller Methode:

case class UserDelete(city:String) 
class RestController @Inject()(db: Database, cc: ControllerComponents) extends AbstractController(cc) { 

val userDeleteForm = Form(
    mapping(
    "city" -> text 
    )(UserDelete.apply)(UserDelete.unapply) 
) 

    def deleteCity = Action{ implicit request=> 
    val userPar = userDeleteForm.bindFromRequest.get 
    //DatabaseDelete 

    Ok(jsonResult) 
    } 

} 

Ich habe bereits Cross-Domain in Chrome aktiviert, ich habe eine CORS-Erweiterung dafür verwendet.

Vielen Dank für

Antwort

0

helfen scheint dies zu Restful http delete in play verwendet, das heißt DELETE mit Daten lückenhaft sein.

Statt Daten vorbei, ich würde nur das auf die URL bewegen:

DELETE  /Rest/deleteCity/:city controllers.RestController.deleteCity(city: String) 
# or with a query string 
DELETE  /Rest/deleteCity controllers.RestController.deleteCity(city: String) 

und dann tun

http://localhost:9000/Rest/deleteCity/Alvorada 
# or with a query string 
http://localhost:9000/Rest/deleteCity?city=Alvorada 

Persönlich bevorzuge ich die letztere.

+0

Hallo Andy, vielen Dank für mich zu helfen ... Ich habe die zweite versucht, mit Abfrage-Zeichenfolge, aber ich habe noch wurde nicht gefunden Methode aus dem Play Server. Ich habe die Jquery Data-Parameter herausgenommen und die URL mit? City = Alvorada übergeben. Auf Controller-Methode habe ich Def deleteCity (Stadt: String) = ... –

+0

@DanielYanagita nur um etwas zu versuchen, ist es eine Groß-und Kleinschreibung Sache?Könntest du es versuchen '/ rest/delete-city' (normalerweise ist das kein Problem ...) –

+0

@DanielYanagita du hast dataType auch entfernt? –

0

Ich stimme @AndyHayden zu.

Wiedergabe ignoriert der Körper der DELETE Anforderung, dass das richtige Verhalten meiner Meinung nach ist, aber man kann durch die explizite Übergabe eines Körper Parser arbeitet um:

def delete = Action(parse.json) { implicit request => 
    val json = request.body 
    val someProp = (json \ "someprop").as[String] 
    Ok(s"Prop is: $someProp") 
} 

(in diesem Beispiel durch einen der gegeben wurde Entwickler des Play selbst. https://github.com/playframework/playframework/issues/4606#issuecomment-109192802)

Über die Zweifel in den Kommentaren:

I've seen another post here where a guy said some browsers just support get and post method.

POST und GET sind nur für das Attribut method des Tags form gültig.

Sie verwenden Javascript-Anfrage, so dass Sie jede Methode verwenden können, die Server unterstützt. d. h. DELETE ist dort völlig in Ordnung.

But something interesting for you to know is that playframework uses akka and this framework does not support DELETE request for security reasons, in fact it wasn't well explained on post. Then if you wanna make a DELETE method you gotta make a post method for complete your code.

Akka HTTP unterstützt die DELETE-Anfrage (sowie Play-Framework): https://doc.akka.io/docs/akka-http/current/scala/http/routing-dsl/directives/method-directives/delete.html

+0

hallo, zuerst einmal vielen Dank für die Hilfe;) Also, wenn ich verstanden habe, was akka Dokumentation sagte, muss ich eine Route codieren, auf der Route Datei wird nicht funktionieren. Ich habe gesagt, dass DELETE nicht unterstützt wird, da mein Server mir eine Warnung geantwortet hat, dass es aus Sicherheitsgründen nicht unterstützt wird ... Ich werde versuchen, eine benutzerdefinierte Route nach Code zu erstellen. Dank ein Haufen –

+0

Hallo @AndriyKuba, Entschuldigung für die verspätete Prüfung und Rückmeldung ... Dann hatten Sie beide Recht, es gibt zwei Möglichkeiten, eine Löschung zu implementieren. Die erste übergibt Werte per Post und macht eine einfache Post-Route in route.config. Die zweite Methode übergibt Werte an Get, aber um Erfolg zu haben, musste ich meine Route.config auf eine Routenmethode verweisen und sie codieren. –

Verwandte Themen