如何将请求体绑定到动作方法参数?

时间:2011-10-05 06:14:34

标签: rest playframework

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

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

假设请求类似于

PUT /blog/entries/67

Content-Type: application/atom+xml

<entry>...</entry>

我想将它绑定到一个入口参数:

public static void (String entryId, Entry entry) {
    // entryId being 67
    // entry being the deserialized Atom payload (e.g. using Apache Abdera parser)

   backend.updateEntry(67,entry);

   // AtomPub's 'canonical' response is the updated entry.
   render(entry) 

}

两个问题:

这样的事情有用吗?

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

1 个答案:

答案 0 :(得分:1)

查看Play网站上的自定义绑定文档。

http://www.playframework.org/documentation/1.2.3/controllers#custombinding

我认为您正在寻找的是play.data.binding.TypeBinder,它允许您自定义Play绑定控制器中某些对象的方式。

<强>更新

查看游戏组,Guillaume发布了以下用于在POST主体中处理JSON的代码,因此可以轻松地对其进行调整以从atom + xml输入中获取XML。它使用BinderPlugin而不是TypeBinder,它允许您进行更多pwerful绑定操作。

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;
    }

}