2016-06-22 2 views
0

Я строю u2f-совместимый клиент, который просто необходимо отправить объект JSON со следующей структурой к URL POST:дооснащения не прикрепление тело просить

{ 
    challenge: [Base64-encoded String of 32 bytes], 
    registrationData: [Base64-encoded String of variable bytes] 
} 

Вот выдержка из моего кода, который работает нормально и не приводит к возникновению ошибки:

import okhttp3.FormBody; 
import okhttp3.RequestBody; 
import okhttp3.ResponseBody; 
import retrofit2.Call; 
import retrofit2.Callback; 
import retrofit2.Response; 
import retrofit2.Retrofit; 

public interface Registration { 
    @POST("register") 
    Call<ResponseBody> register(@Body RequestBody body); 
} 

private void sendRegistrationResponse(String baseURL, String challenge, String data) { 
    RequestBody data = new FormBody.Builder() 
        .add("challenge", challengeB64) 
        .add("registrationData", data) 
        .build(); 

    Retrofit retro = new Retrofit.Builder() 
        .baseUrl(info.getString("baseURL")) 
        .build(); 

    U2FServices.Registration reg = retro.create(U2FServices.Registration.class); 
    Call<ResponseBody> regCall = reg.register(data); 
    regCall.enqueue(this); 
} 

сервер отладки построен с узлом, и его POST «зарегистрировать» маршрут успешно вызывается клиентом каждый раз. Проблема заключается в том, что тело запроса всегда пустое.

exports.register = function (req, res) { 
    var body = req.body; // {} 
} 

Я представляю себе этот вопрос лежит на FormBody.Builder(), но я не могу найти какую-либо документацию или код дает ясный пример того, как это работает. Любая помощь очень ценится!

+0

2 вопроса. Ожидает ли ваш узел сервера «application/x-www-form-urlencoded»? Любая причина, по которой вы хотите использовать RequestBody вместо конвертера? Также вы можете добавить тег «retrofit2», как это делается для Retrofit2. – Emma

+0

@ Emma Я просто не вижу смысла использовать конвертер. Все, что мне нужно сделать, это отправить простой JSON со свойствами «challenge» и «registrationData». Кроме того, я не указывал никаких настроек для POST на сервере. Я на самом деле новичок в веб-программировании и не знаком с заголовками и т. Д. Мне сказали, что по умолчанию запрос будет считан как октет-кодированный и должен работать, если я отправлю Java-строку на сервер. –

+0

Я вижу. Это справедливо, чтобы не использовать конвертер. – Emma

ответ

1

Давайте попробуем это - (надеюсь, что ваш сервер узла ожидает приложение/json), или нам нужно изменить эту часть.

RequestBody data = RequestBody.create(MediaType.parse("application/json"), stringJson); 

По-видимому, тип носителя по умолчанию FormBody является «применение/х-WWW-форм-urlencoded», и если ваш сервер узла не ожидает этот тип запроса, он может потерпеть неудачу.

Если вы можете найти конфигурацию своего узла, хорошо проверить его, чтобы убедиться, какой тип носителя должен обрабатывать запрос.

Это пример узла с конфигурацией экспресс-сервера.

app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: false })); 

Этот сервер узлов может ожидать кодировку json и form url.

Дайте мне знать, если это работает или нет.

+0

Понял, что мой Mac по какой-то причине блокирует порт сервера, даже несмотря на то, что брандмауэр даже не включен, и раньше он не блокировал. Не удастся проверить, помогают ли функции синтаксического анализа тела, пока я не исправлю это, поэтому может быть небольшая задержка в отладке. Спасибо, хотя. –

+0

Я исправил свои другие проблемы и опробовал ваше решение. Приложение прекрасно взаимодействует с сервером. Благодаря! –

 Смежные вопросы

  • Нет связанных вопросов^_^