【问题标题】:REST API | Jersey jar | 405 errorREST API |球衣罐 | 405 错误
【发布时间】:2016-12-10 08:32:26
【问题描述】:

我正在尝试通过 Java 自动化 REST API。为此,我正在使用 Jersy jar。 我用谷歌搜索了足够多的代码,并且能够编写一个不会引发任何异常的代码。但是,当我尝试到达项目的端点并发布请求时,我总是收到 405 - Method not allowed 错误响应。相同的端点在 Soap UI 上返回成功响应。并且不需要标题。媒体类型为 JSON。

基本上,我只是想做 SOAP UI 操作,但是通过 Eclipse。 PS:我是新手,不胜感激。

package sample;

import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.Form;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status.Family;
import org.glassfish.jersey.client.JerseyInvocation.Builder;

public class Sample 
{
    public static void main(String a[])
    {

        Client client = ClientBuilder.newClient();
        WebTarget resource = client.target("https://endpoint-url/Resource");
        Form form = new Form();
        form.param("name", "bond");
        form.param("ID", "007");

        Builder request = (Builder) resource.request();
        request.accept(MediaType.APPLICATION_JSON);

        Response response = request.get();
        if (response.getStatusInfo().getFamily() == Family.SUCCESSFUL) 
        {
            System.out.println("Success! " + response.getStatus());
            System.out.println(response.readEntity(String.class));
        } 
        else 
        {
            System.out.println("ERROR! " + response.getStatus());    
//          System.out.println(response);
            System.out.println(response.readEntity(String.class));
        }
    }

}

【问题讨论】:

  • 这是我得到的输出。状态 - 405 方法不允许。
  • 请分享服务代码
  • 服务代码?你的意思是服务器端的那个?如果是这样,我认为我无法访问它:(
  • 简单:服务器不允许GET请求endpoint-url/Resource
  • 实体将是 JSON 正文。

标签: java rest soap jersey httprequest


【解决方案1】:

接受时的问题,获取资源而不是发布资源 您没有将表单参数传递给资源方法。这就是出现问题的原因。检查下面

public class Sample  {
        public static void main(String a[])
        {

            Client client = ClientBuilder.newClient();
            WebTarget resource = client.target("https://endpoint-url/Resource");
            Form form = new Form();
            form.param("name", "bond");
            form.param("ID", "007");
            Builder request = (Builder) resource.request();
            request.accept(MediaType.APPLICATION_JSON);         
    Response response = request.post(Entity.entity(form,MediaType.APPLICATION_FORM_URLENCODED));
            if (response.getStatusInfo().getFamily() == Family.SUCCESSFUL) 
            {
                System.out.println("Success! " + response.getStatus());
                System.out.println(response.readEntity(String.class));
            } 
            else 
            {
                System.out.println("ERROR! " + response.getStatus());     //          System.out.println(response);
                System.out.println(response.readEntity(String.class));
            }
        }

    }

【讨论】:

  • 谢谢!我尝试修改代码,但出现 400 错误。我什至尝试了Response response = request.post(Entity.entity(form, MediaType.APPLICATION_JSON));Response response = request.post(Entity.form(form));,但我得到了相同的 400 响应 - 服务器在处理请求时遇到错误。有关详细信息,请参阅服务器日志。
  • 我很确定我在我的请求中使用了所有必需的属性(即form.param(attribute,value))和正确的值。
  • 您告诉服务器遇到错误,您在使用 NPE 或其他东西的方法主体中遇到什么错误?。对于上面传递表单参数的 url,它是否适用于 SOAP UI?
  • 我没有收到 NPE 或任何异常。在 Eclipse 控制台上,我没有看到成功响应,而是收到错误响应。如上所述,这就是我所看到的 - '400 - 服务器在处理请求时遇到错误。有关详细信息,请参阅服务器日志'。是的,使用相同的参数,我在 SOAP UI 上获得了相同端点的成功响应。
【解决方案2】:

最后,我找到了代码here,这对我很有帮助:)

下面是工作代码:

package sample;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class JavaNetURLRESTFulClient
{

    private static final String targetURL = "https://endpoint-url/Resource";

    public static void main(String[] args)
    {

        try {

            URL targetUrl = new URL(targetURL);

            HttpURLConnection httpConnection = (HttpURLConnection) targetUrl.openConnection();
            httpConnection.setDoOutput(true);
            httpConnection.setRequestMethod("POST");
            httpConnection.setRequestProperty("Content-Type", "application/json");

            String input = "{\"name\":\"bond\",\"Id\":007}";

            OutputStream outputStream = httpConnection.getOutputStream();
            outputStream.write(input.getBytes());
            outputStream.flush();

            if (httpConnection.getResponseCode() != 200) {
                throw new RuntimeException("Failed : HTTP error code : "
                    + httpConnection.getResponseCode());
            }

            BufferedReader responseBuffer = new BufferedReader(new InputStreamReader(
                    (httpConnection.getInputStream())));

            String output;
            System.out.println("Output from Server:\n");
            while ((output = responseBuffer.readLine()) != null) {
                System.out.println(output);
            }

            httpConnection.disconnect();

          } catch (MalformedURLException e) {

            e.printStackTrace();

          } catch (IOException e) {

            e.printStackTrace();

         }

        }    
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-04
    • 1970-01-01
    • 2014-12-11
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多