纯 Javascript fetch() 方法到 java Servlet,我如何获取和传递数据?

Posted

技术标签:

【中文标题】纯 Javascript fetch() 方法到 java Servlet,我如何获取和传递数据?【英文标题】:Pure Javascript fetch() method to java Servlet, how do i get and pass data? 【发布时间】:2020-09-13 16:15:51 【问题描述】:

我在尝试从 Servlet 获取数据时遇到问题。 当我通过以下方式调用 servlet 时:

function urlFetchRequest(str, body = null, RequestType = 'GET')
    try
    
        asyncRequest = new XMLHttpRequest();
        asyncRequest.addEventListener("readystatechange", stateChange, false);
        asyncRequest.open(RequestType, str, true);    //   /Test is url to Servlet!
        asyncRequest.send(body);
    
    catch(exception)
    
        alert("Request failed");
    

我从 Servlet 中取回我需要的信息,并且可以通过以下方式使用它:

jsonRes = JSON.parse(asyncRequest.responseText)

这是工作。我的问题是当我需要将数据传递给 servlet 时。所以我尝试用 fetch() 来做,因为我已经读过我可以将 JSON 对象用于 servlet(同样,我不能使用任何 javascript 库,如 jquery)并且我不能使用 servlet 返回的数据。它变得“未定义”。

我使用的 javascript 范围:

 function newFetch(url, options)
    fetch(url, options).then(async (res) => 
        if(res.ok)
            jsonRes = res.
            if(theSurvey === null) 
                surveyLength = Object.keys(jsonRes).length;
                theSurvey = jsonRes;
            
        
    );

我从这里调用它:

returnedObject.SurveyLoader = async () => 
    //urlFetchRequest("/SurveyServlet");
    //await SurveyResults();
    newFetch("/SurveyServlet", 
        method: "GET",
        headers: headers,
    )

我的 servlet 是:

@WebServlet(name = "SurveyServlet", urlPatterns = "/SurveyServlet" )
public class SurveyServlet extends HttpServlet 
    public static final Logger LOGGER = Logger.getLogger("SurveyServlet");
    private BufferedReader m_reader;
    private String m_line;
    public String convertWithStream(Map<String, String> map) 
        String mapAsString = map.keySet().stream()
                .map(key -> '\"' + key + '\"' +  ":" + '\"' + map.get(key) + '\"')
                .collect(Collectors.joining(", ", "", ""));
        return mapAsString;
    

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 

    

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
        Map<String, String> SurveyObj = new LinkedHashMap<>();
        m_reader = new BufferedReader(new FileReader(getServletContext().getRealPath("/poll.txt")));
        m_line = m_reader.readLine();
        SurveyObj.put(Integer.toString(0), m_line);

        int id = 1;
        while((m_line = m_reader.readLine())!=null) 
            SurveyObj.put(Integer.toString(id), m_line);
            ++id;
        
        String str = convertWithStream(SurveyObj);
        response.setContentType("application/json");
        response.setCharacterEncoding("UTF-8");


        //request.setAttribute("ArraySize", id);
       // getServletContext().getRequestDispatcher("ResultServlet").forward(request,response);
        PrintWriter out = response.getWriter();
        out.write(str);
        out.flush();
        out.close();

    

我的问题是关于 fetch 方法。我知道它从 REST API 获取对象。如何使用它从 servlet 传递和获取数据?如何使用发送到 servlet 的数据? 如果不可能,如何使用 XMLHttpRequest 将数据传递给 servlet? (不使用 $)

谢谢。

【问题讨论】:

这有帮助:***.com/questions/35038857/… ? @Pakira 嗨,谢谢。如果我知道如何在 servlet 上使用它,它可能会有所帮助。如何访问并将其更改为 servlet 响应? 【参考方案1】:

它并没有完全回答我的问题,但大部分是: 我成功地找到了一种将 JSON 对象发送到我的 ajax 客户端的方法。

我在客户端使用了这个(url 是我的 servlet 名称,选项仅包含标题(内容类型等):

 function newFetch(url, options)
    fetch(url, options).then(res => res.json()
    ).then((resp) => 
        jsonRes = resp;
        if (theSurvey === null) 
            surveyLength = Object.keys(jsonRes).length;
            theSurvey = jsonRes;
            SurveyResults();
        
    );


在 servlet 中,我使用 javax 库来使用 JSON 对象方法,这样:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
    Map<String, String> SurveyObj = new LinkedHashMap<>();
    m_reader = new BufferedReader(new FileReader(getServletContext().getRealPath("/poll.txt")));
    m_line = m_reader.readLine();
    SurveyObj.put(Integer.toString(0), m_line);

    int id = 1;
    while((m_line = m_reader.readLine())!=null) 
        SurveyObj.put(Integer.toString(id), m_line);
        ++id;
    
    JsonObjectBuilder builder = Json.createObjectBuilder();
    SurveyObj.forEach(builder::add);
    JsonObject obj = builder.build();
   // String str = convertWithStream(SurveyObj);
    response.setContentType("application/json");
    response.setCharacterEncoding("UTF-8");
    try (OutputStream out = response.getOutputStream()) 
        JsonWriter jsonW = Json.createWriter(out);
        jsonW.write(obj);
        jsonW.close();
    

我希望它会在未来对某人有所帮助。无论如何,我仍然面临将 JSON 对象发送到 servlet 并通过我的请求访问它的问题。如果有人可以提供帮助 - 这将是完美的。如果我能找到答案,我会编辑帖子。

谢谢。

编辑:经过大量搜索和尝试,我找到了将数据传递给 servlet 的最佳方法: 1. 在你的 servlet 中添加这个注解:@MultipartConfig 2.在你的客户端,使用“FormData”,就可以在请求体中通过fetch发送:

    let formData = new FormData();
    formData.append("size", surveyLength.toString());
    newFetch('ServletResults', 
        method: "POST",
        //headers: headers,
        body: formData

并且因为@MultipartConfig的注解,servlet知道如何通过“request.getParameter”访问参数

我希望这对将来的某人有所帮助。谢谢大家。

【讨论】:

以上是关于纯 Javascript fetch() 方法到 java Servlet,我如何获取和传递数据?的主要内容,如果未能解决你的问题,请参考以下文章

POST 请求 Fetch API 防止重定向

Javascript fetch 无法从 GMail API Batch 请求中读取 Multipart 响应

如何在 javascript fetch() 方法上传递带有 url 的变量?

从 cURL 到 JavaScript fetch()

将 PHP 异常返回到 javascript FETCH API

使用 JavaScript Fetch 和 POST 发送表单数据,然后在 PHP 中处理它