【问题标题】:Getting 405 error when making a HTTP get request to a webservice向 Web 服务发出 HTTP 获取请求时出现 405 错误
【发布时间】:2017-05-19 23:36:50
【问题描述】:

我正在从一个基本的 java 程序向一个恰好是 "http://localhost:9992/users/john.doe@example.com" 的 URL 发出 HTTP GET 请求:

public class Tester {
    public static void main(String[] args) {
        HttpRequester.doesUserExist("john.doe@example.com");
    }
}

HTTPRequester 的实现是这样的:

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class HttpRequester {
    private static HttpURLConnection connection = null;

    public static boolean doesUserExist(final String email) {
    final String targetUrl = Constants.URL_USER_SRVC +  email;
    System.out.println(targetUrl);
    try {
        URL url = new URL(targetUrl);
        connection = (HttpURLConnection) url.openConnection();
        System.out.println(connection.getRequestMethod());
        connection.setRequestMethod("GET");
        connection.setRequestProperty("Content-Type", "application/json");
        connection.setUseCaches(false);
        connection.setDoOutput(true);

        DataOutputStream outputStream = new DataOutputStream(
                connection.getOutputStream());
        outputStream.writeBytes(email);
        outputStream.close();

            InputStream inputStream = connection.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
            StringBuffer response = new StringBuffer();
            String line;
            while((line = reader.readLine()) != null) {
                response.append(line);
                response.append('\r');
            }
            reader.close();
            System.out.println(response.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }
}

嵌入在 Grizzly 服务器中的 Web 服务和以下 API:

@Path("/users")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class UserResource {

    @GET
    public List<User> getUsers() {
        return UserService.getUsers();
    }

    @GET
    @Path("/{userEmail}")
    public User getUser(@PathParam("userEmail") String userEmail) {
        return UserService.getUser(userEmail);
    }
}

请注意,webservice 和 java 程序是两个独立的项目。当我执行 main 方法时,我在控制台中得到这个错误输出:

java.io.IOException: Server returned HTTP response code: 405 for URL: http://localhost:9992/users/john.doe@example.com
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1627)
at com.axa.visualizr.auth.utils.HttpRequester.doesUserExist(HttpRequester.java:30)
at com.axa.visualizr.auth.core.Tester.main(Tester.java:8)

我认为奇怪的是,即使我导入了java.net.HttpURLConnection;,错误也会输出这个at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1627)。我已尝试打开该行上的声明,但 Eclipse 声明它不是该类中的有效行号。

我有setRequestMethod("GET")的时候不知道为什么说这个方法是不允许的。也许是因为 java 程序没有在任何类型的服务器上运行? Tester.java 仅用于测试目的,最终我会将HTTPRequester 移至另一个 Web 服务,并从 Web 服务 A 调用 Web 服务 B。

【问题讨论】:

    标签: java web-services rest jax-rs jersey-2.0


    【解决方案1】:

    由于您在 requestbody 中传递了某些内容,因此 java 将其解释为 POST 请求。请从您的代码中删除以下行并尝试:

    DataOutputStream outputStream = new DataOutputStream(
                    connection.getOutputStream());
            outputStream.writeBytes(email);
            outputStream.close();
    

    【讨论】:

      【解决方案2】:

      试试下面的代码:

      final String targetUrl = Constants.URL_USER_SRVC +  URLEncoder.encode(email, "UTF-8");
      

      而不是:final String targetUrl = Constants.URL_USER_SRVC + email;

      【讨论】:

      • 我试过这个。仍然得到同样的错误。它所做的是将“/”转换为“%”
      • 不应将“/”转换为编码字符串。您的电子邮件地址包含“@”,只有它应该被编码。
      • 感谢您的帮助
      猜你喜欢
      • 2014-12-04
      • 1970-01-01
      • 1970-01-01
      • 2014-11-20
      • 1970-01-01
      • 1970-01-01
      • 2021-01-27
      • 2017-09-09
      • 1970-01-01
      相关资源
      最近更新 更多