【问题标题】:POST body parameter objectPOST 正文参数对象
【发布时间】:2015-12-09 05:47:48
【问题描述】:

不太清楚标题的措辞,但有没有更简单的方法可以使用 Retrofit 将数据发布到 WCF 服务?目前我正在使用@Body 属性和类似的东西。服务需要 json:

这就是我要发送的内容

public class Photo
{
    private String imageData;
    private String latitude;
    private String longitude;

    public Photo(String imageData, String latitude, String longitude)
    {
        this.imageData = imageData;
        this.latitude = latitude;
        this.longitude = longitude;
    }

    public String getImageData()
    {
        return imageData;
    }

    public void setImageData(String imageData)
    {
        this.imageData = imageData;
    }

    public String getLatitude()
    {
        return latitude;
    }

    public void setLatitude(String latitude)
    {
        this.latitude = latitude;
    }

    public String getLongitude()
    {
        return longitude;
    }

    public void setLongitude(String longitude)
    {
        this.longitude = longitude;
    }
}

有了这个:

@POST("/PhotoService.svc/addPhoto")
    void addPhoto(@Body Photo photo, Callback<String> cb);

然后我这样称呼它:

IPhotoService photoService = restAdapter.create(IPhotoService.class);
            photoService .addPhoto(new Photo(photoSerialised, String.valueOf(location.getLatitude()), String.valueOf(location.getLongitude())), new Callback<String>()

这一切都很好,但我有多个带有各种参数的服务端点。我需要为每个“身体”创建一个模型还是有更简单的方法。类似于执行 GET?

我曾尝试在有多个参数的情况下使用@Field,但在我的 WCF 端,我的参数是 null。简单地发送一个带有 @Body 属性的类就可以了,但是我不想为每个可用的 Service 端点创建一个模型类,还是没有其他方法?

【问题讨论】:

    标签: android wcf retrofit


    【解决方案1】:

    POST 请求中的参数有两种方式

    首先可以使用@FieldMap,查看链接Retrofit Javadoc,服务必须使用带@FormUrlEncoded注解

    其次,其实你可以使用MultipartTypedOutput将参数放入@BodyExample of putting parameter into body,但是MultipartTypedOutput在Retrofit 2.0中不再存在。 0-beta1

    所以如果你想上传图片和其他参数,也许你可以这样做

    @POST("/PhotoService.svc/addPhoto")
    void addPhoto(@Body Photo photo,@FieldMap Map<String, String> fields, Callback<String> cb);
    
    //Example
    Map<String,String> fields = new HashMap<String,String>();
    fields.put("params1","value of params");
    fields.put("params2","value of params 2");
    
    Photo photo = new Photo(photoSerialised, String.valueOf(location.getLatitude()), String.valueOf(location.getLongitude()));
    
    photoService .addPhoto(photo,fields,new Callback<String>()
    

    更新

    顺便说一句,您实际上可以通过 @Part@PartMap 使用 Multipart 请求,请在 Retrofit javadoc 中找到它,有一个示例

    【讨论】:

    • 我的 Web 服务出现 HTTP 500 错误,但通过 Fiddler 对其进行测试工作正常。知道我需要检查什么吗?
    • 您的服务器是否已启动并正在运行?
    • 为什么是的,是的。我认为 WCF 正在获取数据,但不知道如何处理它。如何检查 WCF 收到的内容?
    • 也许你必须检查你的服务器端,因为它显示内部服务器错误,即状态码 500。你可以记录传递给服务器的数据,我不熟悉 c#,所以我不能 gv你是一个例子,但在 PHP 中是这样的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    相关资源
    最近更新 更多