2017-02-13 4 views
1
setzen

Ich beginne mit Web-API (Ich war weg von Web-Dev für eine Weile und es scheint niemand kümmert sich um SOAP mehr), aber ich lief in Schwierigkeiten während versuchen zu PUT.PUT in Web-API wird immer "0" auf Server

Ich folgte einem Online-Tutorial und es funktioniert gut für GET und DELETE. Zum Testen verwende ich Postman, da dieser von einem anderen Dienst aufgerufen wird, der auch mit Postman getestet wird. Hier ist der Code für GET:

alle Bücher Get:

// GET: api/Books 
public IEnumerable<Book> Get() 
{ 
    return Library.Books; 
} 

Buch von ID-Adresse:

// GET: api/Books/<int> 
public IHttpActionResult Get(int id) 
{ 
    Book book = Library.Books.FirstOrDefault(l => l.ID == id); 

    if (book != null) 
     return ResponseMessage(Request.CreateResponse<Book>(HttpStatusCode.OK, book)); 
    else 
     return ResponseMessage(Request.CreateResponse<string>(HttpStatusCode.NotFound, "Book not found.")); 
} 

Buch Löschen von ID:

// DELETE: api/Books/<int> 
public IHttpActionResult Delete(int id) 
{ 
    Book book = Library.Books.FirstOrDefault(l => l.ID == id); 

    if (book != null) 
    { 
     Library.Books.Remove(book); 
     return ResponseMessage(Request.CreateResponse(HttpStatusCode.OK)); 
    } 
    else 
     return ResponseMessage(Request.CreateResponse<string>(HttpStatusCode.NotFound, "Book not found.")); 
} 

von allen gut laufen und werde meinen Zwecken dienen, da ich eine Liste von Objekten zurückgeben muss, also ist alles in Ordnung.

BTW, http://localhost/api/Books/1 funktioniert ziemlich gut, wenn GET oder DELETE gewählt ist (Ich brauche nicht wirklich in Postbote Innenleben bekommen jetzt) ​​

Aber ich habe die PUT-Methode geändert, wie ich nur senden müssen einige Int (eine Adresse) zu diesem Dienst. Hier ist der Testcode:

// PUT: api/Books/<int> 
public IHttpActionResult Put([FromBody]int address) 
{ 
    if (address == 0) 
     return ResponseMessage(Request.CreateResponse<string>(HttpStatusCode.BadRequest, "Value cannot be zero")); 
    else 
     return ResponseMessage(Request.CreateResponse(HttpStatusCode.OK)); 
} 

Beim Debuggen der Parameter „Adresse“ Null immer wenn sie als solche genannt werden: http://localhost/api/Books/80 oder andere int. Mit anderen Worten, meine Antwort auf PUT wird immer lauten: "Wert kann nicht Null sein". Ich habe versucht, [FromBody] zu entfernen und das [HttpPut]-Attribut der PUT-Methode hinzuzufügen, aber es macht die Dinge nur noch schlimmer. Ich weiß, dass das ziemlich neu ist, aber wie ich schon sagte, ich habe mich seit Ewigkeiten nicht mehr mit Web Dev beschäftigt. Bitte um Rat.

+2

So funktioniert PUT nicht. Sie PUT eine teilweise oder gesamte Ressource aktualisiert werden, so '{" Hausnummer ":" 42 "}. Wie Sie aus dem Attribut sehen können, wird die Ganzzahl vom Körper gelesen. In diesem Fall sollte Ihr Anfragetext genau das sein: eine Ganzzahl namens address, also '{address: 42}'. – CodeCaster

Antwort

4

Der Code, den Sie haben:

public IHttpActionResult Put([FromBody]int address) 
{ 
} 

erwartet Sie eine Anfrage Körper zu senden, um die Zahl enthält.

{ 
    "title": "Updated title", 
    "author": "Updated author" 
} 

:

public IHttpActionResult Put(int id, [FromBody]Book book) 
{ 
    //Update book with id == id with info from book 
} 

Dann können Sie eine HTTP-Anfrage an http://myapi.com/api/Books/23 mit einer Anfrage Körper wie senden:

In einem REST-API wird das PUT Verb typischerweise in einer Art und Weise, wie diese umgesetzt Edit:

Eigentlich ist das alles nur das typische Muster. Wenn Sie möchten, können Sie Attribut-based Routing tun und erreichen, was mit Ihnen wollen:

[RoutePrefix("api/Books")] 
public class BooksController : ApiController 
{ 
    [HttpPut] 
    [Route("{address}")] 
    public IHttpActionResult Put(int address) 
    { 

    } 
} 

In diesem Fall Sie attributbasierte Routing verwenden, um zu definieren, was die Route für die Aktionen ist. [RoutePrefix] definiert hier, mit was alle Routen in der Steuerung beginnen sollen.

+0

Ah, ich verstehe es.In meinem Fall habe ich nicht wirklich die Notwendigkeit, eine Anfrage Körper, ich muss nur die Adresse auf den Server mit einer einfachen URL, so vielleicht sollte ich nur einen anderen Controller hinzufügen, sagen "AddressController", und verwenden Sie seine GET-Methode, um das zu tun, was ich brauche? Die Adressenlogik und die Listenlogik (die "Bücher") haben sowieso nichts miteinander zu tun ... – makoshichi

+3

Hat meine Post bearbeitet, wenn Sie das wirklich tun wollen, können Sie das Routing mit dem Attribut Routing hier überschreiben. – juunas

+1

Fantastischer Mann, funktioniert genau so, wie ich es beabsichtigt habe. Ich bin nicht mit dem Web in Verbindung gewesen, da WebForms immer noch eine Sache waren, also verliere ich mich normalerweise, wenn ich etwas erledigen muss. Vielen Dank! – makoshichi