Rest 如何将请求主体绑定到操作方法参数?

Rest 如何将请求主体绑定到操作方法参数?,rest,playframework,Rest,Playframework,我了解Play如何将URI段或参数绑定到动作方法参数。我还了解了如何访问上传的文件 但我仍在寻找将PUT或POST请求的请求实体绑定到方法参数的方法 假设请求是这样的 PUT /blog/entries/67 Content-Type: application/atom+xml <entry>...</entry> 两个问题: 这样行吗 在哪里可以找到有关如何创建反序列化程序的文档?请查看Play站点上的自定义绑定文档 我认为您需要的是play.data.bind

我了解Play如何将URI段或参数绑定到动作方法参数。我还了解了如何访问上传的文件

但我仍在寻找将PUT或POST请求的请求实体绑定到方法参数的方法

假设请求是这样的

PUT /blog/entries/67

Content-Type: application/atom+xml

<entry>...</entry>
两个问题:

这样行吗


在哪里可以找到有关如何创建反序列化程序的文档?

请查看Play站点上的自定义绑定文档

我认为您需要的是
play.data.binding.TypeBinder
,它允许您自定义play绑定控制器中某些对象的方式

更新:

查看播放组,Guillaume在文章正文中发布了以下处理JSON的代码,因此可以很容易地将其修改为从atom+XML输入中获取XML。它使用BinderPlugin,而不是TypeBinder,它允许您执行更多更好的绑定操作

package plugins;

import play.*;
import play.mvc.*;

import com.google.gson.*;

import java.util.*;
import java.lang.reflect.*;
import java.lang.annotation.*;

public class BinderPlugin extends PlayPlugin {

    public Object bind(String name, Class clazz, Type type, Annotation[] annotations, Map<String, String[]> params) {
        if(Http.Request.current().contentType.equals("application/json")) {
            JsonObject json = new JsonParser().parse(Scope.Params.current().get("body")).getAsJsonObject();
            if(clazz.equals(String.class)) {
                return json.getAsJsonPrimitive(name).getAsString();
            }
        }
        return null;
    }

}
封装插件;
输入播放*;
导入play.mvc.*;
导入com.google.gson.*;
导入java.util.*;
导入java.lang.reflect.*;
导入java.lang.annotation.*;
公共类BinderPlugin扩展了PlayPlugin{
公共对象绑定(字符串名称、类类别、类型、注释[]注释、映射参数){
if(Http.Request.current().contentType.equals(“应用程序/json”)){
JsonObject json=new JsonParser().parse(Scope.Params.current().get(“body”)).getAsJsonObject();
if(clazz.equals(String.class)){
返回json.getAsJsonPrimitive(name.getAsString();
}
}
返回null;
}
}

我昨天看到了这一点,但我不知道这将如何使我能够将例如application/atom+xml转换为一个对象并将其绑定到一个参数。也许我错过了什么。您能解释一下吗?谢谢-您能解释一下我是如何连接它的,以便将返回的对象作为参数传递给action方法的吗?如何将参数名称绑定到内容?那么,Play如何知道参数/AtomEntry entry/是反序列化体注入的目标呢?Play在尝试运行自己的绑定代码之前会调用上面的代码。因此,如果您查看上面的代码,它首先检查它是否是
application/json
,如果是,然后检查要绑定到控制器中的对象是否是
字符串。如果这两个都为真,则返回一个JSON表示。因此,您可以检查它的类型是
application/atom+xml
,然后检查类是
Entry
。如果两者都为真,则可以将XML序列化到
条目
对象。这件事你必须自己去做,因为这是一个定制的活页夹,所以没有玩魔术的功能。还没弄明白,但听起来我会的。谢谢。
package plugins;

import play.*;
import play.mvc.*;

import com.google.gson.*;

import java.util.*;
import java.lang.reflect.*;
import java.lang.annotation.*;

public class BinderPlugin extends PlayPlugin {

    public Object bind(String name, Class clazz, Type type, Annotation[] annotations, Map<String, String[]> params) {
        if(Http.Request.current().contentType.equals("application/json")) {
            JsonObject json = new JsonParser().parse(Scope.Params.current().get("body")).getAsJsonObject();
            if(clazz.equals(String.class)) {
                return json.getAsJsonPrimitive(name).getAsString();
            }
        }
        return null;
    }

}