Как устранить ошибку Java resttemplate с картой вместо действительной json неправильного запроса 400 - PullRequest
0 голосов
/ 07 августа 2020

Я программирую приложение Spring Boot, которое должно отправить JSON через POST-запрос моему REST-API.

Мой класс контроллера выглядит так:

package com.example.workflow;

import jdk.jfr.ContentType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class CallController {

    @Autowired
    private CallService callService;

    @GetMapping("/calls")
    public List<Call> getAllCalls(){
        return callService.getAllCallList();
    }

    @PostMapping(value = "/calls")
    public void addCall(@RequestBody Call call){
        callService.addCall(call);
    }
}

My Класс обслуживания выглядит так:

package com.example.workflow;

import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

@Service
public class CallService {
    private List<Call> callList = new ArrayList<>(Arrays.asList(new Call("33333301","61","Test",
            "Test","Test","Test","Test","Test","Test","Test",
            "Test","Test","Test","Test","Test","Test","Test",
            "Test","Test","Test","Test","Test","Test",
            "Test","Test","Test","Test","Test","Test",
            "Test","Test","Test"),new Call("33333302","61","Test",
            "Test","Test","Test","Test","Test","Test","Test",
            "Test","Test","Test","Test","Test","Test","Test",
            "Test","Test","Test","Test","Test","Test",
            "Test","Test","Test","Test","Test","Test",
            "Test","Test","Test")));

    public List<Call> getAllCallList() {
        return callList;
    }

    public void addCall(Call call) {
        callList.add(call);
    }
}

Мой вызов класса модели. java выглядит как:

package com.example.workflow;

public class Call {
    String tcpident, requestid, mclass, mno, errorstate, datalength, resourceid, ono, opos,
            wpno, opno, bufno, bufpos, carrierid, palletid, palletpos, pno, oposid, stepno,
            maxrecords, boxid, boxpos, mainopos, beltno, cno, boxpno, palletpno,aux1int,
            aux2int,aux1dint,aux2dint,mainpno;

    public Call() {
    }

    public Call(String tcpident, String requestid, String mclass, String mno, String errorstate, String datalength,
                String resourceid, String ono, String opos, String wpno, String opno, String bufno, String bufpos,
                String carrierid, String palletid, String palletpos, String pno, String oposid, String stepno,
                String maxrecords, String boxid, String boxpos, String mainopos, String beltno, String cno,
                String boxpno, String palletpno, String aux1int, String aux2int, String aux1dint,
                String aux2dint, String mainpno) {
        this.tcpident = tcpident;
        this.requestid = requestid;
        this.mclass = mclass;
        this.mno = mno;
....+getter and setter

Теперь я пытаюсь выполнить POST-вызов к моему API через Java . Я использую Resttemplate, но у меня есть только карта, если я попытаюсь выполнить POST-вызов, я получу код состояния HTTP 400 Bad Request Invalid JSON.

Я пытаюсь сделать это так :

public void post() throws JsonProcessingException {
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        MultiValueMap<String, String> parameters = new LinkedMultiValueMap<>();
        parameters.add("tcpident","1");
        parameters.add("requestid","2");
        parameters.add("mclass","3");
        parameters.add("mno","4");
        parameters.add("errorstate","5");
        parameters.add("datalength","6");
        parameters.add("resourceid","1");
        parameters.add("ono","2");
        parameters.add("opos","3");
        parameters.add("wpno","23");
        parameters.add("opno","ddsds");
        parameters.add("bufno","d");
        parameters.add("bufpos","ds");
        parameters.add("carrierid","dsdd");
        parameters.add("palletid","dsd");
        parameters.add("palletpos","dsd");
        parameters.add("pno","dsd");
        parameters.add("oposid","ds");
        parameters.add("stepno","dsd");
        parameters.add("maxrecords","dsd");
        parameters.add("boxid","dsd");
        parameters.add("boxpos","dsd");
        parameters.add("mainopos","dsds");
        parameters.add("eltno","dsd");
        parameters.add("cno","dsd");
        parameters.add("boxpno","ds");
        parameters.add("palletpno","dsd");
        parameters.add("aux1int","ds");
        parameters.add("aux2int","ds");
        parameters.add("aux1dint","dsdsd");
        parameters.add("aux2dint","dsd");
        parameters.add("mainpno","dsod");
        HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(parameters,headers);
        System.out.println("Headers:  "+request.getHeaders());
        System.out.println("Body:    "+request.getBody());
        //Call call = mapper.convertValue(request, Call.class);
        //Call call = restTemplate.postForObject("http://localhost:8080/calls", request,Call.class);
        ResponseEntity<Call[]> response = restTemplate.postForEntity("http://localhost:8080/calls", request, Call[].class);
    }

напечатанные мной запрос и заголовки:

Headers:  [Content-Type:"application/json"]
Body:    {tcpident=[1], requestid=[2], mclass=[3], mno=[4], errorstate=[5], datalength=[6], resourceid=[1], ono=[2], opos=[3], wpno=[23], opno=[ddsds], bufno=[d], bufpos=[ds], carrierid=[dsdd], palletid=[dsd], palletpos=[dsd], pno=[dsd], oposid=[ds], stepno=[dsd], maxrecords=[dsd], boxid=[dsd], boxpos=[dsd], mainopos=[dsds], eltno=[dsd], cno=[dsd], boxpno=[ds], palletpno=[dsd], aux1int=[ds], aux2int=[ds], aux1dint=[dsdsd], aux2dint=[dsd], mainpno=[dsod]}

Если я делаю POST-вызов через POSTMAN на мой RESTAPI, он работает, я использую JSON вот так :

{
  "tcpident": "00110011",
  "requestid": 47,
  "mclass": false,
  "mno": null,
  "errorstate": null,
  "datalength": null,
  "resourceid": null,
  "ono": null,
  "opos": null,
  "wpno": null,
  "opno": null,
  "bufno": null,
  "bufpos": null,
  "carrierid": null,
  "palletid": null,
  "palletpos": null,
  "pno": null,
  "oposid": null,
  "stepno": null,
  "maxrecords": null,
  "boxid": null,
  "boxpos": null,
  "mainopos": null,
  "beltno": null,
  "cno": null,
  "boxpno": null,
  "palletpno": null,
  "aux1int": null,
  "aux2int": null,
  "aux1dint": null,
  "aux2dint": null,
  "mainpno": null
}

Ответы [ 2 ]

1 голос
/ 07 августа 2020

MultiValueMap следует использовать для отправки данных формы с медиа-типом APPLICATION_FORM_URLENCODED. Ваш случай - запрос JSON, и вы можете попробовать использовать JSONObject.

Пример ::

JSONObject jsonObject= new JSONObject();
jsonObject.put("tcpident", "00110011");
jsonObject.put("requestid", "47");
... more params

HttpEntity<String> request = 
  new HttpEntity<String>(jsonObject.toString(), headers);

 restTemplate.postForEntity("http://localhost:8080/calls", request, Call[].class);
0 голосов
/ 07 августа 2020

Пробовали с: MultiValueMap параметры = новый LinkedMultiValueMap <> (); ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...