【问题标题】:Calling RESTful WS via restlet API通过 restlet API 调用 RESTful WS
【发布时间】:2015-01-29 15:25:55
【问题描述】:

我正在尝试从我的客户端代码(基于 Restlet)调用 WS,但我在 client.post 方法上收到错误的请求异常(HTTP 状态代码 400)。

public static void main(String[] args) throws Exception{

    String serviceUrl = "http://localhost:8080/MPosBEService"+BeServicePath.MERCHANT_REGISTRATION;
    //String serviceUrl = "http://192.168.101.124:8081/be"+BeServicePath.MERCHANT_REGISTRATION;
    ClientResource client = new ClientResource( serviceUrl );

    addHeaders( client );

    objectMapper=new ObjectMapper();
    objectMapper.configure(Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    objectMapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);

    try{
        Form form = new Form();
        form.set("username", "intendanet");
        form.set("password", "1111");

        client.post( form, MediaType.APPLICATION_JSON );//**this line is the culprit**

        //client.post(new  MerchantRegisterRequestPojo("intendanet","1111"), MediaType.APPLICATION_JSON );

    }catch(Exception e) 
    {
        System.out.println(e.getLocalizedMessage());
        throw e;
    }

    Response response = client.getResponse();

    if( response.getStatus().getCode() == 200 )
    {
        m = deserializeJson( (HttpEntity)response.getEntity(), MerchantPojo.class );
        System.out.println("Result:" + m.id);
    }else {
        System.out.println("Exception: "+ response.getStatus().getCode());

        throw new HttpStatusException(response.getStatus().getCode());
    }
}

static private void addHeaders(ClientResource client){

    client.getRequestAttributes().put(BeServiceHTTPHeader.REQ_MPOS_BE_SERVICE_LANGUAGE_ID.toString(), "1"+"");
    client.getRequestAttributes().put(BeServiceHTTPHeader.REQ_MPOS_BE_SERVICE_DEVICE_APP_VERSION.toString(), "1"+"");
    client.getRequestAttributes().put(BeServiceHTTPHeader.REQ_MPOS_BE_SERVICE_DEVICE_GENERATED_ID.toString(), "flskdjf9ksmflskmfl");
    client.getRequestAttributes().put(BeServiceHTTPHeader.REQ_MPOS_BE_SERVICE_DEVICE_INFO.toString(), "ovo je moj device!");

}

static private <T> T deserializeJson(HttpEntity json, Class<T> targetType) throws Exception{
    return objectMapper.readValue(EntityUtils.toString(json), targetType);
}

谢谢

【问题讨论】:

  • 告诉我们更多关于服务器的信息。它期望什么样的请求?
  • BeServicePath.MERCHANT_REGISTRATION 的内容是什么,也许你错过了/
  • 服务器是运行在 192.168.101.124(远程服务器)或本地主机上的 Tomcat。我已经尝试了这两个 url,但我得到了同样的异常。它希望收到一个 application/x-www-form-urlencoded mime 类型。
  • BeServicePath.MERCHANT_REGISTRATION 被定义为 /merchant/register 所以我认为 url 很好。
  • 但是你的请求mime类型是application/json,你为什么不试试这个:client.post( form, MediaType.APPLICATION_FORM_URLENCODED);

标签: java web-services restlet


【解决方案1】:

我并不完全符合您的 REST 服务的预期,但我发现您的代码中有两个潜在问题。

首先,您的响应中的标头设置不正确。您应该更新您的方法addHeaders,如下所述:

static private void addHeaders(ClientResource client){
    Series<Header> headers = (Series<Header>) cr.getRequestAttributes().get(
                                     "org.restlet.http.headers");
    if (headers==null) {
        headers = new Series<Header>(Header.class);
        cr.getRequestAttributes().put(
                "org.restlet.http.headers", headers);
    }

    headers.set(BeServiceHTTPHeader.REQ_MPOS_BE_SERVICE_LANGUAGE_ID.toString(), "1");
    headers.put(BeServiceHTTPHeader.REQ_MPOS_BE_SERVICE_DEVICE_APP_VERSION.toString(), "1");
    headers.put(BeServiceHTTPHeader.REQ_MPOS_BE_SERVICE_DEVICE_GENERATED_ID.to String(), "flskdjf9ksmflskmfl");
    headers.put(BeServiceHTTPHeader.REQ_MPOS_BE_SERVICE_DEVICE_INFO.toString(), "ovo je moj device!");
}

其次,您需要注意您发送的内容和相关的媒体类型。你应该有这样的东西:

// With form
Form form = new Form();
form.set("username", "intendanet");
form.set("password", "1111");

client.post(form, MediaType.APPLICATION_FORM_URLENCODED);

// With JSON
JSONObject jsonObj = new JSONObject
jsonObj.put("username", "intendanet");
jsonObj.put("password", "1111");
client.post(new JsonRepresentation(jsonObj));

希望对你有帮助, 蒂埃里

【讨论】:

  • 感谢您的建议,但还是不行。首先,我必须使用 MediaType.APPLICATION_WWW_FORM(MediaType.APPLICATION_FORM_URLENCODED can't compile)。其次,Restlet 文档说 post 方法的第二个参数表示响应 mime 类型,而不是请求类型,我的响应 mime 应该是 application/json 和 request application/www-form。通过您所做的编辑,我得到了一个 http 500 异常(尽管此异常是从 org.restlet.resource.ServerResource.doHandle(ServerResource.java:517) 中的 NPE 映射的)
  • 感谢您提供有关您的问题的更多提示!我们能给我你使用的 Restlet 版本吗?所以我可以做更多的测试来重现你的问题;-)
  • 蒂埃里,感谢您的帮助。现在,在本地主机上,我得到了 204 状态(无内容),所以标题现在很好。我使用 org.apache.http API 重写了整个代码,它工作正常。我得到了预期的json响应。有时间我会用 restlet 代码做更多的测试。
  • 很高兴听到这个消息! post方法的第二个参数你说得对...它实际上对应于标题Accept的内容并指定响应的预期格式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-17
  • 2011-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多