POST / PUT上的Java Spring REST API状态400响应

时间:2016-07-25 11:42:34

标签: java spring rest fetch-api

我使用Java Spring Cloud / Boot构建了一个REST API服务。首先,我创建了一个简单的类连接到MongoDB和一个带有服务的控制器,它应该允许我添加,删除,更新和获取所有对象。当使用POSTMAN时,这些都可以工作,但是当我想使用redux和fetch API添加或更新对象时,我得到状态400和“错误请求”错误。这似乎与我在身体中发送的JSON有关,但它与使用例如POSTMAN的JSON格式完全相同。

我在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中执行状态时确定正常:

postman request

使用Redux / Fetch API时出现的错误(我只删除了目录结构,因为它有公司名称):

request error in browser

已经坚持了一段时间,非常感谢任何帮助!

编辑资产对象:

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

1 个答案:

答案 0 :(得分: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);
}