如何缩短 Restful 服务的 URL

How to shorten the URL for a Restful service

我有一个使用 Netbeans 开发的 Maven java Web 应用程序。我已经想出 运行 一个基于参数的 Restful 服务成功。

URL 包含三个名称,在提供参数之前用斜线分隔。

http://localhost:8080/chims/api/data/list?name=district_list

我能有一个 URL 少一些斜杠吗,比如

http://localhost:8080/chims/data?name=district_list

这是应用配置文件。

package org.netbeans.rest.application.config;

import javax.ws.rs.core.Application;

@javax.ws.rs.ApplicationPath("api")
public class ApplicationConfig extends Application {


  
   
    
}

这是服务文件。

package lk.gov.health.phsp.ws;

import java.util.List;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.UriInfo;
import javax.ws.rs.Produces;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import lk.gov.health.phsp.bean.AreaApplicationController;
import lk.gov.health.phsp.entity.Area;
import lk.gov.health.phsp.enums.AreaType;
import org.json.JSONArray;
import org.json.JSONObject;

@Path("data")
@RequestScoped
public class ApiResource {

    @Context
    private UriInfo context;

    @Inject
    AreaApplicationController areaApplicationController;

    /**
     * Creates a new instance of GenericResource
     */
    public ApiResource() {
    }

    @GET
    @Path("list")
    @Produces(MediaType.APPLICATION_JSON)
    public String getJson(@QueryParam("name") String name) {
        JSONObject jSONObjectOut;
        if (name == null || name.trim().equals("")) {
            jSONObjectOut = errorMessageInstruction();
        } else {
            switch (name) {
                case "district_list":
                    jSONObjectOut = districtList();
                    break;
                default:
                    jSONObjectOut = errorMessage();
            }
        }
        String json = jSONObjectOut.toString();
        return json;
    }

    private JSONObject districtList() {
        JSONObject jSONObjectOut = new JSONObject();
        JSONArray array = new JSONArray();
        List<Area> ds = areaApplicationController.getAllAreas(AreaType.District);
        for (Area a : ds) {
            JSONObject ja = new JSONObject();
            ja.put("district_id", a.getCode());
            ja.put("district_name", a.getName());
            array.put(ja);
        }
        jSONObjectOut.put("data", array);
        jSONObjectOut.put("status", successMessage());
        return jSONObjectOut;
    }

    private JSONObject successMessage() {
        JSONObject jSONObjectOut = new JSONObject();
        jSONObjectOut.put("code", 200);
        jSONObjectOut.put("type", "success");
        return jSONObjectOut;
    }

    private JSONObject errorMessage() {
        JSONObject jSONObjectOut = new JSONObject();
        jSONObjectOut.put("code", 400);
        jSONObjectOut.put("type", "error");
        jSONObjectOut.put("message", "Parameter name is not recognized.");
        return jSONObjectOut;
    }
    
    
    private JSONObject errorMessageInstruction() {
        JSONObject jSONObjectOut = new JSONObject();
        jSONObjectOut.put("code", 400);
        jSONObjectOut.put("type", "error");
        jSONObjectOut.put("message", "You must provide a value for the parameter name.");
        return jSONObjectOut;
    }

}

我没有对 web.xml 文件进行任何更改。我经历的所有教程都没有让我清楚地了解我必须如何以及为什么必须更改它。即使不更改它,Web 服务也会按预期工作。

如何减少 URL 中的斜杠?

您可以做的第一件事是删除 @Path("list")。 GET 到 /data 将自动转到 getJson 方法。

接下来您可以删除 api。您可以通过将 "api" 更改为 """/""/*" 来执行此操作。这三个都将产生相同的 "/*"。当您这样做时会发生什么,Jersey 现在将接受 all 到达服务器的请求(以及相同的上下文)。将无法访问任何其他 servlet 或静态内容。

为了解决这个问题,您可以将 Jersey 配置为 运行 作为 servlet 过滤器而不是 servlet。然后将其配置为转发未知请求。请参阅 this post 了解如何配置它。