【问题标题】:HTTP client - HTTP 405 error "Method not allowed". I send a HTTP Post but for some reason HTTP Get is sentHTTP 客户端 - HTTP 405 错误“方法不允许”。我发送了一个 HTTP Post,但由于某种原因发送了 HTTP Get
【发布时间】:2010-03-22 19:34:34
【问题描述】:

我正在使用 apache 库。我创建了一个向 servlet 发送发布请求的类。我已经为客户端设置了参数,并创建了一个要发送的 HTTP post 对象,但是由于某种原因,当我执行请求时,我得到一个回复​​,说不支持 get 方法(这是真的,因为我只做了我的 servlet 中的一个 dopost 方法)。似乎正在发送获取请求,但我不知道为什么。 post方法以前有效,但由于我没有设置协议版本,我开始gettng http错误417“预期失败”,但我通过添加参数解决了这个问题。

下面是我的课程,您可以在其中看到正在创建和执行的 HTTPpost 对象。我有一个响应处理程序方法,但我将其从下面的代码中取出,因为它与我的问题无关。

由于返回的响应消息说,我知道正在发送 HTTP GET。请求的资源不允许使用指定的 HTTP 方法(此 URL 不支持 HTTP 方法 GET)。

提前致谢。

P.s 我正在为 android 开发。

public class HTTPrequestHelper {

private final ResponseHandler<String> responseHandler;
private static final String CLASSTAG = HTTPrequestHelper.class.getSimpleName();
private static final DefaultHttpClient client;
static{

    HttpParams params = new BasicHttpParams();      
      params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
      params.setParameter(CoreProtocolPNames.HTTP_CONTENT_CHARSET, HTTP.UTF_8);
      ///params.setParameter(CoreProtocolPNames.USER_AGENT, "Android-x");      
      params.setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 15000);
      params.setParameter(CoreConnectionPNames.STALE_CONNECTION_CHECK, false);

      SchemeRegistry schemeRegistry = new SchemeRegistry();
      schemeRegistry.register(
               new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));

      schemeRegistry.register(
               new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));



      ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager(params, schemeRegistry);

      client = new DefaultHttpClient(cm,params);   

}



public HTTPrequestHelper(ResponseHandler<String> responseHandler) {
this.responseHandler = responseHandler;
}

public void performrequest(String url, String para)
{

    HttpPost post = new HttpPost(url);

    StringEntity parameters;
    try {

        parameters = new StringEntity(para);

        post.setEntity(parameters);
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    BasicHttpResponse errorResponse =
        new BasicHttpResponse(
        new ProtocolVersion("HTTP_ERROR", 1, 1),
        500, "ERROR");

    try {

        client.execute(post, this.responseHandler);
        }
    catch (Exception e) {
        errorResponse.setReasonPhrase(e.getMessage());
    try {
        this.responseHandler.handleResponse(errorResponse);
        }
    catch (Exception ex) {
             Log.e( "ouch", "!!! IOException " + ex.getMessage() );
        }
    }


}

我尝试将允许标头添加到请求中,但效果不佳,但我不确定我是否做得对。下面是代码。

client.addRequestInterceptor(new HttpRequestInterceptor() {
            @Override
            public void process(HttpRequest request, HttpContext context)
                    throws HttpException, IOException {
                //request.addHeader("Allow", "POST");

            }
         });

【问题讨论】:

    标签: java web-services apache http httpclient


    【解决方案1】:
    1. 您怎么知道HTTP GET 实际正在发送?检查客户端发送或服务器接收的 http 数据包会有所帮助
    2. 在构造 Post 的参数时捕获并吞下 UnsupportedEncodingException - 如果在设置参数时遇到此异常会发生什么?您现在的代码仍将尝试执行POST

    【讨论】:

    • 1.响应消息说正在发送一个 get。另外我将如何检查http数据包。 2. 哪些参数有这些异常需要捕获。谢谢
    • 对于 1,您应该排除服务器正在发送不正确的错误消息,这使情况变得混乱。检查服务器上的访问日志(如果有),或者您可以在 httpclient 中启用详细日志记录以查看它通过网络发送的所有数据 - 或使用像 WireShark 这样的数据包嗅探工具。
    • 嗨,马特,感谢您的帮助。我是 Uni 的一名学生,我无法访问服务器日志,我刚刚尝试了 wireshark,但它让我崩溃了,说实话,我什至不知道我在寻找什么。关于它可能是什么的任何想法。 O 和我不断收到来自服务器的请求的资源不允许指定的 HTTP 方法(此 URL 不支持 HTTP 方法 GET)响应。
    猜你喜欢
    • 1970-01-01
    • 2017-10-16
    • 2018-12-20
    • 2019-03-31
    • 2020-07-19
    • 2011-06-21
    • 2015-04-26
    • 1970-01-01
    • 2014-09-22
    相关资源
    最近更新 更多