2017-02-13 3 views
1

웹 API로 시작하고 있습니다. (잠시 웹 개발자가 없었기 때문에 아무도 SOAP을 신경 쓰지 않는 것 같습니다.) 그러나 몇 가지 문제가 발생했습니다. PUT하려고합니다.웹 API의 PUT은 항상 서버에 "0"을 넣습니다.

나는 온라인 자습서를 따랐으며 GET 및 DELETE에 잘 작동합니다. 테스트를 위해 우체부에서 테스트 한 다른 서비스에서 호출되므로 우체부를 사용하고 있습니다.

모든 책을 가져 오기 :

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

이 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.")); 
} 

그들 모두 잘 실행 :

// 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.")); 
} 

이 ID에 의해 책을 삭제 여기 GET에 대한 코드는 객체 목록을 반환해야하므로 내 목적을 달성 할 수 있습니다.

BTW, http://localhost/api/Books/1 작품은 꽤 잘 GET 또는 DELETE를 선택하면

을 (난 정말 지금 우체부의 내부 동작에 들어갈 필요가 없습니다)하지만 난 단지 보낼 필요로 나는 PUT 방식을 변경했습니다 이 서비스에 대한 일부 int (주소). 다음은 테스트 코드는 다음과 같습니다과 같은 불리는 경우

// 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)); 
} 

디버깅하는 동안, 매개 변수 "주소"항상 0이됩니다 : http://localhost/api/Books/80 또는 다른 지능. 다시 말해, PUT에 대한 나의 반응은 항상 "값은 0이 될 수 없습니다"입니다. 나는 [FromBody]을 제거하고 [HttpPut] 속성을 PUT 메소드에 추가하려고했지만 상황이 악화됩니다. 나는 그것이 꽤 새롭다는 것을 안다. 그러나 내가 말했던 것처럼, 나는 나이에 웹 dev를 다루지 않았다. 제발 조언.

+2

PUT 작동 방식이 아닙니다. '{ "Housenumber": "42"}'그래서 업데이트 할 리소스의 일부 또는 전체를 푸시합니다. 속성에서 볼 수 있듯이 정수는 본문에서 읽습니다. 이 경우 귀하의 요청 본문은 바로 다음과 같아야합니다 : 주소라는 이름의 정수,'{address : 42}'. – CodeCaster

답변

4

코드는, 당신은 :

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

당신이 수를 포함하는 요청 본문을 보낼 것으로 기대하고있다. 지내는 API에서

는 PUT 동사는 일반적으로 다음과 같은 방식으로 구현됩니다

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

:

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

그런 다음 당신이 같은 요청 본문으로 http://myapi.com/api/Books/23에 HTTP 요청을 보낼 수 있습니다 편집 :

사실이 모든 것은 일반적인 패턴 일뿐입니다. 당신이 원한다면, 당신은 속성 기반 라우팅을하고 당신이 원하는 것을 얻을 수 있습니다이 경우

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

    } 
} 

당신이 경로가 행동에 대한 무엇인지 정의하는 속성 기반 라우팅을 사용합니다. 여기서 [RoutePrefix]은 컨트롤러의 모든 경로가 시작되어야하는 것을 정의합니다.

+0

아, 알겠습니다.제 경우에는 요청 본문이 필요 없습니다. 단순한 URL을 사용하여 서버에 주소를 가져와야하기 때문에 "AddressController"라고 말하면서 다른 컨트롤러를 추가하고 해당 주소를 사용해야합니다. 내가 원하는 걸 할 수있는 방법을 얻으려고? 주소 논리와 목록 논리 ("서적")는 서로간에 아무 관계가 없습니다 ... – makoshichi

+3

내 게시물을 편집했습니다. 실제로 그 작업을 원한다면 속성 라우팅을 사용하여 기본 라우팅 체계를 재정의 할 수 있습니다. – juunas

+1

환상적인 남자, 내가 의도 한대로 작동합니다. 나는 WebForms가 여전히 중요한 일 이었기 때문에 웹과 연락을하지 못했기 때문에 무언가를해야 할 때 대개는 길을 잃는다. 무리 감사! – makoshichi