对于PHP,发送PUT请求方法是错误的

对于PHP,发送PUT请求方法是错误的,php,android,put,retrofit2,http-put,Php,Android,Put,Retrofit2,Http Put,我正试图将一个PUT请求方法从我的Android应用程序发送到我的PHP端点,但在我的端点中,PUT请求未被识别为PUT请求,因此我返回请求方法错误来自我的端点的消息 Android接口与请求执行 激活接口 我不知道为什么$\u服务器['REQUEST\u METHOD']==“PUT”是错误的,但是我想知道我是否在改型2上遗漏了什么 更多信息。 我用的是改型2 更新1:将json发送到正文中 我正在尝试使用主体发送json 这是我的json: { "number": 1,

我正试图将一个PUT请求方法从我的Android应用程序发送到我的PHP端点,但在我的端点中,PUT请求未被识别为PUT请求,因此我返回请求方法错误来自我的端点的消息

Android接口与请求执行 激活接口 我不知道为什么
$\u服务器['REQUEST\u METHOD']==“PUT”
是错误的,但是我想知道我是否在改型2上遗漏了什么


更多信息。 我用的是改型2


更新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;
}
我是否需要在我的请求配置中设置此选项?如果我需要它,我该怎么做

更新3:检查发送邮件的请求类型。 现在我正在检查请求的类型。因为我对PUT/POST请求也有同样的问题。因此,如果能用put解决问题,也许所有的问题都会解决

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

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

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

我想问题在于你没有在
PUT
请求中传递任何数据,这就是为什么PHP将请求识别为
GET
。因此,我认为您只需要尝试使用
@FormUrlEncoded
@Multipart
@Body
注释传递一些数据

PHP除了GET和POST之外不识别任何东西。服务器应该向您抛出一些错误,比如空请求

和其他请求使用

$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);

未测试,但应能正常工作。

要在改型2中添加标题,应创建拦截器:

        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());
            }
        };
并将其添加到客户端生成器中:

        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        builder.interceptors().add(interceptor);
  • PHP识别“PUT”调用。摘自:
  • “REQUEST_METHOD”用于访问页面的请求方法; i、 e.“获取”、“头”、“柱”、“放置”

  • 如果服务器不需要任何头,则不需要发送任何头 标题

  • 在使用改型或任何其他网络库之前,应该使用请求http生成器(如或)检查端点。要在运行应用程序或单元测试时调试请求/响应,请使用类似的代理,这将有助于您观察请求/响应的真实外观

    $\u服务器['REQUEST\u METHOD']
    返回到客户端,查看请求是什么method@shayanpourvatan我这样做了,但是服务器返回GET,我不知道为什么?我更改了请求,但问题是相同的。我不知道我做错了什么。嗯。。。我不是PHP方面的专家,但它会导致方法类型使用双引号而不是单引号的问题吗?我的意思是,也许您应该将条件更改为以下内容:
    $\u服务器['REQUEST\u METHOD']=='PUT'
    。我做了一个测试,将
    $\u服务器['REQUEST\u METHOD']
    的结果发送回去,其值为
    GET
    。所以我认为问题在于改型2,不是改型2而是我的配置。我不知道是否需要发送或配置其他内容。我被锁定在这里。也许你在将你的Android代码更改为最新版本之前做了那个测试,它在
    PUT
    request中传递了一些数据?你有没有任何代码可以使用改型2并发送PUT/POST请求?我很确定我在请求配置中做错了什么或遗漏了什么,但我不知道是什么。我一直在寻找。
    @PUT("device/activate.php")
    Call<DeviceRegistry> registryDevice(@Body DataInfo info);
    
    Accept: application/json
    Content-Type: application/x-www-form-urlencoded
    
    Call<UpdateResponse> requestCall = client.updateMedia(downloadItemList);
    Log.i("CCC", requestCall .request().toString());
    
    Request{method=POST, url=http://myserver/api/v1/media/updateMedia.php, tag=null}
    
    $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);
    
            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());
                }
            };
    
            OkHttpClient.Builder builder = new OkHttpClient.Builder();
            builder.interceptors().add(interceptor);