json - 后端只接受纯文本,不接受 JSON,只接受名称而不是 id

标签 json angular rest http glassfish

所以我想以JSON格式向后端发送数据。用户必须从数据列表中选择一个选项,然后 id 和名称将被发送到 REST 服务器。当我从数据列表中发送所选选项的 ID 和名称时,它会给我一条错误消息:内部服务器错误 500 和语法错误:JSON.parse:JSON 数据第 1 行第 1 列中的意外字符。

我编辑了数据,仅通过 mozilla 调试选项将名称发送到服务器,然后它接受带有 201 响应的 POST 请求。当我只发送一个 id 时,它会给出相同的 500 内部服务器错误响应。 为什么它只在我发送名称时接受它?如何更改它以便 Get 请求显示 ID 和名称?

我将 Angular 7 用于前端,将 glassfish REST 服务器用于后端。我希望有一个人可以帮助我。 我在一个 JSON 检查器中检查了 JSON 格式,它通过了测试。我将在评论中提供一些照片来向您展示我的意思。

这是我要发送的示例:

{"id":3,"name":"Burger King"}

它只接受什么:

{"name":"Burger King"}

前端

HTML 文件:

<label for="codes">Choose a restaurant:</label>
    <form
      (ngSubmit)="onOrganize(f)"
      #f="ngForm">
      <input type="text"  list="codes"  [(ngModel)]=codeValue [ngModelOptions]="{standalone: true}" (change)="saveCode($event)">
      <datalist id="codes">
        <option *ngFor="let c of codeList" [value]="c.name" >{{c.name}}</option>
      </datalist>
    </form>

typescript 文件:

export class OrganizeComponent implements OnInit {

  public codeValue: string;

  codeList = [
    { restaurantId: 1, name: 'Mcdonalds' },
    { restaurantId: 2, name: 'Kentucky Fried Chicken' },
    { restaurantId: 3, name: 'Burger King' },
    { restaurantId: 4, name: 'Dominos pizza' },
    { restaurantId: 5, name: 'New York Pizza' }
  ];


  @ViewChild('f') form: NgForm;
  restaurant = {
    restaurantId: 1,
    name: " "
  };
   httpOptions = {
    headers: new HttpHeaders({
      'Content-Type':  'application/json',
      'Authorization': 'my-auth-token'
    })
  };


  constructor(private http: HttpClient) {
  }

  ngOnInit() {
  }

  public saveCode(e): void {
    let name = e.target.value;
    let list = this.codeList.filter(x => x.name === name)[0];



    this.restaurant.restaurantId =  list.restaurantId;
    this.restaurant.name = list.name;

console.log(list.restaurantId);
console.log(list.name);



    const httpOptions = {
      headers: new HttpHeaders({
        'Content-Type':  'application/json'
      })
    };

    const data = {
      id: list.restaurantId,
      name: list.name
    };

    console.log(data)
    var yourDataStr = JSON.stringify(data)

    this.http.post('http://localhost:8080/aquadine-jee/resources/restaurant',
      JSON.parse(JSON.stringify(data)) , httpOptions)


      .subscribe( // subscribe to observable http.post
        res => {
          console.log("response" + " " + res); // log results otherwise log error
        },
        err => {
          console.log('Error occured');
        }
      );
  }

后端

餐厅文件:

@Entity
@NamedQueries({
        @NamedQuery(name = "Restaurant.findOne", query = "select m from Restaurant m where m.id = :id"),
        @NamedQuery(name = "Restaurant.getAll", query = "select m from Restaurant m")
})
public class Restaurant {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;


//    @NotBlank
    private String naam;


//    @NotBlank
    private String adres;


    private int restaurantId;

    public Restaurant(){

    }


   public Restaurant( int id, int restaurantId, String naam) {
        this.id = id;
        this.restaurantId = restaurantId;
        this.naam = naam;
    }

 @GET
    @Produces("application/json")
        public Response all(){
             List<Restaurant> all = repositoryService.getAllRestaurants();
            return Response
                    .status(200)
                    .header("Access-Control-Allow-Origin", "*")
                    .entity(all)
                    .build();
        }


    @POST
    @Consumes("application/json")
    public Response save(Restaurant restaurant){
        repositoryService.save(restaurant);
        return Response
                .status(201)
                .build();
    }

存储库文件

// Restaurant services
    public List<Restaurant> getAllRestaurants(){

        return entityManager.createNamedQuery("Restaurant.getAll", Restaurant.class).getResultList();

    }

    public Restaurant find(Integer id){

        return entityManager.createNamedQuery("Restaurant.findOne", Restaurant.class).setParameter("id", id).getSingleResult();

    }

    public void save(Restaurant restaurant){
        entityManager.persist(restaurant);
    }
    public void update(Restaurant restaurant){
        entityManager.merge(restaurant);
    }
    public void delete(Restaurant restaurant){
        entityManager.remove(restaurant);
    }

最佳答案

当您在后端使用 Modal 类接收时,您发送的数据应映射到模型类。例如:

Backend naming conversion should be same as receiving data

您正在发送

{"id":3,"name":"Burger King"}

这样模型类

映射模型类

class Restaurant{
    Integer id; 
    String name; // your variable name is naam, so it won't map

    //Getters and setters
    //constructor -- You should have argument constructor 
}

您正在发送name,但模型类naam中存在拼写错误

关于json - 后端只接受纯文本,不接受 JSON,只接受名称而不是 id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56266188/

相关文章:

json - 如何将 akka http 请求实体解码为字符串?

ios - 带有对象和键的 UIPicker 使用 JSON

javascript - 按最小长度、最大长度、电子邮件、数字、必需等方式验证表格。angular 2

angular - 如何使用 systemjs 在 Angular 2 中使用 require()?

java - MessageBody写入器/读取器

ajax - Laravel 中的 PATCH AJAX 请求

jquery - 获取给定 jQuery <tr> 对象的 <td> 值字符串

jquery - Json ajax 带参数传递

angular - 如何将 angular 项目从 vscode 发布到 stackblitz?

zend-framework - 使用 Zend_http_Client 获取响应主体