Java 通过restletapi调用restfulws

Java 通过restletapi调用restfulws,java,web-services,restlet,Java,Web Services,Restlet,我试图从我的客户机代码(基于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 =

我试图从我的客户机代码(基于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);
}
publicstaticvoidmain(字符串[]args)引发异常{

字符串serviceUrl=”http://localhost:8080/MPosBEService“+BeServicePath.MERCHANT_注册;
//字符串serviceUrl=”http://192.168.101.124:8081/be“+BeServicePath.MERCHANT_注册; ClientResource客户端=新的ClientResource(serviceUrl); addHeaders(客户端); objectMapper=新的objectMapper(); objectMapper.configure(Feature.FAIL_ON_UNKNOWN_属性,false); configure(SerializationConfig.Feature.FAIL\u在\u空\u bean上,false); 试一试{ 表单=新表单(); 表格集(“用户名”、“意向网”); 表格设置(“密码”、“1111”); client.post(form,MediaType.APPLICATION_JSON);//**这一行是罪魁祸首** //client.post(new-MerchantRegisterRequestPojo(“intendanet”,“1111”),MediaType.APPLICATION_JSON); }捕获(例外e) { System.out.println(e.getLocalizedMessage()); 投掷e; } Response=client.getResponse(); if(response.getStatus().getCode()==200) { m=反序列化JSON((HttpEntity)response.getEntity(),MerchantPojo.class); System.out.println(“结果:+m.id”); }否则{ System.out.println(“异常:+response.getStatus().getCode()); 抛出新的HttpStatusException(response.getStatus().getCode()); } } 静态私有void addHeaders(ClientResource客户端){ client.getRequestAttributes().put(BeServiceHTTPHeader.REQ\u MPOS\u BE\u SERVICE\u LANGUAGE\u ID.toString(),“1”+”); client.getRequestAttributes().put(BeServiceHTTPHeader.REQ\u MPOS\u BE\u SERVICE\u DEVICE\u APP\u VERSION.toString(),“1”+”); client.getRequestAttributes().put(BeServiceHTTPHeader.REQ\u MPOS\u BE\u SERVICE\u DEVICE\u GENERATED\u ID.toString(),“flskdjf9ksmflskmfl”); client.getRequestAttributes().put(BeServiceHTTPHeader.REQ\u MPOS\u BE\u SERVICE\u DEVICE\u INFO.toString(),“ovo je moj DEVICE!”); } 静态私有T反序列化json(HttpEntity json,类targetType)引发异常{ 返回objectMapper.readValue(EntityUtils.toString(json),targetType); }

谢谢

我不知道您的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!");
}
希望有帮助,
Thierry

告诉我们有关服务器的更多信息。它需要什么样的请求?BeServicePath.MERCHANT\u注册的内容是什么?可能您错过了一个
/
?服务器是运行在192.168.101.124(远程服务器)或本地主机上的Tomcat。我尝试了两个url,但得到了相同的异常。它希望收到一个应用程序/x-www-form-urlencoded mime type.BeServicePath.MERCHANT\u注册被定义为/MERCHANT/register,所以我认为url是可以的。但是您的请求mime类型是application/json,为什么不试试这个:
client.post(form,MediaType.APPLICATION\u form\u URLENCODED);
谢谢您的建议,但它仍然不起作用。首先,我必须使用MediaType.APPLICATION\u WWW\u form(MediaType.APPLICATION\u form\u URLENCODED无法编译)第二,Restlet文档说post方法的第二个参数表示响应mime类型,而不是请求类型,我的响应mime应该是application/json和request-application/www-form(尽管此异常是从org.restlet.resource.ServerResource.doHandle(ServerResource.java:517)中的NPE映射而来的,但感谢您提供有关您的问题的其他提示!我们可以给我您使用的restlet版本吗?这样我就可以进行更多测试来重现您的问题;-)蒂埃里,谢谢你的帮助。现在,在localhost上,我得到了204状态(无内容)因此,标题现在很好。我使用org.apache.httpapi重写了整个代码,它工作正常。我得到了预期的json响应。我会在找到时间后对restlet代码进行更多测试。很高兴听到这一点!方法
post
的第二个参数是正确的。它实际上对应于标题的内容
接受
并指定预期的响应格式。
// 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));