Запрос PUT дает 400 Bad Request Error

Я реализую приложение Contact, используя Google Contact API. Теперь я пытаюсь обновить контакт, отправив запрос на размещение в следующем формате

PUT /m8/feeds/contacts/default/full/{contactId}
If-Match: {lastKnownEtag}
GData-Version: 3.0
Content-Type: application/atom+xml

И у меня есть XML в виде строки, которую я собираюсь отправить в качестве тела запроса. Это моя xmlString (Тело запроса)

<?xml version="1.0" encoding="UTF-8"?>
<entry xmlns:gd="http://schemas.google.com/g/2005" gd:etag="*">
<id>http://www.google.com/m8/feeds/contacts/default/base/1785xxxx</id>
<catagory scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/contact/2008#contact"/>
<gd:name>
<gd:fullname>abc</gd:fullname></gd:name>
<gd:email address="[email protected]" displayName="abc" primary="true" rel="http://schemas.google.com/g/2005#work"/>
<content type="text">Notes</content>
<gd:phoneNumber primary="true" rel="http://schemas.google.com/g/2005#other">9090xxxxxx</gd:phoneNumber>
</entry>

Я написал приведенный ниже код для отправки запроса PUT на обновление контакта.

    String getUrl = "https://www.google.com/m8/feeds/contacts/default/full/"+contactID+"?oauth_token=" + accessToken;         
    URL url = new URL(getUrl);
    HttpURLConnection con = (HttpURLConnection) url.openConnection();        
    con.setDoOutput(true);          
    con.setRequestMethod("PUT");
    con.setRequestProperty("Content-Type", "application/atom+xml" );
    con.setRequestProperty("GData-Version","3.0"); 
    con.setRequestProperty("IF-MATCH", "*");
    OutputStreamWriter output = new OutputStreamWriter(con.getOutputStream());      
    output.write(xmlString);   
    // xmlString is the body of the request
    output.flush();
    output.close();
    System.out.println(con.getResponseCode());

Когда я попытался отправить запрос в OAuth 2.0 Playground, контакт успешно обновился. Но когда я пытаюсь запустить указанную выше программу, я получаю

400 Ошибка неверного запроса

Я не знаю, где я ошибаюсь. Любая помощь будет оценена по достоинству!


person Santhosh    schedule 19.06.2018    source источник
comment
ну какая просьба. Пожалуйста, используйте прокси или около того, чтобы показать, что это такое. Бьюсь об заклад, xmlString пуст или недействителен или около того   -  person Daij-Djan    schedule 19.06.2018
comment
@Daij-Djan Я попытался отправить ту же строку xmlString в Google Playground и получил ответ 200 OK. Так что в xmlString нет проблем.   -  person Santhosh    schedule 19.06.2018
comment
@Daij-Djan Я также добавил свой xmlString. Пожалуйста, сообщите мне, если моя строка недействительна.   -  person Santhosh    schedule 19.06.2018
comment
Где тело запроса?   -  person noogui    schedule 20.06.2018
comment
@noogui xmlString — это тело запроса. Я упомянул об этом в посте и также дал xmlString.   -  person Santhosh    schedule 20.06.2018
comment
Я не знаком с этим API, но нужен ли Google токен oauth2 в качестве параметра запроса? Другие API, которые я использовал, ожидают токен носителя в заголовке запроса.   -  person David Conrad    schedule 21.06.2018
comment
Кроме того, это If-Match, а не IF-MATCH.   -  person David Conrad    schedule 21.06.2018
comment
Спасибо за ответ. Я нашел, где я не прав. Для моего xmlString требуется другое пространство имен, которого нет в Google Contact API.   -  person Santhosh    schedule 21.06.2018


Ответы (1)


Наконец-то я нашел, где я ошибаюсь.

Моя xmlString недействительна. <entry> требуется другое пространство имен xmlns="http://www.w3.org/2005/Atom", которое не упоминается в https://developers.google.com/contacts/v3 (API контактов Google). Вот почему я получил ошибку 400 Bad request.

Действительная xmlString

<?xml version="1.0" encoding="UTF-8"?>
<entry xmlns:gd="http://schemas.google.com/g/2005" gd:etag="*" xmlns="http://www.w3.org/2005/Atom">
    <id>http://www.google.com/m8/feeds/contacts/default/base/1785xxxx </id>
    <category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/contact/2008#contact" />
    <gd:name>
        <gd:fullName>name</gd:fullName>
    </gd:name>
    <gd:email address="[email protected]" displayName="juli" primary="true" rel="http://schemas.google.com/g/2005#work" />
    <content type="text">Notes</content>
    <gd:phoneNumber primary="true" rel="http://schemas.google.com/g/2005#other">9090xxxxxx</gd:phoneNumber>
</entry>
person Santhosh    schedule 21.06.2018