2016-07-25 5 views
2

Я построил службу API REST с использованием Java Spring Cloud/Boot. Во-первых, я сделал простой класс, связанный с MongoDB и контроллером с сервисом, который должен позволить мне добавлять, удалять, обновлять и получать все объекты. При использовании POSTMAN все они работают, однако, когда я хочу добавить или обновить объект, используя API-интерфейс redux и fetch, я получаю сообщение о статусе 400 и ошибке «плохой запрос». Кажется, что это связано с JSON, который я отправляю в тело, но это точно такой же формат JSON, который работает, например, с POSTMAN.Java REST API Статус ответа 400 на POST/PUT

Мои действия в Redux. Для простоты/тестирования я добавил объект вверху вместо использования объекта, отправляемого со страницы.

var assetObject = { 
    "vendor" : "why dis no work?", 
    "name": "wtf", 
    "version": "231", 
    "category" : "qsd", 
    "technology" : "whatever" 
} 

export function addAsset(access_token, asset) { 
    return dispatch => { 
    fetch(constants.SERVER_ADDRESS + '/as/asset/add', 
     { 
     method: 'POST', 
     credentials: 'include', 
     headers: { 
      'Authorization': 'Bearer' + access_token, 
      'Content-Type': 'application/json' 
     }, 
     body: assetObject 
     }) 
     .then(res => dispatch({ 
     type: constants.ADD_ASSET, 
     asset 
     })) 
    } 
} 

код контроллера в Java Spring:

@RequestMapping(method = RequestMethod.POST, path = "/add") 
public void addAsset(@RequestBody Asset asset) { 
    assetService.addAsset(asset); 
} 

Состояние нормально, делая это в почтальона:

postman request

Я получаю ошибку при использовании Redux/Fetch API (я только удалена структура каталогов, поскольку в нем есть название компании):

request error in browser

Застряли на этом какое-то время, любая помощь очень ценится!

EDIT Asset Объект:

import org.springframework.data.annotation.Id; 
import org.springframework.data.mongodb.core.mapping.Document; 

@Document(collection = "assets") 
public class Asset { 

    @Id 
    private String id; 

    private String vendor; 
    private String name; 
    private String version; 
    private String category; 
    private String technology; 

    public Asset() { 
    } 

    public Asset(String id, 
       String vendor, 
       String name, 
       String version, 
       String category, 
       String technology) { 
     this.id = id; 
     this.vendor = vendor; 
     this.name = name; 
     this.version = version; 
     this.category = category; 
     this.technology = technology; 
    } 

    public String getId() { 
     return id; 
    } 

    public String getVendor() { 
     return vendor; 
    } 

    public String getName() { 
     return name; 
    } 

    public String getVersion() { 
     return version; 
    } 

    public String getCategory() { 
     return category; 
    } 

    public String getTechnology() { 
     return technology; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    public void setVendor(String vendor) { 
     this.vendor = vendor; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public void setVersion(String version) { 
     this.version = version; 
    } 

    public void setCategory(String category) { 
     this.category = category; 
    } 

    public void setTechnology(String technology) { 
     this.technology = technology; 
    } 
} 
+0

вы можете копировать/вставить объект Java Asset? –

+0

Добавлен код. – Matthias

+0

вам не хватает ID в вашем json, получая 400. Не могли бы вы попробовать и сообщить мне результат? –

ответ

2

Ваше сообщение об ошибке говорит:

; требуется тело запроса отсутствует

я думаю, что ошибка происходит, когда ваш controller метода пытается сформировать объект из входящего запроса.

при отправке запроса у вас есть set каждое поле, связанное с объектом. Если вы планируете не устанавливать свойство, вы должны пометить это поле с помощью аннотации @JsonIgnore.

вы можете использовать аннотацию @JsonIgnore на переменную, которая будет игнорировать это свойство при формировании объекта, а также при выводе объекта.

использование @JsonIgnore аннотацию на setter method, что я думаю, что вы должны сделать сейчас, так как вы игнорируете id property при выполнении запроса.

@JsonIgnore 
public void setId(String id) { 
     this.id = id; 
} 

и вы можете вернуться httpstatus код из controller method, так, что клиент знает, запрос был успешно

@ResponseBody 
public ResponseEntity<String> addAsset(@RequestBody Asset asset) { 
return new ResponseEntity<String>("your response here", HttpStatus.OK); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^