Вызов сервлета через приложение React с использованием Fetch API - Ошибка загрузки ресурса (406 - Недопустимо) - PullRequest
0 голосов
/ 09 декабря 2018

Я очень новичок в React JS и Java-сервлетах.Я создал представление в React и конечную точку API в сервлете, используя Джерси.И фронтенд, и бэкэнд запускаются на сервере Tomcat на моей локальной машине.Сервлет пытается получить доступ к службе, работающей на http://localhost:37070/expenseClaimService/start, чтобы опубликовать новую заявку.Эта служба тестируется отдельно и возвращает id новой созданной заявки.

Теперь я пытаюсь вызвать конечную точку в сервлете, используя Fetch из приложения React.Однако я продолжаю получать Failed to load resource: the server responded with a status of 406 в приложении React.

error

вызов выборки в приложении React

  handleAddClaim = () => {
    console.log("in method");
    fetch("http://localhost:8080/eca/api/claims/new-claim", {
      method: "POST",
      headers: {
        Accept: "text/plain",
        "Content-Type": "application/json",
        "Access-Control_Allow-Orign": "*"
      },
      body: JSON.stringify({
        empName: "Test Vendor4",
        empFirstname: "Test",
        empLastname: "Vendor4",
        empEmail: "test4@mail.com",
        empId: "test3",
        empJobTitle: "SE",
        date: "08 December, 2018",
        refNo: "testRef999",
        memo: "OPD test claim 11",
        claims: [
          {
            amount: "9500.00",
            memo: "Test claim - Medicine",
            billDate: "4 December, 2018"
          }
        ]
      })
    })
    .then(response => {
        console.log(response);
    })
    .catch(error => {
        console.error(error);
    });
  };

Конечная точка в сервлете

@Path("/claims")
public class OPDClaimEndpoint {

    @POST
    @Path("/new-claim")
    @Produces(MediaType.TEXT_HTML)
    @Consumes(MediaType.APPLICATION_JSON)
    public String addNewClaim(JsonObject body){            
        return ExecutionUtils.generatePostRequest(body.toString());
    }
}

Генерация почтового запроса (с использованием Apache HttpClient)

public static String generatePostRequest(String input){
    String url = "http://localhost:37070/expenseClaimService/start";

    try {
        StringEntity requestEntity = new StringEntity(
                input,
                ContentType.APPLICATION_JSON);

        HttpPost request = new HttpPost(url);
        request.setHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON);
        request.setEntity(requestEntity);
        HttpClient client = HttpClientBuilder.create().build();
        HttpResponse response = client.execute(request);
        return response.toString();
    }
    catch ( IOException e) {
        logger.info(e.getMessage());
    }
    return "Failed";
}

web.xml

<servlet>
    <servlet-name>eca-api</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>com.org.eca.client.api.endpoint</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
        <param-value>true</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>eca-api</servlet-name>
    <url-pattern>/api/*</url-pattern>
</servlet-mapping>

Как мне решить эту проблему, чтобы я мог вызвать службу из приложения React?Любая помощь очень ценится.

Ответы [ 3 ]

0 голосов
/ 09 декабря 2018

Вам необходимо отправить JSON тип, поэтому замените ACCEPT на CONTENT_TYPE

request.setHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON);

На:

request.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON);

Имя поля заголовка HTTP Content-Type.

0 голосов
/ 09 декабря 2018

Наконец-то нашли решение!

В лог-файлах tomcat видно, что Джерси не поддерживает JsonObject of Gson.

enter image description here

Как это SO answer указывает, что Джерси поддерживает только нативные типы и String в качестве входных данных в их методах.Поэтому я изменил сигнатуру метода конечной точки, чтобы она принимала Strings, public String addNewClaim(String body), и теперь она работает даже с громоздкой строкой Json.(Обратите внимание, что это в Джерси 1.19, в Джерси 2.x оно может быть другим).Однако он может принимать объекты Java, как сказано в этом ответе .

0 голосов
/ 09 декабря 2018

Глядя на ваш выборочный вызов и конечную точку сервлета, ваши @Produces аннотации указывают, что сервлет будет выдавать "text / html", в то время как вызов Fetch указывает, что он будет принимать только тип "text / plain" (заголовок "Accept").

Попробуйте изменить хотя бы один из них (в зависимости от того, что вам нужно), чтобы соответствовать друг другу, и проблема должна быть решена.

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