retrofit2发送PUT请求方法对于PHP

时间:2016-07-09 17:01:12

标签: php android put retrofit2 http-put

我正在尝试从我的Android应用程序向我的PHP端点发送PUT请求方法,但在我的端点中,PUT请求未被识别为PUT请求,因此我返回请求方法错误!消息来自我的终点。

Android界面和请求执行

激活界面

@PUT("device/activate.php")
Call<DeviceRegistry> registryDevice();

执行请求

DeviceRegistryAPI registryAPI =
            RetrofitController.getRetrofit().create(DeviceRegistryAPI.class);

Call<DeviceRegistry> registryCallback = registryAPI.registryDevice();

response = registryCallback.execute();

有了这个,我期待一个响应,但我收到了我的端点错误消息。

我的PHP端点

if($_SERVER['REQUEST_METHOD'] == "PUT"){
   //doing something with the data
} else {
    $data = array("result" => 0, "message" => "Request method is wrong!");
}

我不知道为什么$_SERVER['REQUEST_METHOD'] == "PUT"是假的,但我想知道我是否遗漏了Retrofit 2上的内容。

更多信息。

我正在使用Retrofit2。

更新1:将json发送到正文

我正在尝试使用正文发送一个json。

这是我的json:

{
    "number": 1,
    "infoList": [
        {
            "id": 1,
            "info": "something"
        },
        {
            "id": 2,
            "info": "something"
        }   
    ]
}

有我的课程:

class DataInfo{

    public int number;  
    public List<Info> infoList;

    public DataInfo(int number, List<Info> list){
        this.number = number;
        this.infoList = list;
    }
}


class Info{
    public int id;
    public String info;
}

我将PUT接口更改为:

@PUT("device/activate.php")
Call<DeviceRegistry> registryDevice(@Body DataInfo info);

但我遇到了同样的问题。

更新2:我是否需要标题

我在REstfull客户端中有这个标题:

Accept: application/json
Content-Type: application/x-www-form-urlencoded

我是否需要将其置于我的请求配置中?如果需要,我该怎么做?

更新3:检查我的发送帖子的请求类型。

现在我正在检查请求的类型。因为我对PUT / POST请求有同样的问题。所以如果能解决问题,可能会解决所有问题。

当我执行请求并询问并检查请求时,它正在发送类型(PUT / POST),但在服务器php中只检测或GET? (以下示例使用 POST ,行为相同)

Call<UpdateResponse> requestCall = client.updateMedia(downloadItemList);
Log.i("CCC", requestCall .request().toString());

输出是POST:

Request{method=POST, url=http://myserver/api/v1/media/updateMedia.php, tag=null}

所以我发送一个POST(无论我是否发送PUT)请求到服务器,但为什么在服务器中我收到GET。我被锁了!!!我不知道问题出在哪里。

更新4:godaddy主持。

我在godaddy上托管我的php服务器。这有什么问题吗?我创建了一个本地主机,一切都运行良好,但相同的代码不适用于godaddy。我做了一些研究,但我没有找到任何关于这个问题的好答案,所以有可能godaddy托管是问题吗?

4 个答案:

答案 0 :(得分:2)

除了GET和POST之外,PHP并不识别任何其他内容。服务器应该向你抛出一些像空请求那样的错误。

To access PUT和其他请求使用

$putfp = fopen('php://input', 'r'); //will be a JSON string (provided everything got sent)
$putdata = '';
while($data = fread($putfp, filesize('php://input')))
    $putdata .= $data;
fclose($putfp);
//php-like variable, if you want
$_PUT = json_decode($putdata);

未经测试,但应该有效。

答案 1 :(得分:1)

我想问题是你没有传递任何数据和PUT请求,这就是PHP将请求识别为GET的原因。所以我认为您只需要尝试使用@FormUrlEncoded@Multipart或可能@Body注释传递一些数据

答案 2 :(得分:1)

要在retrofit2中添加标题,您应该创建一个拦截器:

$(document).ready(function(){});

并将其添加到客户端构建器:

        Interceptor interceptor = new Interceptor() {
            @Override
            public okhttp3.Response intercept(Interceptor.Chain chain) throws IOException
            {
                okhttp3.Request.Builder ongoing = chain.request().newBuilder();
                ongoing.addHeader("Content-Type", "application/x-www-form-urlencoded");
                ongoing.addHeader("Accept", "application/json");

                return chain.proceed(ongoing.build());
            }
        };

答案 3 :(得分:1)

  1. PHP识别'PUT'调用。摘自PHP.net
  2.   

    'REQUEST_METHOD'使用哪种请求方法来访问页面;   即'GET','HEAD','POST','PUT'。

    1. 如果您的服务器不期望任何标头,则无需发送任何标头 报头中。
    2. 在使用Retrofit或任何其他网络库之前,您应该使用请求http构建器检查端点,例如PostmanAdvanced Rest Client。要在运行应用程序或单元测试时调试请求/响应,请使用Charles之类的代理,它将帮助您了解您的请求/响应的真实外观。